nodecommons-esm-socket-io 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ import { Socket } from 'socket.io';
2
+ import { TEncoded } from 'tscommons-esm-core';
3
+ import { CommonsSocketIoServer } from '../servers/commons-socket-io.server.mjs';
4
+ type TCallback = (data: TEncoded) => TEncoded | undefined;
5
+ type TAsyncCallback = (data: TEncoded) => Promise<TEncoded | undefined>;
6
+ export declare abstract class CommonsSocketIoApi {
7
+ private socketIoServer;
8
+ constructor(socketIoServer: CommonsSocketIoServer);
9
+ protected on(command: string, callback: TCallback): void;
10
+ onAsync(command: string, callback: TAsyncCallback): void;
11
+ broadcast(command: string, data?: TEncoded): Promise<void>;
12
+ direct(socket: Socket, command: string, data?: TEncoded): Promise<void>;
13
+ }
14
+ export {};
@@ -0,0 +1,19 @@
1
+ export class CommonsSocketIoApi {
2
+ socketIoServer;
3
+ constructor(socketIoServer) {
4
+ this.socketIoServer = socketIoServer;
5
+ }
6
+ on(command, callback) {
7
+ this.socketIoServer.on(command, callback);
8
+ }
9
+ onAsync(command, callback) {
10
+ this.socketIoServer.onAsync(command, callback);
11
+ }
12
+ async broadcast(command, data) {
13
+ await this.socketIoServer.broadcast(command, data);
14
+ }
15
+ async direct(socket, command, data) {
16
+ await this.socketIoServer.direct(socket, command, data);
17
+ }
18
+ }
19
+ //# sourceMappingURL=commons-socket-io-api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-socket-io-api.mjs","sourceRoot":"","sources":["../../src/classes/commons-socket-io-api.mts"],"names":[],"mappings":"AASA,MAAM,OAAgB,kBAAkB;IAE7B;IADV,YACU,cAAqC;QAArC,mBAAc,GAAd,cAAc,CAAuB;IAC5C,CAAC;IAEM,EAAE,CACV,OAAe,EACf,QAAmB;QAEpB,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEM,OAAO,CACZ,OAAe,EACf,QAAwB;QAEzB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,OAAe,EACf,IAAe;QAEhB,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,MAAc,EACd,OAAe,EACf,IAAe;QAEhB,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ import { commonsSocketIoBuildOptions, commonsSocketIoBuildUrl, CommonsSocketIoClientService } from './services/commons-socket-io-client.service.mjs';
2
+ import { commonsSocketIoBuildDefaultOptions, CommonsSocketIoServer } from './servers/commons-socket-io.server.mjs';
3
+ import { CommonsSocketIoApi } from './classes/commons-socket-io-api.mjs';
4
+ export { commonsSocketIoBuildOptions, commonsSocketIoBuildUrl, CommonsSocketIoClientService, commonsSocketIoBuildDefaultOptions, CommonsSocketIoServer, CommonsSocketIoApi };
package/dist/index.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { commonsSocketIoBuildOptions, commonsSocketIoBuildUrl, CommonsSocketIoClientService } from './services/commons-socket-io-client.service.mjs';
2
+ import { commonsSocketIoBuildDefaultOptions, CommonsSocketIoServer } from './servers/commons-socket-io.server.mjs';
3
+ import { CommonsSocketIoApi } from './classes/commons-socket-io-api.mjs';
4
+ export { commonsSocketIoBuildOptions, commonsSocketIoBuildUrl, CommonsSocketIoClientService, commonsSocketIoBuildDefaultOptions, CommonsSocketIoServer, CommonsSocketIoApi };
5
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AACrJ,OAAO,EAAE,kCAAkC,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACnH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EACN,2BAA2B,EAC3B,uBAAuB,EACvB,4BAA4B,EAC5B,kCAAkC,EAClC,qBAAqB,EACrB,kBAAkB,EAClB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import * as http from 'http';
2
+ import * as https from 'https';
3
+ import { Socket, ServerOptions } from 'socket.io';
4
+ import { TEncoded } from 'tscommons-esm-core';
5
+ import { ICommonsHttpConfig } from 'nodecommons-esm-http';
6
+ type TCallback = (data: TEncoded) => TEncoded | undefined;
7
+ type TAsyncCallback = (data: TEncoded) => Promise<TEncoded | undefined>;
8
+ export declare function commonsSocketIoBuildDefaultOptions(httpConfig: ICommonsHttpConfig): Partial<ServerOptions>;
9
+ export declare abstract class CommonsSocketIoServer {
10
+ private socketIo;
11
+ private internalEnabled;
12
+ private sockets;
13
+ private ons;
14
+ private onAsyncs;
15
+ private ids;
16
+ constructor(httpServer: http.Server | https.Server, defaultEnabled?: boolean, options?: Partial<ServerOptions>);
17
+ protected onConnect(id: string, socket: Socket): boolean;
18
+ protected onDisconnect(id: string): void;
19
+ private init;
20
+ protected getSocketById(id: string): Socket | undefined;
21
+ kickAll(): void;
22
+ get enabled(): boolean;
23
+ set enabled(state: boolean);
24
+ on(command: string, callback: TCallback): void;
25
+ onAsync(command: string, callback: TAsyncCallback): void;
26
+ broadcast(command: string, data?: TEncoded): Promise<void>;
27
+ direct(socket: Socket, command: string, data?: TEncoded): Promise<void>;
28
+ }
29
+ export {};
@@ -0,0 +1,134 @@
1
+ import { Server } from 'socket.io';
2
+ import { commonsBase62GenerateRandomId } from 'tscommons-esm-core';
3
+ import { commonsNginxProxyPath } from 'nodecommons-esm-http';
4
+ export function commonsSocketIoBuildDefaultOptions(httpConfig) {
5
+ const path = commonsNginxProxyPath(httpConfig.path);
6
+ const options = {
7
+ transports: ['websocket', 'polling']
8
+ };
9
+ if (path !== undefined)
10
+ options.path = `${path}${path.endsWith('/') ? '' : '/'}socket.io`;
11
+ return options;
12
+ }
13
+ export class CommonsSocketIoServer {
14
+ socketIo;
15
+ internalEnabled;
16
+ sockets = new Map();
17
+ ons = new Map();
18
+ onAsyncs = new Map();
19
+ ids = [];
20
+ constructor(httpServer, defaultEnabled, options) {
21
+ this.socketIo = new Server(httpServer, options);
22
+ this.init();
23
+ this.internalEnabled = defaultEnabled === false ? false : true;
24
+ }
25
+ onConnect(id, socket) {
26
+ this.sockets.set(id, socket);
27
+ return true;
28
+ }
29
+ onDisconnect(id) {
30
+ this.sockets.delete(id);
31
+ }
32
+ init() {
33
+ this.socketIo.on('connection', (socket) => {
34
+ let id = '';
35
+ for (let i = 100; i-- > 0;) {
36
+ id = commonsBase62GenerateRandomId();
37
+ if (!this.ids.includes(id))
38
+ break;
39
+ }
40
+ if (id === '')
41
+ throw new Error('Unable to generate ID. This is extremely unlikely?');
42
+ if (!this.onConnect(id, socket)) {
43
+ socket.disconnect(true);
44
+ return;
45
+ }
46
+ for (const command of this.ons.keys()) {
47
+ const callback = this.ons.get(command);
48
+ socket.on(command, callback);
49
+ }
50
+ for (const command of this.onAsyncs.keys()) {
51
+ const callback = this.onAsyncs.get(command);
52
+ socket.on(command, (a, response) => {
53
+ void callback(a, response);
54
+ });
55
+ }
56
+ socket.on('disconnect', () => {
57
+ this.onDisconnect(id);
58
+ });
59
+ // This isn't part of the socket.io library, so is implemented manually
60
+ socket.on('commons-socket.io-identify-self-uid', (_, response) => {
61
+ response(id);
62
+ });
63
+ });
64
+ }
65
+ getSocketById(id) {
66
+ return this.sockets.get(id);
67
+ }
68
+ kickAll() {
69
+ for (const socket of this.sockets.values()) {
70
+ socket.disconnect(true);
71
+ }
72
+ }
73
+ get enabled() {
74
+ return this.internalEnabled;
75
+ }
76
+ set enabled(state) {
77
+ this.internalEnabled = state;
78
+ }
79
+ on(command, callback) {
80
+ this.ons.set(command, (data, response) => {
81
+ try {
82
+ const outcome = callback(data);
83
+ response(outcome);
84
+ }
85
+ catch (e) {
86
+ console.error(`Socket IO server on event generated an Error: ${e.message}`);
87
+ }
88
+ });
89
+ }
90
+ onAsync(command, callback) {
91
+ this.onAsyncs.set(command, async (data, response) => {
92
+ try {
93
+ const outcome = await callback(data);
94
+ response(outcome);
95
+ }
96
+ catch (e) {
97
+ console.error(`Socket IO server on event generated an Error: ${e.message}`);
98
+ }
99
+ });
100
+ }
101
+ async broadcast(command, data) {
102
+ return new Promise((resolve, reject) => {
103
+ if (!this.internalEnabled) {
104
+ reject(new Error('Cannot broadcast: socket is not enabled'));
105
+ return;
106
+ }
107
+ if (data === undefined) {
108
+ this.socketIo.emit(command);
109
+ resolve();
110
+ }
111
+ else {
112
+ this.socketIo.emit(command, data);
113
+ resolve();
114
+ }
115
+ });
116
+ }
117
+ async direct(socket, command, data) {
118
+ return new Promise((resolve, reject) => {
119
+ if (!this.internalEnabled) {
120
+ reject(new Error('Cannot direct: socket is not enabled'));
121
+ return;
122
+ }
123
+ if (data === undefined) {
124
+ socket.emit(command);
125
+ resolve();
126
+ }
127
+ else {
128
+ socket.emit(command, data);
129
+ resolve();
130
+ }
131
+ });
132
+ }
133
+ }
134
+ //# sourceMappingURL=commons-socket-io.server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-socket-io.server.mjs","sourceRoot":"","sources":["../../src/servers/commons-socket-io.server.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { ManagerOptions } from 'socket.io-client';
2
+ import { TEncoded, TPropertyObject } from 'tscommons-esm-core';
3
+ type TConnectionCallback = () => void;
4
+ type TErrorCallback = (error: Error) => void;
5
+ export declare function commonsSocketIoBuildOptions(url: string): Partial<ManagerOptions>;
6
+ export declare function commonsSocketIoBuildUrl(url: string): string;
7
+ export declare abstract class CommonsSocketIoClientService {
8
+ private url;
9
+ private defaultEnabled?;
10
+ private options?;
11
+ private connectCallbacks;
12
+ private disconnectCallbacks;
13
+ private errorCallbacks;
14
+ private socket?;
15
+ private internalConnected;
16
+ private internalEnabled;
17
+ constructor(url: string, defaultEnabled?: boolean | undefined, options?: Partial<ManagerOptions> | undefined);
18
+ addConnectCallback(callback: TConnectionCallback): void;
19
+ addDisconnectCallback(callback: TConnectionCallback): void;
20
+ addErrorCallback(callback: TErrorCallback): void;
21
+ getId(): Promise<string | undefined>;
22
+ connect(params?: TPropertyObject<string | number | boolean>): boolean;
23
+ disconnect(): void;
24
+ protected abstract setupOns(): void;
25
+ get enabled(): boolean;
26
+ set enabled(state: boolean);
27
+ get isConnected(): boolean;
28
+ protected on(command: string, callback: (data?: TEncoded) => void): void;
29
+ protected emit(command: string, data?: TEncoded): Promise<TEncoded>;
30
+ }
31
+ export {};
@@ -0,0 +1,139 @@
1
+ import { io } from 'socket.io-client';
2
+ import { commonsBase62IsId, commonsTypeIsString } from 'tscommons-esm-core';
3
+ export function commonsSocketIoBuildOptions(url) {
4
+ const options = {
5
+ transports: ['websocket', 'polling']
6
+ };
7
+ if (url.startsWith('/')) {
8
+ options.path = `${url}${url.endsWith('/') ? '' : '/'}socket.io`;
9
+ }
10
+ else {
11
+ const regexp = /^http(?:s?):\/\/[^/]+\/(.+)$/i;
12
+ const match = regexp.exec(url);
13
+ if (match !== null) {
14
+ options.path = `/${match[1]}${match[1].endsWith('/') ? '' : '/'}socket.io`;
15
+ }
16
+ }
17
+ return options;
18
+ }
19
+ export function commonsSocketIoBuildUrl(url) {
20
+ if (url.startsWith('/'))
21
+ return '/';
22
+ const regexp = /^(http(?:s?):\/\/[^/]+\/).+$/i;
23
+ const match = regexp.exec(url);
24
+ if (match !== null)
25
+ return match[1];
26
+ return url;
27
+ }
28
+ export class CommonsSocketIoClientService {
29
+ url;
30
+ defaultEnabled;
31
+ options;
32
+ connectCallbacks = [];
33
+ disconnectCallbacks = [];
34
+ errorCallbacks = [];
35
+ socket;
36
+ internalConnected = false;
37
+ internalEnabled;
38
+ constructor(url, defaultEnabled, options) {
39
+ this.url = url;
40
+ this.defaultEnabled = defaultEnabled;
41
+ this.options = options;
42
+ }
43
+ addConnectCallback(callback) {
44
+ this.connectCallbacks.push(callback);
45
+ }
46
+ addDisconnectCallback(callback) {
47
+ this.disconnectCallbacks.push(callback);
48
+ }
49
+ addErrorCallback(callback) {
50
+ this.errorCallbacks.push(callback);
51
+ }
52
+ // This isn't part of the socket.io library, so requests any server to implement it manually
53
+ async getId() {
54
+ const result = await this.emit('commons-socket.io-identify-self-uid', {});
55
+ if (!commonsTypeIsString(result))
56
+ return undefined;
57
+ if (!commonsBase62IsId(result))
58
+ return undefined;
59
+ return result;
60
+ }
61
+ connect(params) {
62
+ if (this.socket)
63
+ return true; // already connected
64
+ const options = this.options || {};
65
+ if (params) {
66
+ const asStrings = {};
67
+ for (const key of Object.keys(params)) {
68
+ asStrings[key] = params[key].toString();
69
+ }
70
+ options.query = asStrings;
71
+ }
72
+ this.socket = io(this.url, options);
73
+ if (!this.socket)
74
+ return false;
75
+ this.socket.on('connect', () => {
76
+ this.internalConnected = true;
77
+ if (this.internalEnabled === undefined)
78
+ this.internalEnabled = this.defaultEnabled === false ? false : true;
79
+ for (const callback of this.connectCallbacks)
80
+ callback();
81
+ });
82
+ this.socket.on('disconnect', () => {
83
+ this.internalConnected = false;
84
+ for (const callback of this.disconnectCallbacks)
85
+ callback();
86
+ });
87
+ this.socket.on('error', (e) => {
88
+ for (const callback of this.errorCallbacks)
89
+ callback(e);
90
+ });
91
+ this.socket.on('connect_error', (e) => {
92
+ for (const callback of this.errorCallbacks)
93
+ callback(e);
94
+ });
95
+ this.setupOns();
96
+ return true;
97
+ }
98
+ disconnect() {
99
+ if (this.socket === undefined)
100
+ return;
101
+ this.socket.disconnect();
102
+ }
103
+ get enabled() {
104
+ return this.internalEnabled ? true : false;
105
+ }
106
+ set enabled(state) {
107
+ this.internalEnabled = state;
108
+ }
109
+ get isConnected() {
110
+ return this.socket !== undefined && this.internalConnected;
111
+ }
112
+ on(command, callback) {
113
+ if (!this.socket)
114
+ return; // shouldn't really be possible if the class is being used properly with setupOns
115
+ this.socket.on(command, (data) => {
116
+ if (!this.isConnected)
117
+ return; // is this possible?
118
+ if (!this.internalEnabled)
119
+ return;
120
+ callback(data);
121
+ });
122
+ }
123
+ async emit(command, data) {
124
+ return new Promise((resolve, reject) => {
125
+ if (!this.isConnected) {
126
+ reject(new Error('Socket is not currently connected'));
127
+ return;
128
+ }
129
+ if (!this.internalEnabled) {
130
+ reject(new Error('Socket is not currently enabled'));
131
+ return;
132
+ }
133
+ this.socket.emit(command, data, (response) => {
134
+ resolve(response);
135
+ });
136
+ });
137
+ }
138
+ }
139
+ //# sourceMappingURL=commons-socket-io-client.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-socket-io-client.service.mjs","sourceRoot":"","sources":["../../src/services/commons-socket-io-client.service.mts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "nodecommons-esm-socket-io",
3
+ "version": "0.0.2",
4
+ "description": "",
5
+ "scripts": {
6
+ "tsc": "./node_modules/typescript/bin/tsc",
7
+ "preprepare": "rm -rf ./dist; php ~/Dev/etim.php src/ && npm run tsc",
8
+ "publish-major": "rm -rf dist; npm run tsc && npx eslint . && npm run preprepare && npm version major && npm install && npm publish && git add . && git commit -m 'publish'",
9
+ "publish-minor": "rm -rf dist; npm run tsc && npx eslint . && npm run preprepare && npm version minor && npm install && npm publish && git add . && git commit -m 'publish'",
10
+ "publish-patch": "rm -rf dist; npm run tsc && npx eslint . && npm run preprepare && npm version patch && npm install && npm publish && git add . && git commit -m 'publish'"
11
+ },
12
+ "main": "dist/index.mjs",
13
+ "types": "dist/index.d.mjs",
14
+ "type": "module",
15
+ "author": "Pete Morris",
16
+ "license": "ISC",
17
+ "devDependencies": {
18
+ "@stylistic/eslint-plugin-ts": "^2.11.0",
19
+ "@types/node": "^22.10.0",
20
+ "eslint-plugin-import": "^2.31.0",
21
+ "eslint-plugin-prefer-arrow-functions": "^3.4.1",
22
+ "typescript": "^5.7.2",
23
+ "typescript-eslint": "^8.16.0"
24
+ },
25
+ "files": [
26
+ "dist/**/*"
27
+ ],
28
+ "dependencies": {
29
+ "nodecommons-esm-http": "^0.0.6",
30
+ "socket.io": "^4.8.1",
31
+ "socket.io-client": "^4.8.1",
32
+ "tscommons-esm-core": "^0.0.4"
33
+ }
34
+ }