Skip to content

Commit

Permalink
Fixes #22 - Provide TypeScript *.d.ts files.
Browse files Browse the repository at this point in the history
* Provided *.d.ts files.
* Converted all tests to TypeScript to validate the types.

Signed-off-by: Simone Bordet <[email protected]>
  • Loading branch information
sbordet committed Dec 23, 2020
1 parent e373d79 commit 1ee9786
Show file tree
Hide file tree
Showing 15 changed files with 562 additions and 317 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
.idea/

node_modules/
package-lock.json
12 changes: 3 additions & 9 deletions test/latch.js → ack-extension.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';

module.exports = function(count, callback) {
this.signal = () => {
if (--count === 0) {
callback();
}
};
};
export class AcknowledgedMessagesExtension {
constructor();
}
151 changes: 151 additions & 0 deletions cometd-nodejs-server.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
/*
* Copyright (c) 2017-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export interface Callback<R> {
(error?: Error, result?: R): void;
}

export interface VarArgFunction {
(...args: any[]): void
}

export interface ServerMessage {
advice?: any;
channel: string;
clientId?: string;
connectionType?: string;
data?: any;
error?: string;
ext?: any;
id?: string;
minimumVersion?: string;
reply?: ServerMessage;
subscription?: string[];
successful?: boolean;
supportedConnectionTypes?: string[];
version?: string;
}

export interface ServerSessionExtension {
incoming?(session: ServerSession, message: ServerMessage, callback: Callback<boolean>): void;

outgoing?(sender: ServerSession, session: ServerSession, message: ServerMessage, callback: Callback<ServerMessage>): void;
}

export interface ServerChannel {
readonly name: string;
readonly meta: boolean;
readonly service: boolean;
readonly broadcast: boolean;
readonly wildNames: string[];

publish(sender: ServerSession | null, data: any, callback?: Callback<boolean>): void;

addListener(event: string, fn: VarArgFunction): void;

removeListener(event: string, fn: VarArgFunction): boolean;

listeners(event: string): VarArgFunction[];

readonly subscribers: ServerSession[];
}

export interface ServerSession {
readonly id: string

addExtension(extension: ServerSessionExtension): void;

removeExtension(extension: ServerSessionExtension): boolean;

readonly extensions: ServerSessionExtension[];

addListener(event: string, fn: VarArgFunction): void;

removeListener(event: string, fn: VarArgFunction): boolean;

listeners(event: string): VarArgFunction[];

deliver(sender: ServerSession | null, channelName: string, data: any, callback?: Callback<boolean>): void;

readonly subscriptions: ServerChannel[];

batch(fn: () => void): void;

disconnect(callback?: Callback<boolean>): void;
}

export interface ServerExtension {
incoming?(server: CometDServer, session: ServerSession, message: ServerMessage, callback: Callback<boolean>): void;

outgoing?(server: CometDServer, sender: ServerSession, session: ServerSession, message: ServerMessage, callback: Callback<boolean>): void;
}

export interface SecurityPolicy {
canHandshake?(session: ServerSession, message: ServerMessage, callback: Callback<boolean>): void;

canCreate?(session: ServerSession, message: ServerMessage, channelName: string, callback: Callback<boolean>): void;

canSubscribe?(session: ServerSession, message: ServerMessage, channel: ServerChannel, callback: Callback<boolean>): void;

canPublish?(session: ServerSession, message: ServerMessage, channel: ServerChannel, callback: Callback<boolean>): void;
}

export interface CometDServer {
readonly options: Options;
policy: SecurityPolicy;

addListener(event: string, fn: VarArgFunction): void;

removeListener(event: string, fn: VarArgFunction): boolean;

listeners(event: string): VarArgFunction[];

addExtension(extension: ServerExtension): void;

removeExtension(extension: ServerExtension): boolean;

readonly extensions: ServerExtension[];

handle(request: any, response: any): void;

getServerChannel(name: string): ServerChannel;

createServerChannel(name: string): ServerChannel;

getServerSession(id: string): ServerSession;

readonly context: any;

close(): void;
}

export interface Options {
// Common options.
interval?: number;
logLevel?: 'debug' | 'info';
maxInterval?: number;
sweepPeriod?: number;
timeout?: number;
// HTTP options.
browserCookieHttpOnly?: boolean;
browserCookieName?: string;
browserCookieSameSite?: 'Strict' | 'Lax' | 'None';
browserCookieSecure?: boolean;
duplicateMetaConnectHttpResponseCode?: number;
maxSessionsPerBrowser?: number;
multiSessionInterval?: number;
}

export function createCometDServer(options?: Options): CometDServer;
10 changes: 6 additions & 4 deletions cometd-nodejs-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,11 @@ module.exports = (() => {
if (list.length === 0) {
delete listeners[event];
}
return true;
}
}
}
return false;
}

function _notifyEvent(listeners, args) {
Expand Down Expand Up @@ -808,7 +810,7 @@ module.exports = (() => {
* @param {function} fn the listener function
*/
removeListener: (event, fn) => {
_removeListener(_listeners, event, fn);
return _removeListener(_listeners, event, fn);
},
/**
* @returns {ServerSession[]} the list of ServerSession subscribed to this channel
Expand Down Expand Up @@ -986,7 +988,7 @@ module.exports = (() => {
* @param {function} fn the listener function
*/
removeListener: (event, fn) => {
_removeListener(_listeners, event, fn);
return _removeListener(_listeners, event, fn);
},
/**
* Delivers a message to the remote client represented by this ServerSession.
Expand Down Expand Up @@ -1517,7 +1519,7 @@ module.exports = (() => {
const subscribers = channel.subscribers;
_self._log('cometd.server', 'notifying', subscribers.length, 'subscribers on', channel.name);
subscribers.forEach(subscriber => {
subscriber._deliver1(session, message);
subscriber._deliver1(session, message, null);
});
});
}
Expand Down Expand Up @@ -1667,7 +1669,7 @@ module.exports = (() => {
* @param {function} fn the listener function
*/
removeListener: (event, fn) => {
_removeListener(_listeners, event, fn);
return _removeListener(_listeners, event, fn);
},
/**
* @param {string} event the event type
Expand Down
13 changes: 9 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,21 @@
},
"license": "Apache-2.0",
"main": "cometd-nodejs-server.js",
"types": "cometd-nodejs-server.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/cometd/cometd-nodejs-server.git"
},
"scripts": {
"test": "mocha --exit"
"test": "mocha --exit --require ts-node/register --extensions ts test/*.ts"
},
"devDependencies": {
"cometd": "^3.1.4",
"cometd-nodejs-client": "^1.0.2",
"mocha": "^5.2.0"
"cometd": "latest",
"cometd-nodejs-client": "latest",
"mocha": "latest",
"typescript": "latest",
"ts-node": "latest",
"@types/node": "latest",
"@types/mocha": "latest"
}
}
37 changes: 20 additions & 17 deletions test/ack-extension.js → test/ack-extension.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,35 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';

const assert = require('assert');
const http = require('http');
const serverLib = require('..');
import http = require('http');
import serverLib = require('..');
// @ts-ignore
import clientLib = require('cometd');

const serverAck = require('../ack-extension');
require('cometd-nodejs-client').adapt();
const clientLib = require('cometd');
const ClientAck = require('cometd/AckExtension');
const Latch = require('./latch.js');
import {Latch} from './latch';
import {AddressInfo} from 'net';

require('cometd-nodejs-client').adapt();

describe('acknowledgment extension', () => {
let _server;
let _http;
let _client;
let _uri;
let _server: serverLib.CometDServer;
let _http: http.Server;
let _client: clientLib.CometD;
let _uri: string;

beforeEach(done => {
_server = serverLib.createCometDServer();
_server.addExtension(new serverAck.AcknowledgedMessagesExtension());
_http = http.createServer(_server.handle);
_http.listen(0, 'localhost', () => {
let port = _http.address().port;
const port = (_http.address() as AddressInfo).port;
console.log('listening on localhost:' + port);
_uri = 'http://localhost:' + port + '/cometd';
_client = new clientLib.CometD();
_client.unregisterTransport('websocket');
_client.registerExtension('ack', new ClientAck());
_client.configure({
url: _uri
Expand All @@ -61,7 +64,7 @@ describe('acknowledgment extension', () => {
callback();
});

_client.addListener('/meta/connect', m => {
_client.addListener('/meta/connect', (m: any) => {
if (m.ext && typeof m.ext.ack === 'number') {
_client.disconnect();
latch.signal();
Expand All @@ -78,7 +81,7 @@ describe('acknowledgment extension', () => {
_client.unregisterExtension('ack');
let metaConnects = 0;
_client.registerExtension('test', {
outgoing: message => {
outgoing: (message: any) => {
if (message.channel === '/meta/connect') {
if (++metaConnects === 3) {
// Decrement the batch number to get the message again.
Expand All @@ -100,7 +103,7 @@ describe('acknowledgment extension', () => {
});

// Store the received messages and verify them.
let messages = [];
let messages: any[] = [];
let messageLatch = new Latch(2, () => {
assert.strictEqual(messages.length, 2);
assert.strictEqual(messages[0], '1');
Expand All @@ -109,10 +112,10 @@ describe('acknowledgment extension', () => {
done();
});
});
_client.handshake(hs => {
_client.handshake((hs: any) => {
if (hs.successful) {
_client.batch(() => {
_client.subscribe('/test', m => {
_client.subscribe('/test', (m: any) => {
messages.push(m.data);
messageLatch.signal();
});
Expand Down
Loading

0 comments on commit 1ee9786

Please sign in to comment.