From 7a69e7533db2fc827cb6a744153f252fa1bad5ae Mon Sep 17 00:00:00 2001 From: Steve Oney Date: Mon, 13 Aug 2018 13:53:25 -0400 Subject: [PATCH 1/5] adding sharedb types --- types/sharedb/index.d.ts | 150 +++++++++++++++++++++++++++ types/sharedb/sharedb-tests.ts | 47 +++++++++ types/sharedb/tsconfig.json | 26 +++++ types/sharedb/tslint.json | 79 ++++++++++++++ types/sharedb/websocketJSONStream.ts | 26 +++++ 5 files changed, 328 insertions(+) create mode 100644 types/sharedb/index.d.ts create mode 100644 types/sharedb/sharedb-tests.ts create mode 100644 types/sharedb/tsconfig.json create mode 100644 types/sharedb/tslint.json create mode 100644 types/sharedb/websocketJSONStream.ts diff --git a/types/sharedb/index.d.ts b/types/sharedb/index.d.ts new file mode 100644 index 0000000000..1317174866 --- /dev/null +++ b/types/sharedb/index.d.ts @@ -0,0 +1,150 @@ +// Type definitions for sharedb v1.0.0-beta.10 +// Project: https://github.com/share/sharedb +// Definitions by: Steve Oney +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +declare namespace ShareDB { + type DocumentID = string; + type Path = ReadonlyArray + type Snapshot = number; + + interface AddNumOp { p:Path, na:number } + + interface ListInsertOp { p:Path, li:any } + interface ListDeleteOp { p:Path, ld:any } + interface ListReplaceOp { p:Path, li:any, ld:any } + interface ListMoveOp { p:Path, lm:any } + + interface ObjectInsertOp { p:Path, oi:any } + interface ObjectDeleteOp { p:Path, od:any } + interface ObjectReplaceOp { p:Path, oi:any, od:any } + + interface StringInsertOp { p:Path, si:string } + interface StringDeleteOp { p:Path, sd:string } + + interface SubtypeOp { p:Path, t:string, o:any } + + type Op = AddNumOp | ListInsertOp | ListDeleteOp | ListReplaceOp | ListMoveOp | ObjectInsertOp | ObjectDeleteOp | ObjectReplaceOp | StringInsertOp | StringDeleteOp | SubtypeOp; + + interface RawOp { + src:string, + seq:number, + v:number, + op:Array, + m:any, + c:string, + d:string + } + type OTType = 'ot-text' | 'ot-json0' | 'ot-text-tp2' | 'rich-text'; + type Action = 'connect'|'op'|'doc'|'query'|'submit'|'apply'|'commit'|'after submit'|'receive'; + interface Error { + code:number, + message:string + } + interface ShareDBSourceOptions { source?:boolean } + interface ShareDBCreateOptions extends ShareDBSourceOptions{} + interface ShareDBDelOptions extends ShareDBSourceOptions{} + interface ShareDBSubmitOpOptions extends ShareDBSourceOptions{} + + type Callback = (err:ShareDB.Error)=>any; + + export class Doc { + type:string; + id:DocumentID; + data:any; + fetch:(callback:(err:ShareDB.Error)=>void) => void; + subscribe:(callback:(err:ShareDB.Error)=>void) => void + on:(event:'load'|'create'|'before op'|'op'|'del'|'error', callback:(...args:Array)=>any)=>void; + ingestSnapshot:(snapshot:Snapshot, callback: Callback)=>void; + destroy:()=>void; + create(data:any, callback?:Callback): void; + create(data:any, type?:OTType, callback?:Callback):void; + create(data:any, type?:OTType, options?:ShareDBCreateOptions, callback?:Callback):void; + submitOp:(data:ReadonlyArray, options?:ShareDBSubmitOpOptions, callback?:Callback)=>void; + del:(options:ShareDBDelOptions, callback:(err:ShareDB.Error)=>void)=>void + removeListener:(eventName:string, listener:Function)=>void + } + + class Query { + ready:boolean; + results:Array; + extra:any; + on:(event:'ready'|'error'|'changed'|'insert'|'move'|'remove'|'extra', callback:(...args:Array)=>any)=>any; + destroy:()=>void; + } +} + +declare module 'sharedb/lib/client' { + export type Doc = ShareDB.Doc; + export type Op = ShareDB.Op; + export type Action = ShareDB.Action; + export class Connection { + constructor(ws:WebSocket); + public get(collectionName:string, documentID:ShareDB.DocumentID):ShareDB.Doc + public createFetchQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query + public createSubscribeQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query + } +} + +declare module 'sharedb' { + class ShareDBServer { + constructor(options?:{db?:ShareDBServer.DB, pubsub?:ShareDBServer.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); + public connect:()=>ShareDBServer.Connection; + public addProjection(name:string, collection:string, fields:{}):any; + public listen(stream:any):void; + public close(callback?:(err:ShareDBServer.Error)=>any):void; + public use(action:ShareDB.Action, fn:ShareDBServer.UseCallback); + public types:{ + register:Function + }; + } + namespace ShareDBServer { + type UseCallback = ((request:{action:ShareDB.Action,agent:any,req:any,collection:string,id:string,query:any,op:ShareDB.RawOp}, callback:Function)=>void); + interface Error { + code:number, + message:string + } + + interface DB { } + + class MemoryDB implements DB { } + export interface IPubSubOptions { + prefix?: string; + } + export interface IStream { + id: string; + } + export abstract class PubSub { + private static shallowCopy(obj: any); + protected prefix?: string; + protected nextStreamId: number; + protected streamsCount: number; + protected streams: { + [channel: string]: IStream; + }; + protected subscribed: { + [channel: string]: boolean; + }; + protected constructor(options?: IPubSubOptions); + close(callback?: (err:Error|null) => void): void; + publish(channels: string[], data: {[k: string]: any}, callback: (err: Error | null) => void): void; + subscribe(channel: string, callback: (err: Error | null, stream?: IStream) => void): void; + protected abstract _subscribe(channel: string, callback: (err: Error | null) => void): void; + protected abstract _unsubscribe(channel: string, callback: (err: Error | null) => void): void; + protected abstract _publish(channels: string[], data: Object, callback: (err: Error | null) => void): void; + protected _emit(channel: string, data: {[k: string]: any}): void; + private _createStream(channel); + private _removeStream(channel, stream); + } + type Doc = ShareDB.Doc; + type Op = ShareDB.Op; + type Action = ShareDB.Action; + class Connection { + constructor(ws:WebSocket); + public get(collectionName:string, documentID:ShareDB.DocumentID):ShareDB.Doc + public createFetchQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query + public createSubscribeQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query + } + } + export = ShareDBServer; +} \ No newline at end of file diff --git a/types/sharedb/sharedb-tests.ts b/types/sharedb/sharedb-tests.ts new file mode 100644 index 0000000000..b156b60965 --- /dev/null +++ b/types/sharedb/sharedb-tests.ts @@ -0,0 +1,47 @@ +/// +import * as ShareDB from 'sharedb'; +import * as http from 'http'; +import * as WebSocket from 'ws'; +import { WebSocketJSONStream } from './websocketJSONStream'; + +const backend = new ShareDB(); +const connection = backend.connect(); +const doc = connection.get('examples', 'counter'); + +doc.fetch((err) => { + if(err) { throw err; } + if(doc.type === null) { + doc.create({numClicks:0}, startServer); + } else { + startServer(); + } +}); + +function startServer() { + var server = http.createServer(); + + // Connect any incoming WebSocket connection to ShareDB + var wss = new WebSocket.Server({server: server}); + wss.on('connection', function(ws, req) { + var stream = new WebSocketJSONStream(ws); + backend.listen(stream); + }); + + server.listen(8080); + // console.log('Listening on http://localhost:8080'); + startClient(() => { + server.close(); + wss.close(); + }); +} + +function startClient(callback) { + var sharedb = require('sharedb/lib/client'); + var socket = new WebSocket('ws://localhost:8080'); + var connection = new sharedb.Connection(socket); + var doc = connection.get('examples', 'counter'); + doc.subscribe(() => { + doc.submitOp([{p: ['numClicks'], na: 1}]); + callback(); + }); +} \ No newline at end of file diff --git a/types/sharedb/tsconfig.json b/types/sharedb/tsconfig.json new file mode 100644 index 0000000000..fcbe6c741a --- /dev/null +++ b/types/sharedb/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6", + "dom" + ], + "noImplicitAny": false, + "noImplicitThis": false, + "strictNullChecks": false, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "paths": { + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "sharedb-tests.ts" + ] +} \ No newline at end of file diff --git a/types/sharedb/tslint.json b/types/sharedb/tslint.json new file mode 100644 index 0000000000..b7cf998e42 --- /dev/null +++ b/types/sharedb/tslint.json @@ -0,0 +1,79 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + "adjacent-overload-signatures": false, + "array-type": false, + "arrow-return-shorthand": false, + "ban-types": false, + "callable-types": false, + "comment-format": false, + "dt-header": false, + "eofline": false, + "export-just-namespace": false, + "import-spacing": false, + "interface-name": false, + "interface-over-type-literal": false, + "jsdoc-format": false, + "max-line-length": false, + "member-access": false, + "new-parens": false, + "no-any-union": false, + "no-boolean-literal-compare": false, + "no-conditional-assignment": false, + "no-consecutive-blank-lines": false, + "no-construct": false, + "no-declare-current-package": false, + "no-duplicate-imports": false, + "no-duplicate-variable": false, + "no-empty-interface": false, + "no-for-in-array": false, + "no-inferrable-types": false, + "no-internal-module": false, + "no-irregular-whitespace": false, + "no-mergeable-namespace": false, + "no-misused-new": false, + "no-namespace": false, + "no-object-literal-type-assertion": false, + "no-padding": false, + "no-redundant-jsdoc": false, + "no-redundant-jsdoc-2": false, + "no-redundant-undefined": false, + "no-reference-import": false, + "no-relative-import-in-test": false, + "no-self-import": false, + "no-single-declare-module": false, + "no-string-throw": false, + "no-unnecessary-callback-wrapper": false, + "no-unnecessary-class": false, + "no-unnecessary-generics": false, + "no-unnecessary-qualifier": false, + "no-unnecessary-type-assertion": false, + "no-useless-files": false, + "no-var-keyword": false, + "no-var-requires": false, + "no-void-expression": false, + "no-trailing-whitespace": false, + "object-literal-key-quotes": false, + "object-literal-shorthand": false, + "one-line": false, + "one-variable-per-declaration": false, + "only-arrow-functions": false, + "prefer-conditional-expression": false, + "prefer-const": false, + "prefer-declare-function": false, + "prefer-for-of": false, + "prefer-method-signature": false, + "prefer-template": false, + "radix": false, + "semicolon": false, + "space-before-function-paren": false, + "space-within-parens": false, + "strict-export-declare-modifiers": false, + "trim-file": false, + "triple-equals": false, + "typedef-whitespace": false, + "unified-signatures": false, + "void-return": false, + "whitespace": false + } +} \ No newline at end of file diff --git a/types/sharedb/websocketJSONStream.ts b/types/sharedb/websocketJSONStream.ts new file mode 100644 index 0000000000..f21d2fa94e --- /dev/null +++ b/types/sharedb/websocketJSONStream.ts @@ -0,0 +1,26 @@ +import {Duplex} from 'stream'; +import * as WebSocket from 'ws'; + +//Adapted from https://github.com/avital/websocket-json-stream +export class WebSocketJSONStream extends Duplex { + constructor(private readonly ws:WebSocket) { + super({objectMode: true}); + this.ws.on('message', (msg: string) => { + this.push(JSON.parse(msg)) + }); + this.ws.on('close', () => { + this.push(null); // end readable stream + this.end(); // end writable stream + + this.emit('close'); + this.emit('end'); + }); + this.on('error', function() { ws.close(); }); + this.on('end', function() { ws.close(); }); + }; + public _read():void {}; + public _write(msg:any, encoding:string, next:Function):void { + this.ws.send(JSON.stringify(msg)); + next(); + }; +}; \ No newline at end of file From 3c0af23842d7c962a0dcbdc62df80d91cc4edc1c Mon Sep 17 00:00:00 2001 From: Steve Oney Date: Mon, 13 Aug 2018 14:00:37 -0400 Subject: [PATCH 2/5] rolling websocketjson stream in --- types/sharedb/sharedb-tests.ts | 26 +++++++++++++++++++++++++- types/sharedb/websocketJSONStream.ts | 26 -------------------------- 2 files changed, 25 insertions(+), 27 deletions(-) delete mode 100644 types/sharedb/websocketJSONStream.ts diff --git a/types/sharedb/sharedb-tests.ts b/types/sharedb/sharedb-tests.ts index b156b60965..bec9905050 100644 --- a/types/sharedb/sharedb-tests.ts +++ b/types/sharedb/sharedb-tests.ts @@ -2,7 +2,31 @@ import * as ShareDB from 'sharedb'; import * as http from 'http'; import * as WebSocket from 'ws'; -import { WebSocketJSONStream } from './websocketJSONStream'; +import {Duplex} from 'stream'; + +//Adapted from https://github.com/avital/websocket-json-stream +class WebSocketJSONStream extends Duplex { + constructor(private readonly ws:WebSocket) { + super({objectMode: true}); + this.ws.on('message', (msg: string) => { + this.push(JSON.parse(msg)) + }); + this.ws.on('close', () => { + this.push(null); // end readable stream + this.end(); // end writable stream + + this.emit('close'); + this.emit('end'); + }); + this.on('error', function() { ws.close(); }); + this.on('end', function() { ws.close(); }); + }; + public _read():void {}; + public _write(msg:any, encoding:string, next:Function):void { + this.ws.send(JSON.stringify(msg)); + next(); + }; +}; const backend = new ShareDB(); const connection = backend.connect(); diff --git a/types/sharedb/websocketJSONStream.ts b/types/sharedb/websocketJSONStream.ts deleted file mode 100644 index f21d2fa94e..0000000000 --- a/types/sharedb/websocketJSONStream.ts +++ /dev/null @@ -1,26 +0,0 @@ -import {Duplex} from 'stream'; -import * as WebSocket from 'ws'; - -//Adapted from https://github.com/avital/websocket-json-stream -export class WebSocketJSONStream extends Duplex { - constructor(private readonly ws:WebSocket) { - super({objectMode: true}); - this.ws.on('message', (msg: string) => { - this.push(JSON.parse(msg)) - }); - this.ws.on('close', () => { - this.push(null); // end readable stream - this.end(); // end writable stream - - this.emit('close'); - this.emit('end'); - }); - this.on('error', function() { ws.close(); }); - this.on('end', function() { ws.close(); }); - }; - public _read():void {}; - public _write(msg:any, encoding:string, next:Function):void { - this.ws.send(JSON.stringify(msg)); - next(); - }; -}; \ No newline at end of file From 753f0409996d45efe2bd28f65ef9c0595a9cfa3f Mon Sep 17 00:00:00 2001 From: Steve Oney Date: Wed, 15 Aug 2018 22:41:10 -0400 Subject: [PATCH 3/5] removing tslint disabled rules --- types/sharedb/index.d.ts | 164 ++++++++++++++++----------------- types/sharedb/sharedb-tests.ts | 50 +++++----- types/sharedb/tslint.json | 76 +-------------- 3 files changed, 108 insertions(+), 182 deletions(-) diff --git a/types/sharedb/index.d.ts b/types/sharedb/index.d.ts index 1317174866..2b5a108799 100644 --- a/types/sharedb/index.d.ts +++ b/types/sharedb/index.d.ts @@ -1,137 +1,137 @@ -// Type definitions for sharedb v1.0.0-beta.10 +// Type definitions for sharedb v1.0.0-beta.11 // Project: https://github.com/share/sharedb // Definitions by: Steve Oney // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped declare namespace ShareDB { type DocumentID = string; - type Path = ReadonlyArray + type Path = ReadonlyArray; type Snapshot = number; - interface AddNumOp { p:Path, na:number } + interface AddNumOp { p: Path, na: number; }; - interface ListInsertOp { p:Path, li:any } - interface ListDeleteOp { p:Path, ld:any } - interface ListReplaceOp { p:Path, li:any, ld:any } - interface ListMoveOp { p:Path, lm:any } + interface ListInsertOp { p: Path; li: any; }; + interface ListDeleteOp { p: Path; ld: any; }; + interface ListReplaceOp { p: Path; li: any; ld: any; }: + interface ListMoveOp { p: Path; lm: any; }: - interface ObjectInsertOp { p:Path, oi:any } - interface ObjectDeleteOp { p:Path, od:any } - interface ObjectReplaceOp { p:Path, oi:any, od:any } + interface ObjectInsertOp { p: Path; oi: any; }; + interface ObjectDeleteOp { p: Path; od: any; }; + interface ObjectReplaceOp { p: Path; oi: any; od: any; }; - interface StringInsertOp { p:Path, si:string } - interface StringDeleteOp { p:Path, sd:string } + interface StringInsertOp { p: Path; si: string; }; + interface StringDeleteOp { p: Path; sd: string; }; - interface SubtypeOp { p:Path, t:string, o:any } + interface SubtypeOp { p: Path; t: string; o: any; }; type Op = AddNumOp | ListInsertOp | ListDeleteOp | ListReplaceOp | ListMoveOp | ObjectInsertOp | ObjectDeleteOp | ObjectReplaceOp | StringInsertOp | StringDeleteOp | SubtypeOp; interface RawOp { - src:string, - seq:number, - v:number, - op:Array, - m:any, - c:string, - d:string + src: string; + seq: number; + v: number; + op: Op[]; + m: any; + c: string; + d: string; } type OTType = 'ot-text' | 'ot-json0' | 'ot-text-tp2' | 'rich-text'; type Action = 'connect'|'op'|'doc'|'query'|'submit'|'apply'|'commit'|'after submit'|'receive'; interface Error { - code:number, - message:string - } - interface ShareDBSourceOptions { source?:boolean } - interface ShareDBCreateOptions extends ShareDBSourceOptions{} - interface ShareDBDelOptions extends ShareDBSourceOptions{} - interface ShareDBSubmitOpOptions extends ShareDBSourceOptions{} + code: number; + message: string; + }; + interface ShareDBSourceOptions { source?: boolean; }; + interface ShareDBCreateOptions extends ShareDBSourceOptions {}; + interface ShareDBDelOptions extends ShareDBSourceOptions {}; + interface ShareDBSubmitOpOptions extends ShareDBSourceOptions {}; - type Callback = (err:ShareDB.Error)=>any; + type Callback = (err: ShareDB.Error) => any; - export class Doc { - type:string; - id:DocumentID; - data:any; - fetch:(callback:(err:ShareDB.Error)=>void) => void; - subscribe:(callback:(err:ShareDB.Error)=>void) => void - on:(event:'load'|'create'|'before op'|'op'|'del'|'error', callback:(...args:Array)=>any)=>void; - ingestSnapshot:(snapshot:Snapshot, callback: Callback)=>void; - destroy:()=>void; - create(data:any, callback?:Callback): void; - create(data:any, type?:OTType, callback?:Callback):void; - create(data:any, type?:OTType, options?:ShareDBCreateOptions, callback?:Callback):void; - submitOp:(data:ReadonlyArray, options?:ShareDBSubmitOpOptions, callback?:Callback)=>void; - del:(options:ShareDBDelOptions, callback:(err:ShareDB.Error)=>void)=>void - removeListener:(eventName:string, listener:Function)=>void - } + class Doc { + type: string; + id: DocumentID; + data: any; + fetch: (callback: (err: ShareDB.Error)=>void) => void; + subscribe: (callback: (err: ShareDB.Error)=>void) => void; + on: (event: 'load'|'create'|'before op'|'op'|'del'|'error', callback: (...args: Array) => any) => void; + ingestSnapshot: (snapshot: Snapshot, callback: Callback) => void; + destroy: () => void; + create(data: any, callback?: Callback): void; + create(data: any, type?: OTType, callback?: Callback): void; + create(data: any, type?: OTType, options?: ShareDBCreateOptions, callback?: Callback): void; + submitOp: (data: ReadonlyArray, options?: ShareDBSubmitOpOptions, callback?: Callback) => void; + del: (options: ShareDBDelOptions, callback: (err: ShareDB.Error) => void) => void; + removeListener: (eventName: string, listener: Function) => void; + }; class Query { - ready:boolean; - results:Array; - extra:any; - on:(event:'ready'|'error'|'changed'|'insert'|'move'|'remove'|'extra', callback:(...args:Array)=>any)=>any; - destroy:()=>void; - } + ready: boolean; + results: ShareDB.Doc[]; + extra: any; + on: (event: 'ready'|'error'|'changed'|'insert'|'move'|'remove'|'extra', callback: (...args: any[]) => any) => any; + destroy: () => void; + }; } declare module 'sharedb/lib/client' { - export type Doc = ShareDB.Doc; - export type Op = ShareDB.Op; - export type Action = ShareDB.Action; - export class Connection { - constructor(ws:WebSocket); - public get(collectionName:string, documentID:ShareDB.DocumentID):ShareDB.Doc - public createFetchQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query - public createSubscribeQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query + type Doc = ShareDB.Doc; + type Op = ShareDB.Op; + type Action = ShareDB.Action; + class Connection { + constructor(ws: WebSocket); + get(collectionName: string, documentID: ShareDB.DocumentID): ShareDB.Doc; + createFetchQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; + createSubscribeQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; } } declare module 'sharedb' { class ShareDBServer { - constructor(options?:{db?:ShareDBServer.DB, pubsub?:ShareDBServer.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); - public connect:()=>ShareDBServer.Connection; - public addProjection(name:string, collection:string, fields:{}):any; - public listen(stream:any):void; - public close(callback?:(err:ShareDBServer.Error)=>any):void; - public use(action:ShareDB.Action, fn:ShareDBServer.UseCallback); - public types:{ - register:Function + constructor(options?: {db?: ShareDBServer.DB, pubsub?: ShareDBServer.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); + connect: () => ShareDBServer.Connection; + addProjection(name: string, collection: string, fields: {}): any; + listen(stream: any): void; + close(callback?: (err: ShareDBServer.Error) => any): void; + use(action: ShareDB.Action, fn: ShareDBServer.UseCallback); + types: { + register: Function }; } namespace ShareDBServer { - type UseCallback = ((request:{action:ShareDB.Action,agent:any,req:any,collection:string,id:string,query:any,op:ShareDB.RawOp}, callback:Function)=>void); + type UseCallback = ((request: {action: ShareDB.Action,agent: any,req: any,collection: string,id: string,query: any,op: ShareDB.RawOp}, callback: Function) => void); interface Error { - code:number, - message:string + code: number; + message: string; } interface DB { } class MemoryDB implements DB { } - export interface IPubSubOptions { + interface PubSubOptions { prefix?: string; } - export interface IStream { + interface Stream { id: string; } - export abstract class PubSub { + abstract class PubSub { private static shallowCopy(obj: any); protected prefix?: string; protected nextStreamId: number; protected streamsCount: number; protected streams: { - [channel: string]: IStream; + [channel: string]: Stream; }; protected subscribed: { [channel: string]: boolean; }; - protected constructor(options?: IPubSubOptions); - close(callback?: (err:Error|null) => void): void; + protected constructor(options?: PubSubOptions); + close(callback?: (err: Error|null) => void): void; publish(channels: string[], data: {[k: string]: any}, callback: (err: Error | null) => void): void; - subscribe(channel: string, callback: (err: Error | null, stream?: IStream) => void): void; + subscribe(channel: string, callback: (err: Error | null, stream?: Stream) => void): void; protected abstract _subscribe(channel: string, callback: (err: Error | null) => void): void; protected abstract _unsubscribe(channel: string, callback: (err: Error | null) => void): void; - protected abstract _publish(channels: string[], data: Object, callback: (err: Error | null) => void): void; + protected abstract _publish(channels: string[], data: any, callback: (err: Error | null) => void): void; protected _emit(channel: string, data: {[k: string]: any}): void; private _createStream(channel); private _removeStream(channel, stream); @@ -140,11 +140,11 @@ declare module 'sharedb' { type Op = ShareDB.Op; type Action = ShareDB.Action; class Connection { - constructor(ws:WebSocket); - public get(collectionName:string, documentID:ShareDB.DocumentID):ShareDB.Doc - public createFetchQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query - public createSubscribeQuery(collectionName:string, query:string, options:{results?:Array}, callback:(err:ShareDB.Error, results:any)=>any):ShareDB.Query + constructor(ws: WebSocket); + get(collectionName: string, documentID: ShareDB.DocumentID): ShareDB.Doc; + createFetchQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; + createSubscribeQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; } } export = ShareDBServer; -} \ No newline at end of file +} diff --git a/types/sharedb/sharedb-tests.ts b/types/sharedb/sharedb-tests.ts index bec9905050..83f5e1c7f6 100644 --- a/types/sharedb/sharedb-tests.ts +++ b/types/sharedb/sharedb-tests.ts @@ -2,14 +2,14 @@ import * as ShareDB from 'sharedb'; import * as http from 'http'; import * as WebSocket from 'ws'; -import {Duplex} from 'stream'; +import { Duplex } from 'stream'; -//Adapted from https://github.com/avital/websocket-json-stream +// Adapted from https://github.com/avital/websocket-json-stream class WebSocketJSONStream extends Duplex { - constructor(private readonly ws:WebSocket) { - super({objectMode: true}); + constructor(private readonly ws: WebSocket) { + super({ objectMode: true }); this.ws.on('message', (msg: string) => { - this.push(JSON.parse(msg)) + this.push(JSON.parse(msg)); }); this.ws.on('close', () => { this.push(null); // end readable stream @@ -18,39 +18,39 @@ class WebSocketJSONStream extends Duplex { this.emit('close'); this.emit('end'); }); - this.on('error', function() { ws.close(); }); - this.on('end', function() { ws.close(); }); - }; - public _read():void {}; - public _write(msg:any, encoding:string, next:Function):void { + this.on('error', () => { ws.close(); }); + this.on('end', () => { ws.close(); }); + } + _read(): void {} + _write(msg: any, encoding: string, next: () => void): void { this.ws.send(JSON.stringify(msg)); next(); - }; -}; + } +} const backend = new ShareDB(); const connection = backend.connect(); const doc = connection.get('examples', 'counter'); doc.fetch((err) => { - if(err) { throw err; } - if(doc.type === null) { - doc.create({numClicks:0}, startServer); + if (err) { throw err; } + if (doc.type === null) { + doc.create({ numClicks: 0 }, startServer); } else { startServer(); } }); function startServer() { - var server = http.createServer(); + const server = http.createServer(); // Connect any incoming WebSocket connection to ShareDB - var wss = new WebSocket.Server({server: server}); - wss.on('connection', function(ws, req) { - var stream = new WebSocketJSONStream(ws); + const wss = new WebSocket.Server({ server }); + wss.on('connection', (ws, req) => { + const stream = new WebSocketJSONStream(ws); backend.listen(stream); }); - + server.listen(8080); // console.log('Listening on http://localhost:8080'); startClient(() => { @@ -60,12 +60,12 @@ function startServer() { } function startClient(callback) { - var sharedb = require('sharedb/lib/client'); - var socket = new WebSocket('ws://localhost:8080'); - var connection = new sharedb.Connection(socket); - var doc = connection.get('examples', 'counter'); + const sharedb = require('sharedb/lib/client'); + const socket = new WebSocket('ws://localhost:8080'); + const connection = new sharedb.Connection(socket); + const doc = connection.get('examples', 'counter'); doc.subscribe(() => { doc.submitOp([{p: ['numClicks'], na: 1}]); callback(); }); -} \ No newline at end of file +} diff --git a/types/sharedb/tslint.json b/types/sharedb/tslint.json index b7cf998e42..8125750f83 100644 --- a/types/sharedb/tslint.json +++ b/types/sharedb/tslint.json @@ -1,79 +1,5 @@ { "extends": "dtslint/dt.json", "rules": { - "adjacent-overload-signatures": false, - "array-type": false, - "arrow-return-shorthand": false, - "ban-types": false, - "callable-types": false, - "comment-format": false, - "dt-header": false, - "eofline": false, - "export-just-namespace": false, - "import-spacing": false, - "interface-name": false, - "interface-over-type-literal": false, - "jsdoc-format": false, - "max-line-length": false, - "member-access": false, - "new-parens": false, - "no-any-union": false, - "no-boolean-literal-compare": false, - "no-conditional-assignment": false, - "no-consecutive-blank-lines": false, - "no-construct": false, - "no-declare-current-package": false, - "no-duplicate-imports": false, - "no-duplicate-variable": false, - "no-empty-interface": false, - "no-for-in-array": false, - "no-inferrable-types": false, - "no-internal-module": false, - "no-irregular-whitespace": false, - "no-mergeable-namespace": false, - "no-misused-new": false, - "no-namespace": false, - "no-object-literal-type-assertion": false, - "no-padding": false, - "no-redundant-jsdoc": false, - "no-redundant-jsdoc-2": false, - "no-redundant-undefined": false, - "no-reference-import": false, - "no-relative-import-in-test": false, - "no-self-import": false, - "no-single-declare-module": false, - "no-string-throw": false, - "no-unnecessary-callback-wrapper": false, - "no-unnecessary-class": false, - "no-unnecessary-generics": false, - "no-unnecessary-qualifier": false, - "no-unnecessary-type-assertion": false, - "no-useless-files": false, - "no-var-keyword": false, - "no-var-requires": false, - "no-void-expression": false, - "no-trailing-whitespace": false, - "object-literal-key-quotes": false, - "object-literal-shorthand": false, - "one-line": false, - "one-variable-per-declaration": false, - "only-arrow-functions": false, - "prefer-conditional-expression": false, - "prefer-const": false, - "prefer-declare-function": false, - "prefer-for-of": false, - "prefer-method-signature": false, - "prefer-template": false, - "radix": false, - "semicolon": false, - "space-before-function-paren": false, - "space-within-parens": false, - "strict-export-declare-modifiers": false, - "trim-file": false, - "triple-equals": false, - "typedef-whitespace": false, - "unified-signatures": false, - "void-return": false, - "whitespace": false } -} \ No newline at end of file +} From a0ce865606388d3e2da2dfd1814ecd40a3e6823f Mon Sep 17 00:00:00 2001 From: Steve Oney Date: Wed, 15 Aug 2018 22:56:35 -0400 Subject: [PATCH 4/5] removing tslint disabled rules --- types/sharedb/index.d.ts | 63 +++++++++++++++++++-------------------- types/sharedb/tslint.json | 2 ++ 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/types/sharedb/index.d.ts b/types/sharedb/index.d.ts index 2b5a108799..f610dbe55d 100644 --- a/types/sharedb/index.d.ts +++ b/types/sharedb/index.d.ts @@ -8,21 +8,21 @@ declare namespace ShareDB { type Path = ReadonlyArray; type Snapshot = number; - interface AddNumOp { p: Path, na: number; }; + interface AddNumOp { p: Path; na: number; } - interface ListInsertOp { p: Path; li: any; }; - interface ListDeleteOp { p: Path; ld: any; }; - interface ListReplaceOp { p: Path; li: any; ld: any; }: - interface ListMoveOp { p: Path; lm: any; }: + interface ListInsertOp { p: Path; li: any; } + interface ListDeleteOp { p: Path; ld: any; } + interface ListReplaceOp { p: Path; li: any; ld: any; } + interface ListMoveOp { p: Path; lm: any; } - interface ObjectInsertOp { p: Path; oi: any; }; - interface ObjectDeleteOp { p: Path; od: any; }; - interface ObjectReplaceOp { p: Path; oi: any; od: any; }; + interface ObjectInsertOp { p: Path; oi: any; } + interface ObjectDeleteOp { p: Path; od: any; } + interface ObjectReplaceOp { p: Path; oi: any; od: any; } - interface StringInsertOp { p: Path; si: string; }; - interface StringDeleteOp { p: Path; sd: string; }; + interface StringInsertOp { p: Path; si: string; } + interface StringDeleteOp { p: Path; sd: string; } - interface SubtypeOp { p: Path; t: string; o: any; }; + interface SubtypeOp { p: Path; t: string; o: any; } type Op = AddNumOp | ListInsertOp | ListDeleteOp | ListReplaceOp | ListMoveOp | ObjectInsertOp | ObjectDeleteOp | ObjectReplaceOp | StringInsertOp | StringDeleteOp | SubtypeOp; @@ -40,38 +40,38 @@ declare namespace ShareDB { interface Error { code: number; message: string; - }; - interface ShareDBSourceOptions { source?: boolean; }; - interface ShareDBCreateOptions extends ShareDBSourceOptions {}; - interface ShareDBDelOptions extends ShareDBSourceOptions {}; - interface ShareDBSubmitOpOptions extends ShareDBSourceOptions {}; + } + interface ShareDBSourceOptions { source?: boolean; } + // interface ShareDBCreateOptions extends ShareDBSourceOptions {} + // interface ShareDBDelOptions extends ShareDBSourceOptions {} + // interface ShareDBSubmitOpOptions extends ShareDBSourceOptions {} - type Callback = (err: ShareDB.Error) => any; + type Callback = (err: Error) => any; class Doc { type: string; id: DocumentID; data: any; - fetch: (callback: (err: ShareDB.Error)=>void) => void; - subscribe: (callback: (err: ShareDB.Error)=>void) => void; - on: (event: 'load'|'create'|'before op'|'op'|'del'|'error', callback: (...args: Array) => any) => void; + fetch: (callback: (err: Error) => void) => void; + subscribe: (callback: (err: Error) => void) => void; + on: (event: 'load'|'create'|'before op'|'op'|'del'|'error', callback: (...args: any[]) => any) => void; ingestSnapshot: (snapshot: Snapshot, callback: Callback) => void; destroy: () => void; create(data: any, callback?: Callback): void; create(data: any, type?: OTType, callback?: Callback): void; - create(data: any, type?: OTType, options?: ShareDBCreateOptions, callback?: Callback): void; - submitOp: (data: ReadonlyArray, options?: ShareDBSubmitOpOptions, callback?: Callback) => void; - del: (options: ShareDBDelOptions, callback: (err: ShareDB.Error) => void) => void; - removeListener: (eventName: string, listener: Function) => void; - }; + create(data: any, type?: OTType, options?: ShareDBSourceOptions, callback?: Callback): void; + submitOp: (data: ReadonlyArray, options?: ShareDBSourceOptions, callback?: Callback) => void; + del: (options: ShareDBSourceOptions, callback: (err: Error) => void) => void; + removeListener: (eventName: string, listener: () => any) => void; + } class Query { ready: boolean; - results: ShareDB.Doc[]; + results: Doc[]; extra: any; on: (event: 'ready'|'error'|'changed'|'insert'|'move'|'remove'|'extra', callback: (...args: any[]) => any) => any; destroy: () => void; - }; + } } declare module 'sharedb/lib/client' { @@ -88,26 +88,23 @@ declare module 'sharedb/lib/client' { declare module 'sharedb' { class ShareDBServer { - constructor(options?: {db?: ShareDBServer.DB, pubsub?: ShareDBServer.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); + constructor(options?: {db?: any, pubsub?: ShareDBServer.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); connect: () => ShareDBServer.Connection; addProjection(name: string, collection: string, fields: {}): any; listen(stream: any): void; close(callback?: (err: ShareDBServer.Error) => any): void; use(action: ShareDB.Action, fn: ShareDBServer.UseCallback); types: { - register: Function + register: () => void }; } namespace ShareDBServer { - type UseCallback = ((request: {action: ShareDB.Action,agent: any,req: any,collection: string,id: string,query: any,op: ShareDB.RawOp}, callback: Function) => void); + type UseCallback = ((request: {action: ShareDB.Action, agent: any, req: any, collection: string, id: string, query: any, op: ShareDB.RawOp}, callback: () => void) => void); interface Error { code: number; message: string; } - interface DB { } - - class MemoryDB implements DB { } interface PubSubOptions { prefix?: string; } diff --git a/types/sharedb/tslint.json b/types/sharedb/tslint.json index 8125750f83..c47337c7a0 100644 --- a/types/sharedb/tslint.json +++ b/types/sharedb/tslint.json @@ -1,5 +1,7 @@ { "extends": "dtslint/dt.json", "rules": { + "dt-header": false, + "no-declare-current-package": false } } From c6f149bbdf50d77387c47485cc716f8e32a15b7b Mon Sep 17 00:00:00 2001 From: Steve Oney Date: Wed, 22 Aug 2018 17:50:20 -0400 Subject: [PATCH 5/5] Split client-side definition into separate file --- types/sharedb/index.d.ts | 186 +++++++++------------------------ types/sharedb/lib/client.d.ts | 12 +++ types/sharedb/lib/sharedb.d.ts | 67 ++++++++++++ types/sharedb/sharedb-tests.ts | 4 +- types/sharedb/tsconfig.json | 2 + types/sharedb/tslint.json | 5 +- 6 files changed, 135 insertions(+), 141 deletions(-) create mode 100644 types/sharedb/lib/client.d.ts create mode 100644 types/sharedb/lib/sharedb.d.ts diff --git a/types/sharedb/index.d.ts b/types/sharedb/index.d.ts index f610dbe55d..7b34c85583 100644 --- a/types/sharedb/index.d.ts +++ b/types/sharedb/index.d.ts @@ -1,147 +1,63 @@ -// Type definitions for sharedb v1.0.0-beta.11 +// Type definitions for sharedb 1.0 // Project: https://github.com/share/sharedb -// Definitions by: Steve Oney +// Definitions by: Steve Oney // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -declare namespace ShareDB { - type DocumentID = string; - type Path = ReadonlyArray; - type Snapshot = number; +/// - interface AddNumOp { p: Path; na: number; } +import { Doc, Query, Error, Action, RawOp, Op } from './lib/sharedb'; - interface ListInsertOp { p: Path; li: any; } - interface ListDeleteOp { p: Path; ld: any; } - interface ListReplaceOp { p: Path; li: any; ld: any; } - interface ListMoveOp { p: Path; lm: any; } +type UseCallback = ((request: {action: Action, agent: any, req: any, collection: string, id: string, query: any, op: RawOp}, callback: () => void) => void); - interface ObjectInsertOp { p: Path; oi: any; } - interface ObjectDeleteOp { p: Path; od: any; } - interface ObjectReplaceOp { p: Path; oi: any; od: any; } - - interface StringInsertOp { p: Path; si: string; } - interface StringDeleteOp { p: Path; sd: string; } - - interface SubtypeOp { p: Path; t: string; o: any; } - - type Op = AddNumOp | ListInsertOp | ListDeleteOp | ListReplaceOp | ListMoveOp | ObjectInsertOp | ObjectDeleteOp | ObjectReplaceOp | StringInsertOp | StringDeleteOp | SubtypeOp; - - interface RawOp { - src: string; - seq: number; - v: number; - op: Op[]; - m: any; - c: string; - d: string; - } - type OTType = 'ot-text' | 'ot-json0' | 'ot-text-tp2' | 'rich-text'; - type Action = 'connect'|'op'|'doc'|'query'|'submit'|'apply'|'commit'|'after submit'|'receive'; - interface Error { - code: number; - message: string; - } - interface ShareDBSourceOptions { source?: boolean; } - // interface ShareDBCreateOptions extends ShareDBSourceOptions {} - // interface ShareDBDelOptions extends ShareDBSourceOptions {} - // interface ShareDBSubmitOpOptions extends ShareDBSourceOptions {} - - type Callback = (err: Error) => any; - - class Doc { - type: string; - id: DocumentID; - data: any; - fetch: (callback: (err: Error) => void) => void; - subscribe: (callback: (err: Error) => void) => void; - on: (event: 'load'|'create'|'before op'|'op'|'del'|'error', callback: (...args: any[]) => any) => void; - ingestSnapshot: (snapshot: Snapshot, callback: Callback) => void; - destroy: () => void; - create(data: any, callback?: Callback): void; - create(data: any, type?: OTType, callback?: Callback): void; - create(data: any, type?: OTType, options?: ShareDBSourceOptions, callback?: Callback): void; - submitOp: (data: ReadonlyArray, options?: ShareDBSourceOptions, callback?: Callback) => void; - del: (options: ShareDBSourceOptions, callback: (err: Error) => void) => void; - removeListener: (eventName: string, listener: () => any) => void; - } - - class Query { - ready: boolean; - results: Doc[]; - extra: any; - on: (event: 'ready'|'error'|'changed'|'insert'|'move'|'remove'|'extra', callback: (...args: any[]) => any) => any; - destroy: () => void; - } +interface PubSubOptions { + prefix?: string; +} +interface Stream { + id: string; } -declare module 'sharedb/lib/client' { - type Doc = ShareDB.Doc; - type Op = ShareDB.Op; - type Action = ShareDB.Action; +export = sharedb; + +declare class sharedb { + constructor(options?: {db?: any, pubsub?: sharedb.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); + connect: () => sharedb.Connection; + addProjection(name: string, collection: string, fields: {}): any; + listen(stream: any): void; + close(callback?: (err: Error) => any): void; + use(action: Action, fn: UseCallback); + types: { + register: () => void + }; +} + +declare namespace sharedb { + abstract class PubSub { + private static shallowCopy(obj: any); + protected prefix?: string; + protected nextStreamId: number; + protected streamsCount: number; + protected streams: { + [channel: string]: Stream; + }; + protected subscribed: { + [channel: string]: boolean; + }; + protected constructor(options?: PubSubOptions); + close(callback?: (err: Error|null) => void): void; + publish(channels: string[], data: {[k: string]: any}, callback: (err: Error | null) => void): void; + subscribe(channel: string, callback: (err: Error | null, stream?: Stream) => void): void; + protected abstract _subscribe(channel: string, callback: (err: Error | null) => void): void; + protected abstract _unsubscribe(channel: string, callback: (err: Error | null) => void): void; + protected abstract _publish(channels: string[], data: any, callback: (err: Error | null) => void): void; + protected _emit(channel: string, data: {[k: string]: any}): void; + private _createStream(channel); + private _removeStream(channel, stream); + } + class Connection { constructor(ws: WebSocket); - get(collectionName: string, documentID: ShareDB.DocumentID): ShareDB.Doc; - createFetchQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; - createSubscribeQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; + get(collectionName: string, documentID: string): Doc; + createFetchQuery(collectionName: string, query: string, options: {results?: Query[]}, callback: (err: Error, results: any) => any): Query; + createSubscribeQuery(collectionName: string, query: string, options: {results?: Query[]}, callback: (err: Error, results: any) => any): Query; } } - -declare module 'sharedb' { - class ShareDBServer { - constructor(options?: {db?: any, pubsub?: ShareDBServer.PubSub, disableDocAction?: boolean, disableSpaceDelimitedActions?: boolean}); - connect: () => ShareDBServer.Connection; - addProjection(name: string, collection: string, fields: {}): any; - listen(stream: any): void; - close(callback?: (err: ShareDBServer.Error) => any): void; - use(action: ShareDB.Action, fn: ShareDBServer.UseCallback); - types: { - register: () => void - }; - } - namespace ShareDBServer { - type UseCallback = ((request: {action: ShareDB.Action, agent: any, req: any, collection: string, id: string, query: any, op: ShareDB.RawOp}, callback: () => void) => void); - interface Error { - code: number; - message: string; - } - - interface PubSubOptions { - prefix?: string; - } - interface Stream { - id: string; - } - abstract class PubSub { - private static shallowCopy(obj: any); - protected prefix?: string; - protected nextStreamId: number; - protected streamsCount: number; - protected streams: { - [channel: string]: Stream; - }; - protected subscribed: { - [channel: string]: boolean; - }; - protected constructor(options?: PubSubOptions); - close(callback?: (err: Error|null) => void): void; - publish(channels: string[], data: {[k: string]: any}, callback: (err: Error | null) => void): void; - subscribe(channel: string, callback: (err: Error | null, stream?: Stream) => void): void; - protected abstract _subscribe(channel: string, callback: (err: Error | null) => void): void; - protected abstract _unsubscribe(channel: string, callback: (err: Error | null) => void): void; - protected abstract _publish(channels: string[], data: any, callback: (err: Error | null) => void): void; - protected _emit(channel: string, data: {[k: string]: any}): void; - private _createStream(channel); - private _removeStream(channel, stream); - } - type Doc = ShareDB.Doc; - type Op = ShareDB.Op; - type Action = ShareDB.Action; - class Connection { - constructor(ws: WebSocket); - get(collectionName: string, documentID: ShareDB.DocumentID): ShareDB.Doc; - createFetchQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; - createSubscribeQuery(collectionName: string, query: string, options: {results?: ShareDB.Query[]}, callback: (err: ShareDB.Error, results: any) => any): ShareDB.Query; - } - } - export = ShareDBServer; -} diff --git a/types/sharedb/lib/client.d.ts b/types/sharedb/lib/client.d.ts new file mode 100644 index 0000000000..ad8328dc83 --- /dev/null +++ b/types/sharedb/lib/client.d.ts @@ -0,0 +1,12 @@ +/// +import * as WebSocket from 'ws'; +import * as ShareDB from './sharedb'; + +export class Connection { + constructor(ws: WebSocket); + get(collectionName: string, documentID: string): Doc; + createFetchQuery(collectionName: string, query: string, options: {results?: Query[]}, callback: (err: Error, results: any) => any): Query; + createSubscribeQuery(collectionName: string, query: string, options: {results?: Query[]}, callback: (err: Error, results: any) => any): Query; +} +export type Doc = ShareDB.Doc; +export type Query = ShareDB.Query; diff --git a/types/sharedb/lib/sharedb.d.ts b/types/sharedb/lib/sharedb.d.ts new file mode 100644 index 0000000000..1b9b7ee5df --- /dev/null +++ b/types/sharedb/lib/sharedb.d.ts @@ -0,0 +1,67 @@ +export type Path = ReadonlyArray; +export type Snapshot = number; + +export interface AddNumOp { p: Path; na: number; } + +export interface ListInsertOp { p: Path; li: any; } +export interface ListDeleteOp { p: Path; ld: any; } +export interface ListReplaceOp { p: Path; li: any; ld: any; } +export interface ListMoveOp { p: Path; lm: any; } + +export interface ObjectInsertOp { p: Path; oi: any; } +export interface ObjectDeleteOp { p: Path; od: any; } +export interface ObjectReplaceOp { p: Path; oi: any; od: any; } + +export interface StringInsertOp { p: Path; si: string; } +export interface StringDeleteOp { p: Path; sd: string; } + +export interface SubtypeOp { p: Path; t: string; o: any; } + +export type Op = AddNumOp | ListInsertOp | ListDeleteOp | ListReplaceOp | ListMoveOp | ObjectInsertOp | ObjectDeleteOp | ObjectReplaceOp | StringInsertOp | StringDeleteOp | SubtypeOp; + +export interface RawOp { + src: string; + seq: number; + v: number; + op: Op[]; + m: any; + c: string; + d: string; +} +export type OTType = 'ot-text' | 'ot-json0' | 'ot-text-tp2' | 'rich-text'; +export type Action = 'connect'|'op'|'doc'|'query'|'submit'|'apply'|'commit'|'after submit'|'receive'; +export interface Error { + code: number; + message: string; +} +export interface ShareDBSourceOptions { source?: boolean; } +// interface ShareDBCreateOptions extends ShareDBSourceOptions {} +// interface ShareDBDelOptions extends ShareDBSourceOptions {} +// interface ShareDBSubmitOpOptions extends ShareDBSourceOptions {} + +export type Callback = (err: Error) => any; + +export class Doc { + type: string; + id: string; + data: any; + fetch: (callback: (err: Error) => void) => void; + subscribe: (callback: (err: Error) => void) => void; + on: (event: 'load'|'create'|'before op'|'op'|'del'|'error', callback: (...args: any[]) => any) => void; + ingestSnapshot: (snapshot: Snapshot, callback: Callback) => void; + destroy: () => void; + create(data: any, callback?: Callback): void; + create(data: any, type?: OTType, callback?: Callback): void; + create(data: any, type?: OTType, options?: ShareDBSourceOptions, callback?: Callback): void; + submitOp: (data: ReadonlyArray, options?: ShareDBSourceOptions, callback?: Callback) => void; + del: (options: ShareDBSourceOptions, callback: (err: Error) => void) => void; + removeListener: (eventName: string, listener: () => any) => void; +} + +export class Query { + ready: boolean; + results: Doc[]; + extra: any; + on: (event: 'ready'|'error'|'changed'|'insert'|'move'|'remove'|'extra', callback: (...args: any[]) => any) => any; + destroy: () => void; +} diff --git a/types/sharedb/sharedb-tests.ts b/types/sharedb/sharedb-tests.ts index 83f5e1c7f6..55c3dc797d 100644 --- a/types/sharedb/sharedb-tests.ts +++ b/types/sharedb/sharedb-tests.ts @@ -3,6 +3,7 @@ import * as ShareDB from 'sharedb'; import * as http from 'http'; import * as WebSocket from 'ws'; import { Duplex } from 'stream'; +import * as ShareDBClient from 'sharedb/lib/client'; // Adapted from https://github.com/avital/websocket-json-stream class WebSocketJSONStream extends Duplex { @@ -60,9 +61,8 @@ function startServer() { } function startClient(callback) { - const sharedb = require('sharedb/lib/client'); const socket = new WebSocket('ws://localhost:8080'); - const connection = new sharedb.Connection(socket); + const connection = new ShareDBClient.Connection(socket); const doc = connection.get('examples', 'counter'); doc.subscribe(() => { doc.submitOp([{p: ['numClicks'], na: 1}]); diff --git a/types/sharedb/tsconfig.json b/types/sharedb/tsconfig.json index fcbe6c741a..8d2c0915c0 100644 --- a/types/sharedb/tsconfig.json +++ b/types/sharedb/tsconfig.json @@ -20,7 +20,9 @@ "forceConsistentCasingInFileNames": true }, "files": [ + "lib/sharedb.d.ts", "index.d.ts", + "lib/client.d.ts", "sharedb-tests.ts" ] } \ No newline at end of file diff --git a/types/sharedb/tslint.json b/types/sharedb/tslint.json index c47337c7a0..2914fa23e8 100644 --- a/types/sharedb/tslint.json +++ b/types/sharedb/tslint.json @@ -1,7 +1,4 @@ { "extends": "dtslint/dt.json", - "rules": { - "dt-header": false, - "no-declare-current-package": false - } + "rules": { } }