Websocket Support (#937)

* Atom / RSS meta link

* Spike

* Feeling good about this spike now

* Remove document.collection

* Remove koa.ctx from all presenters to make them portable outside requests

* Remove full serialized model from events
Move events.add to controllers for now, will eventually be in commands

* collections.create event
parentDocument -> parentDocumentId

* Fix up deprecated tests

* Fixed: Doc creation

* documents.move

* Handle collection deleted

* 💚

* Authorize room join requests

* Move starred data structure
Account for documents with no context on sockets

* Add socket.io-redis

* Add WEBSOCKETS_ENABLED env variable to disable websockets entirely for self hosted
New installations will default to true, existing installations to false

* 💚 No need for promise response here

* Reload notice
This commit is contained in:
Tom Moor
2019-04-17 19:11:23 -07:00
committed by GitHub
parent 4a571a088e
commit 07a941a65d
93 changed files with 2441 additions and 744 deletions

View File

@@ -4,7 +4,6 @@ import slug from 'slug';
import randomstring from 'randomstring';
import { DataTypes, sequelize } from '../sequelize';
import { asyncLock } from '../redis';
import events from '../events';
import Document from './Document';
import CollectionUser from './CollectionUser';
import { welcomeMessage } from '../utils/onboarding';
@@ -119,18 +118,6 @@ Collection.addHook('afterDestroy', async (model: Collection) => {
});
});
Collection.addHook('afterCreate', (model: Collection) =>
events.add({ name: 'collections.create', model })
);
Collection.addHook('afterDestroy', (model: Collection) =>
events.add({ name: 'collections.delete', model })
);
Collection.addHook('afterUpdate', (model: Collection) =>
events.add({ name: 'collections.update', model })
);
Collection.addHook('afterCreate', (model: Collection, options) => {
if (model.private) {
return CollectionUser.findOrCreate({

View File

@@ -10,7 +10,6 @@ import removeMarkdown from '@tommoor/remove-markdown';
import isUUID from 'validator/lib/isUUID';
import { Collection, User } from '../models';
import { DataTypes, sequelize } from '../sequelize';
import events from '../events';
import parseTitle from '../../shared/utils/parseTitle';
import unescape from '../../shared/utils/unescape';
import Revision from './Revision';
@@ -289,14 +288,9 @@ Document.addHook('afterCreate', async model => {
await collection.addDocumentToStructure(model);
model.collection = collection;
events.add({ name: 'documents.create', model });
return model;
});
Document.addHook('afterDestroy', model =>
events.add({ name: 'documents.delete', model })
);
// Instance methods
// Note: This method marks the document and it's children as deleted
@@ -353,7 +347,6 @@ Document.prototype.publish = async function() {
await this.save();
this.collection = collection;
events.add({ name: 'documents.publish', model: this });
return this;
};
@@ -367,7 +360,6 @@ Document.prototype.archive = async function(userId) {
await this.archiveWithChildren(userId);
events.add({ name: 'documents.archive', model: this });
return this;
};
@@ -397,7 +389,6 @@ Document.prototype.unarchive = async function(userId) {
this.lastModifiedById = userId;
await this.save();
events.add({ name: 'documents.unarchive', model: this });
return this;
};
@@ -417,7 +408,6 @@ Document.prototype.delete = function(options) {
await this.destroy({ transaction, ...options });
events.add({ name: 'documents.delete', model: this });
return this;
});
};

View File

@@ -1,6 +1,5 @@
// @flow
import { DataTypes, sequelize } from '../sequelize';
import events from '../events';
const Integration = sequelize.define('integration', {
id: {
@@ -33,16 +32,4 @@ Integration.associate = models => {
});
};
Integration.addHook('afterCreate', async model => {
events.add({ name: 'integrations.create', model });
});
Integration.addHook('afterUpdate', model =>
events.add({ name: 'integrations.update', model })
);
Integration.addHook('afterDestroy', model =>
events.add({ name: 'integrations.delete', model })
);
export default Integration;