From d5d3cd0fca29f1202453fac0fb4c14faa380269f Mon Sep 17 00:00:00 2001 From: erikma Date: Tue, 4 Jul 2017 18:05:33 -0700 Subject: [PATCH 1/6] Add types for ZeroMQ.js, derived from the 'zmq' type definitions --- types/zeromq/tsconfig.json | 22 ++++ types/zeromq/zeromq-tests.ts | 51 ++++++++ types/zeromq/zeromq.d.ts | 241 +++++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+) create mode 100644 types/zeromq/tsconfig.json create mode 100644 types/zeromq/zeromq-tests.ts create mode 100644 types/zeromq/zeromq.d.ts diff --git a/types/zeromq/tsconfig.json b/types/zeromq/tsconfig.json new file mode 100644 index 0000000000..4899c84d1d --- /dev/null +++ b/types/zeromq/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "zeromq-tests.ts" + ] +} \ No newline at end of file diff --git a/types/zeromq/zeromq-tests.ts b/types/zeromq/zeromq-tests.ts new file mode 100644 index 0000000000..b13ff65fb5 --- /dev/null +++ b/types/zeromq/zeromq-tests.ts @@ -0,0 +1,51 @@ +import zeromq = require('zeromq'); + +function test1() { + var sock = zeromq.socket('push'); + sock.bindSync('tcp://127.0.0.1:3000'); + sock.unbindSync('tcp://127.0.0.1:3000'); + sock.send("some work"); +} + +function test2() { + var sock = zeromq.socket('push'); + sock.bindSync('tcp://127.0.0.1:3000'); + sock.send(new Buffer(1000)); +} + +function test3() { + var sock = zeromq.socket('push'); + sock.bindSync('tcp://127.0.0.1:3000'); + sock.send(['hello', 'world']); + sock.on('message', function (buffer1: Buffer, buffer2: Buffer) { + // + }); +} + +function test4() { + var sock = zeromq.socket(zeromq.types.pull); + sock.bind('tcp://127.0.0.1', err => { + sock.send("some work"); + }); + sock.unbind('tcp://127.0.0.1', err => { + // + }); +} + +function test5() { + var sock = zeromq.socket(zeromq.types.pull, zeromq.options.linger); + sock.bind('tcp://127.0.0.1', err => { + sock.send("some work"); + }); + sock.monitor(); + sock.monitor(10); +} + +function test6() { + var sock = zeromq.socket(zeromq.types.dealer); + sock.bind('tcp://127.0.0.1', err => { + sock.send("some work"); + }); + sock.pause(); + sock.resume(); +} diff --git a/types/zeromq/zeromq.d.ts b/types/zeromq/zeromq.d.ts new file mode 100644 index 0000000000..bc25f1c0d3 --- /dev/null +++ b/types/zeromq/zeromq.d.ts @@ -0,0 +1,241 @@ +// Type definitions for zeromq.js +// Project: https://github.com/zeromq/zeromq.js +// Definitions by: Dave McKeown , Erik Mavrinac +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// +// Forked from the DefinitelyTyped 'zmq' project originally created by Dave McKeown, +// then updated with recent changes in the 'zeromq' project from +// https://github.com/zeromq/zeromq.js/blob/master/lib/index.js + +/// + +interface EventEmitter { } + +interface SocketTypes { + pub: number; + xpub: number; + sub: number; + xsub: number; + req: number; + xreq: number; + rep: number; + xrep: number; + push: number; + pull: number; + dealer: number; + router: number; + pair: number; + stream: number; +} + +interface SocketOptions { + _fd: number; + _ioevents: number; + _receiveMore: number; + _subscribe: number; + _unsubscribe: number; + affinity: number; + backlog: number; + hwm: number; + identity: number; + linger: number; + mcast_loop: number; + rate: number; + rcvbuf: number; + last_endpoint: number; + reconnect_ivl: number; + recovery_ivl: number; + sndbuf: number; + swap: number; + mechanism: number; + plain_server: number; + plain_username: number; + plain_password: number; + curve_server: number; + curve_publickey: number; + curve_secretkey: number; + curve_serverkey: number; + zap_domain: number; +} + +interface Socket extends EventEmitter { + /** + * Set `opt` to `val`. + * + * @param opt Option + * @param val Value + */ + setsocketopt(opt: number, val: any): Socket; + + /** + * Set `opt` to `val`. + * + * @param opt Option + * @param val Value + */ + setsocketopt(opt: string, val: any): Socket; + + /** + * Get socket `opt`. + * + * @param opt Option number + */ + getsocketopt(opt: number): any; + + /** + * Get socket `opt`. + * + * @param opt Option string + */ + getsocketopt(opt: string): any; + + /** + * Async bind. + * + * Emits the "bind" event. + * + * @param addr Socket address + * @param cb Bind callback + */ + bind(addr: string, callback?: (error: string) => void ): Socket; + + /** + * Sync bind. + * + * @param addr Socket address + */ + bindSync(addr: string): Socket; + + /** + * Async unbind. + * + * Emits the "unbind" event. + * + * @param addr Socket address + * @param cb Unind callback + */ + unbind(addr: string, callback?: (error: string) => void ): Socket; + + /** + * Sync unbind. + * + * @param addr Socket address + */ + unbindSync(addr: string): Socket; + + /** + * Connect to `addr`. + * + * @param addr Connection address + */ + connect(addr: string): Socket; + + /** + * Disconnect from `addr`. + * + * @param addr The address + */ + disconnect(addr: string): Socket; + + /** + * Subscribe with the given `filter`. + * + * @param filter The filter + */ + subscribe(filter: string): Socket; + + /** + * Unsubscribe with the given `filter`. + * + * @param filter The filter + */ + unsubscribe(filter: string): Socket; + + /** + * Send the given `msg`. + * + * @param msg The message + * @param flags Message flags + */ + send(msg: string, flags?: number): Socket; + + /** + * Send the given `msg`. + * + * @param msg {Buffer} The message + * @param flags {number} Optional message flags + */ + send(msg: Buffer, flags?: number): Socket; + + /** + * Send the given `msg`. + * + * @param msg The message + * @param flags Message flags + */ + send(msg: any[], flags?: number): Socket; + + /** + * Enable monitoring of a Socket. This enables the following additional events: + * 'connect', 'connect_delay', 'connect_retry', 'listen', 'bind_error', + * 'accept', 'accept_error', 'close', 'close_error', 'disconnect'. + * Each event receives the parameters: (eventValue, eventEndpointAddrress, error) + * + * @param {Number} timer interval in ms > 0 or Undefined for default + * @return {Socket} for chaining + */ + monitor(interval?: number): Socket; + + /** + * Close the socket. + * + */ + close(): Socket; + + /** + * Socket event - 'message' + * @param eventName {string} + * @param callback {Function} + */ + on(eventName: string, callback: (...buffer: Buffer[]) => void): void; + + pause(): void; + resume(): void; + + // Socket Options + _fd: any; + _ioevents: any; + _receiveMore: any; + _subscribe: any; + _unsubscribe: any; + affinity: any; + backlog(): any; + hwm: any; + identity: any; + linger: any; + mcast_loop: any; + rate: any; + rcvbuf: any; + last_endpoint: any; + reconnect_ivl: any; + recovery_ivl: any; + sndbuf: any; + swap: any; + mechanism: any; + plain_server: any; + plain_username: any; + plain_password: any; + curve_server: any; + curve_publickey: any; + curve_secretkey: any; + curve_serverkey: any; + zap_domain: any; +} + +export var version: string; +export var types: SocketTypes; +export var options: SocketOptions; + +declare function socket(type: string, options?: any): Socket; +declare function socket(type: number, options?: any): Socket; +declare function createSocket(type: string, options?: any): Socket; From 7eb6f76ab53988f7cbec6fb27ecb4b06785bdc25 Mon Sep 17 00:00:00 2001 From: erikma Date: Tue, 4 Jul 2017 18:10:16 -0700 Subject: [PATCH 2/6] Rename .d.ts file per guidelines --- types/zeromq/{zeromq.d.ts => index.d.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename types/zeromq/{zeromq.d.ts => index.d.ts} (100%) diff --git a/types/zeromq/zeromq.d.ts b/types/zeromq/index.d.ts similarity index 100% rename from types/zeromq/zeromq.d.ts rename to types/zeromq/index.d.ts From a0f8c9acc3e6adab166ea0e65e871203a504e5f3 Mon Sep 17 00:00:00 2001 From: erikma Date: Tue, 4 Jul 2017 18:12:05 -0700 Subject: [PATCH 3/6] Add tsline file --- types/zeromq/tslint.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 types/zeromq/tslint.json diff --git a/types/zeromq/tslint.json b/types/zeromq/tslint.json new file mode 100644 index 0000000000..495d29983d --- /dev/null +++ b/types/zeromq/tslint.json @@ -0,0 +1,5 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + } +} From 1df11ec62acbb554a4d40c390d36b2eb6399223b Mon Sep 17 00:00:00 2001 From: erikma Date: Tue, 4 Jul 2017 18:33:23 -0700 Subject: [PATCH 4/6] Fix lint issues: --- types/zeromq/index.d.ts | 78 ++++++++++-------------------------- types/zeromq/tsconfig.json | 4 +- types/zeromq/zeromq-tests.ts | 16 ++++---- 3 files changed, 31 insertions(+), 67 deletions(-) diff --git a/types/zeromq/index.d.ts b/types/zeromq/index.d.ts index bc25f1c0d3..d77c48dbf7 100644 --- a/types/zeromq/index.d.ts +++ b/types/zeromq/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for zeromq.js +// Type definitions for zeromq 4.5 // Project: https://github.com/zeromq/zeromq.js // Definitions by: Dave McKeown , Erik Mavrinac // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped @@ -9,9 +9,7 @@ /// -interface EventEmitter { } - -interface SocketTypes { +export interface SocketTypes { pub: number; xpub: number; sub: number; @@ -28,7 +26,7 @@ interface SocketTypes { stream: number; } -interface SocketOptions { +export interface SocketOptions { _fd: number; _ioevents: number; _receiveMore: number; @@ -58,36 +56,21 @@ interface SocketOptions { zap_domain: number; } -interface Socket extends EventEmitter { +export interface Socket { /** * Set `opt` to `val`. * * @param opt Option * @param val Value */ - setsocketopt(opt: number, val: any): Socket; - - /** - * Set `opt` to `val`. - * - * @param opt Option - * @param val Value - */ - setsocketopt(opt: string, val: any): Socket; + setsocketopt(opt: number|string, val: any): Socket; /** * Get socket `opt`. * * @param opt Option number */ - getsocketopt(opt: number): any; - - /** - * Get socket `opt`. - * - * @param opt Option string - */ - getsocketopt(opt: string): any; + getsocketopt(opt: number|string): any; /** * Async bind. @@ -157,33 +140,17 @@ interface Socket extends EventEmitter { * @param msg The message * @param flags Message flags */ - send(msg: string, flags?: number): Socket; + send(msg: string|Buffer|any[], flags?: number): Socket; /** - * Send the given `msg`. + * Enable monitoring of a Socket. This enables the following additional events: + * 'connect', 'connect_delay', 'connect_retry', 'listen', 'bind_error', + * 'accept', 'accept_error', 'close', 'close_error', 'disconnect'. + * Each event receives the parameters: (eventValue, eventEndpointAddrress, error) * - * @param msg {Buffer} The message - * @param flags {number} Optional message flags + * @param {Number} timer interval in ms > 0 or Undefined for default + * @return {Socket} for chaining */ - send(msg: Buffer, flags?: number): Socket; - - /** - * Send the given `msg`. - * - * @param msg The message - * @param flags Message flags - */ - send(msg: any[], flags?: number): Socket; - - /** - * Enable monitoring of a Socket. This enables the following additional events: - * 'connect', 'connect_delay', 'connect_retry', 'listen', 'bind_error', - * 'accept', 'accept_error', 'close', 'close_error', 'disconnect'. - * Each event receives the parameters: (eventValue, eventEndpointAddrress, error) - * - * @param {Number} timer interval in ms > 0 or Undefined for default - * @return {Socket} for chaining - */ monitor(interval?: number): Socket; /** @@ -225,17 +192,16 @@ interface Socket extends EventEmitter { plain_server: any; plain_username: any; plain_password: any; - curve_server: any; - curve_publickey: any; - curve_secretkey: any; - curve_serverkey: any; + curve_server: number; + curve_publickey: string | Buffer; + curve_secretkey: string | Buffer; + curve_serverkey: string | Buffer; zap_domain: any; } -export var version: string; -export var types: SocketTypes; -export var options: SocketOptions; +export let version: string; +export let types: SocketTypes; +export let options: SocketOptions; -declare function socket(type: string, options?: any): Socket; -declare function socket(type: number, options?: any): Socket; -declare function createSocket(type: string, options?: any): Socket; +export function socket(type: string|number, options?: any): Socket; +export function createSocket(type: string, options?: any): Socket; diff --git a/types/zeromq/tsconfig.json b/types/zeromq/tsconfig.json index 4899c84d1d..aa30afd4b0 100644 --- a/types/zeromq/tsconfig.json +++ b/types/zeromq/tsconfig.json @@ -6,7 +6,7 @@ ], "noImplicitAny": true, "noImplicitThis": true, - "strictNullChecks": false, + "strictNullChecks": true, "baseUrl": "../", "typeRoots": [ "../" @@ -19,4 +19,4 @@ "index.d.ts", "zeromq-tests.ts" ] -} \ No newline at end of file +} diff --git a/types/zeromq/zeromq-tests.ts b/types/zeromq/zeromq-tests.ts index b13ff65fb5..af36166e64 100644 --- a/types/zeromq/zeromq-tests.ts +++ b/types/zeromq/zeromq-tests.ts @@ -1,29 +1,27 @@ import zeromq = require('zeromq'); function test1() { - var sock = zeromq.socket('push'); + let sock = zeromq.socket('push'); sock.bindSync('tcp://127.0.0.1:3000'); sock.unbindSync('tcp://127.0.0.1:3000'); sock.send("some work"); } function test2() { - var sock = zeromq.socket('push'); + let sock = zeromq.socket('push'); sock.bindSync('tcp://127.0.0.1:3000'); sock.send(new Buffer(1000)); } function test3() { - var sock = zeromq.socket('push'); + let sock = zeromq.socket('push'); sock.bindSync('tcp://127.0.0.1:3000'); sock.send(['hello', 'world']); - sock.on('message', function (buffer1: Buffer, buffer2: Buffer) { - // - }); + sock.on('message', (buffer1: Buffer, buffer2: Buffer) => { }); } function test4() { - var sock = zeromq.socket(zeromq.types.pull); + let sock = zeromq.socket(zeromq.types.pull); sock.bind('tcp://127.0.0.1', err => { sock.send("some work"); }); @@ -33,7 +31,7 @@ function test4() { } function test5() { - var sock = zeromq.socket(zeromq.types.pull, zeromq.options.linger); + let sock = zeromq.socket(zeromq.types.pull, zeromq.options.linger); sock.bind('tcp://127.0.0.1', err => { sock.send("some work"); }); @@ -42,7 +40,7 @@ function test5() { } function test6() { - var sock = zeromq.socket(zeromq.types.dealer); + let sock = zeromq.socket(zeromq.types.dealer); sock.bind('tcp://127.0.0.1', err => { sock.send("some work"); }); From 8e612fef33303836147575721d9fe32f6ba84c9e Mon Sep 17 00:00:00 2001 From: erikma Date: Wed, 5 Jul 2017 13:19:53 -0700 Subject: [PATCH 5/6] Add information for curveKeypair() function --- types/zeromq/index.d.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/types/zeromq/index.d.ts b/types/zeromq/index.d.ts index d77c48dbf7..8321edc697 100644 --- a/types/zeromq/index.d.ts +++ b/types/zeromq/index.d.ts @@ -199,9 +199,34 @@ export interface Socket { zap_domain: any; } +/** The key material returned from a call to curveKeypair(). */ +export interface CurveKeyPair { + /** + * A Z85 string denoting the public portion of the Curve25519 key. + * + * @name CurveKeyPair#public + * @type string + */ + public: string; + + /** + * A Z85 string denoting the private, secret portion of the Curve25519 key. + * + * @name CurveKeyPair#secret + * @type string + */ + secret: string; +} + export let version: string; export let types: SocketTypes; export let options: SocketOptions; export function socket(type: string|number, options?: any): Socket; export function createSocket(type: string, options?: any): Socket; + +/** + * Generates a CurveZMQ (Curve25519) key pair. + * @return {CurveKeyPair} The public and secret portions of the key.. + */ +export function curveKeypair(): CurveKeyPair; From 08e79d5306c84e3d84e401ab4aab8ff8122ae908 Mon Sep 17 00:00:00 2001 From: erikma Date: Wed, 5 Jul 2017 14:42:01 -0700 Subject: [PATCH 6/6] More jsdocs --- types/zeromq/index.d.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/types/zeromq/index.d.ts b/types/zeromq/index.d.ts index 8321edc697..1d33077d1d 100644 --- a/types/zeromq/index.d.ts +++ b/types/zeromq/index.d.ts @@ -218,15 +218,28 @@ export interface CurveKeyPair { secret: string; } +/** + * Gets the ZeroMQ version. + */ export let version: string; + export let types: SocketTypes; export let options: SocketOptions; +/** + * Creates a ZeroMQ socket of the specified type. + * @return {Socket} The created socket in an unconnected state. + */ export function socket(type: string|number, options?: any): Socket; + +/** + * Creates a ZeroMQ socket of the specified type. + * @return {Socket} The created socket in an unconnected state. + */ export function createSocket(type: string, options?: any): Socket; /** * Generates a CurveZMQ (Curve25519) key pair. - * @return {CurveKeyPair} The public and secret portions of the key.. + * @return {CurveKeyPair} The public and secret portions of the key. */ export function curveKeypair(): CurveKeyPair;