import { AllActions } from './enum'; import { MongoConnector } from './mongodb'; import DiffStore from './store/store'; import { WebsocketServer } from './websockets'; import { AddPayload, ClientMessage, DeletePayload, ItemPayload, UpdatePayload } from './websockets/interfaces'; const store = DiffStore; export class MongoRX { private _socket: WebsocketServer; private _db: MongoConnector; private _middleware: { [AllActions.Add]: { [action: string]: (item: ItemPayload) => ItemPayload }; [AllActions.Update]: { [action: string]: (item: ItemPayload) => ItemPayload }; [AllActions.Delete]: { [action: string]: (item_id: string) => string }; }; constructor() { this._socket = new WebsocketServer(); this._db = new MongoConnector(); this._middleware = { [AllActions.Add]: {}, [AllActions.Update]: {}, [AllActions.Delete]: {}, }; this._listen_messages(this._socket); } item_added_middleware(bucket_id: string, middleware: (item: ItemPayload) => ItemPayload) { this._middleware[AllActions.Add][bucket_id] = middleware; } item_updated_middleware(bucket_id: string, middleware: (item: ItemPayload) => ItemPayload) { this._middleware[AllActions.Update][bucket_id] = middleware; } item_deleted_middleware(bucket_id: string, middleware: (item_id: string) => string) { this._middleware[AllActions.Delete][bucket_id] = middleware; } private _run_middleware(data: ClientMessage): ClientMessage['payload'] { // if (this._middleware[data.msg][data.bucket]) { // } return data.payload; } private _listen_messages(ws: WebsocketServer) { ws.messages.add.subscribe(msg => this._on_add(msg)); ws.messages.update.subscribe(msg => this._on_update(msg)); ws.messages.delete.subscribe(msg => this._on_delete(msg)); } private _on_add(msg: ClientMessage) { const new_payload = this._run_middleware(msg); this._db.add(msg.bucket, new_payload); this._socket.broadcast({ msg: AllActions.Added, payload: new_payload, bucket: msg.bucket, }); } private _on_update(msg: ClientMessage) { const new_payload = this._run_middleware(msg); this._db.update(msg.bucket, new_payload); this._socket.broadcast({ msg: AllActions.Updated, payload: new_payload, bucket: msg.bucket, }); } private _on_delete(msg: ClientMessage) { const new_payload = this._run_middleware(msg); this._db.delete(msg.bucket, new_payload); this._socket.broadcast({ msg: AllActions.Deleted, payload: new_payload, bucket: msg.bucket, }); } // private _fix_payload(data: ClientMessage): ClientMessage['payload'] { // if (data.msg === AllActions.Add) { // return ensure_ids((data as ClientMessage).payload.items); // } // } }