@powersync/service-rsocket-router 0.1.3 → 0.2.0
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.
- package/LICENSE +3 -3
- package/dist/router/ReactiveSocketRouter.d.ts +2 -0
- package/dist/router/ReactiveSocketRouter.js +29 -3
- package/dist/router/ReactiveSocketRouter.js.map +1 -1
- package/dist/router/transport/WebsocketDuplexConnection.d.ts +14 -0
- package/dist/router/transport/WebsocketDuplexConnection.js +32 -1
- package/dist/router/transport/WebsocketDuplexConnection.js.map +1 -1
- package/dist/router/types.d.ts +5 -0
- package/dist/router/types.js.map +1 -1
- package/package.json +3 -3
package/LICENSE
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Functional Source License, Version 1.1,
|
|
1
|
+
# Functional Source License, Version 1.1, ALv2 Future License
|
|
2
2
|
|
|
3
3
|
## Abbreviation
|
|
4
4
|
|
|
5
|
-
FSL-1.1-
|
|
5
|
+
FSL-1.1-ALv2
|
|
6
6
|
|
|
7
7
|
## Notice
|
|
8
8
|
|
|
9
|
-
Copyright 2023-
|
|
9
|
+
Copyright 2023-2025 Journey Mobile, Inc.
|
|
10
10
|
|
|
11
11
|
## Terms and Conditions
|
|
12
12
|
|
|
@@ -7,6 +7,7 @@ import { Logger } from '@powersync/lib-services-framework';
|
|
|
7
7
|
import * as http from 'http';
|
|
8
8
|
import { Payload } from 'rsocket-core';
|
|
9
9
|
import { SocketRouterObserver } from './SocketRouterListener.js';
|
|
10
|
+
import { WebsocketDuplexConnection } from './transport/WebsocketDuplexConnection.js';
|
|
10
11
|
import { CommonParams, IReactiveStream, IReactiveStreamInput, ReactiveSocketRouterOptions, SocketResponder } from './types.js';
|
|
11
12
|
export interface ReactiveStreamRequest {
|
|
12
13
|
payload: Payload;
|
|
@@ -14,6 +15,7 @@ export interface ReactiveStreamRequest {
|
|
|
14
15
|
dataMimeType: string;
|
|
15
16
|
initialN: number;
|
|
16
17
|
responder: SocketResponder;
|
|
18
|
+
connection: WebsocketDuplexConnection;
|
|
17
19
|
}
|
|
18
20
|
export interface SocketBaseContext {
|
|
19
21
|
logger: Logger;
|
|
@@ -31,7 +31,30 @@ export class ReactiveSocketRouter {
|
|
|
31
31
|
* This follows a similar pattern to the Journey Micro
|
|
32
32
|
* web sockets router.
|
|
33
33
|
*/
|
|
34
|
-
const wss = new ws.WebSocketServer({
|
|
34
|
+
const wss = new ws.WebSocketServer({
|
|
35
|
+
noServer: true,
|
|
36
|
+
perMessageDeflate: {
|
|
37
|
+
zlibDeflateOptions: {
|
|
38
|
+
chunkSize: 128 * 1024, // default is 16kb - increased for better efficiency
|
|
39
|
+
memLevel: 7, // default is 8
|
|
40
|
+
level: 3
|
|
41
|
+
},
|
|
42
|
+
zlibInflateOptions: {
|
|
43
|
+
// for decompressing messages from the client
|
|
44
|
+
chunkSize: 32 * 1024
|
|
45
|
+
},
|
|
46
|
+
// don't keep client context between messages
|
|
47
|
+
clientNoContextTakeover: true,
|
|
48
|
+
// keep context between messages from the server
|
|
49
|
+
serverNoContextTakeover: false,
|
|
50
|
+
// bigger window uses more memory and potentially more cpu. 10-15 is a good range.
|
|
51
|
+
serverMaxWindowBits: 12,
|
|
52
|
+
// Limit concurrent compression threads
|
|
53
|
+
concurrencyLimit: 8,
|
|
54
|
+
// Size (in bytes) below which messages should not be compressed _if context takeover is disabled_.
|
|
55
|
+
threshold: 1024
|
|
56
|
+
}
|
|
57
|
+
});
|
|
35
58
|
server.on('upgrade', (request, socket, head) => {
|
|
36
59
|
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
37
60
|
wss.emit('connection', ws, request);
|
|
@@ -44,7 +67,8 @@ export class ReactiveSocketRouter {
|
|
|
44
67
|
const rSocketServer = new RSocketServer({
|
|
45
68
|
transport,
|
|
46
69
|
acceptor: {
|
|
47
|
-
accept: async (payload) => {
|
|
70
|
+
accept: async (payload, rsocket) => {
|
|
71
|
+
const connection = rsocket.connection;
|
|
48
72
|
const { max_concurrent_connections } = this.options ?? {};
|
|
49
73
|
logger.info(`Currently have ${wss.clients.size} active WebSocket connection(s)`);
|
|
50
74
|
// wss.clients.size includes this connection, so we check for greater than
|
|
@@ -75,7 +99,7 @@ export class ReactiveSocketRouter {
|
|
|
75
99
|
const observer = new SocketRouterObserver();
|
|
76
100
|
const abortController = new AbortController();
|
|
77
101
|
// TODO: Consider limiting the number of active streams per connection to prevent abuse
|
|
78
|
-
handleReactiveStream(context, { payload, initialN, responder, dataMimeType, metadataMimeType }, observer, abortController, params).catch((ex) => {
|
|
102
|
+
handleReactiveStream(context, { payload, initialN, responder, dataMimeType, metadataMimeType, connection }, observer, abortController, params).catch((ex) => {
|
|
79
103
|
context.logger.error(ex);
|
|
80
104
|
responder.onError(ex);
|
|
81
105
|
responder.onComplete();
|
|
@@ -138,6 +162,7 @@ export async function handleReactiveStream(context, request, observer, abortCont
|
|
|
138
162
|
context,
|
|
139
163
|
observer,
|
|
140
164
|
signal: abortController.signal,
|
|
165
|
+
connection: request.connection,
|
|
141
166
|
responder
|
|
142
167
|
});
|
|
143
168
|
if (!isAuthorized.authorized) {
|
|
@@ -151,6 +176,7 @@ export async function handleReactiveStream(context, request, observer, abortCont
|
|
|
151
176
|
observer,
|
|
152
177
|
signal: abortController.signal,
|
|
153
178
|
responder,
|
|
179
|
+
connection: request.connection,
|
|
154
180
|
initialN
|
|
155
181
|
});
|
|
156
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactiveSocketRouter.js","sourceRoot":"","sources":["../../src/router/ReactiveSocketRouter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAU,MAAM,mCAAmC,CAAC;AAEtF,OAAO,EAAW,aAAa,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"ReactiveSocketRouter.js","sourceRoot":"","sources":["../../src/router/ReactiveSocketRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare class WebsocketDuplexConnection extends Deferred implements Duple
|
|
|
5
5
|
private websocketDuplex;
|
|
6
6
|
private rawSocket;
|
|
7
7
|
readonly multiplexerDemultiplexer: Multiplexer & Demultiplexer & FrameHandler;
|
|
8
|
+
readonly tracker: WebSocketTracker;
|
|
8
9
|
constructor(websocketDuplex: Duplex, frame: Frame, multiplexerDemultiplexerFactory: (frame: Frame, outbound: Outbound & Closeable) => Multiplexer & Demultiplexer & FrameHandler, rawSocket: WebSocket.WebSocket);
|
|
9
10
|
get availability(): number;
|
|
10
11
|
close(error?: Error): void;
|
|
@@ -14,3 +15,16 @@ export declare class WebsocketDuplexConnection extends Deferred implements Duple
|
|
|
14
15
|
private handleMessage;
|
|
15
16
|
static create(socket: Duplex, connectionAcceptor: (frame: Frame, connection: DuplexConnection) => Promise<void>, multiplexerDemultiplexerFactory: (frame: Frame, outbound: Outbound & Closeable) => Multiplexer & Demultiplexer & FrameHandler, rawSocket: WebSocket.WebSocket): void;
|
|
16
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Tracks encoding and bytes written on a websocket connection, catering for compressed data.
|
|
20
|
+
*/
|
|
21
|
+
export declare class WebSocketTracker {
|
|
22
|
+
private lastBytesWritten;
|
|
23
|
+
private socket;
|
|
24
|
+
readonly encoding: 'permessage-deflate' | undefined;
|
|
25
|
+
constructor(ws: WebSocket);
|
|
26
|
+
/**
|
|
27
|
+
* Consumes and returns the number of bytes sent.
|
|
28
|
+
*/
|
|
29
|
+
getBytesWritten(): number;
|
|
30
|
+
}
|
|
@@ -20,6 +20,7 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
20
20
|
websocketDuplex;
|
|
21
21
|
rawSocket;
|
|
22
22
|
multiplexerDemultiplexer;
|
|
23
|
+
tracker;
|
|
23
24
|
constructor(websocketDuplex, frame, multiplexerDemultiplexerFactory, rawSocket) {
|
|
24
25
|
super();
|
|
25
26
|
this.websocketDuplex = websocketDuplex;
|
|
@@ -28,6 +29,7 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
28
29
|
websocketDuplex.on('error', this.handleError);
|
|
29
30
|
websocketDuplex.on('data', this.handleMessage);
|
|
30
31
|
this.multiplexerDemultiplexer = multiplexerDemultiplexerFactory(frame, this);
|
|
32
|
+
this.tracker = new WebSocketTracker(this.rawSocket);
|
|
31
33
|
}
|
|
32
34
|
get availability() {
|
|
33
35
|
return this.websocketDuplex.destroyed ? 0 : 1;
|
|
@@ -66,7 +68,9 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
66
68
|
this.close(new Error(e?.reason || 'WebsocketDuplexConnection: Socket closed unexpectedly.'));
|
|
67
69
|
};
|
|
68
70
|
handleError = (e) => {
|
|
69
|
-
|
|
71
|
+
// Example:
|
|
72
|
+
// Error: The socket was closed while data was being compressed
|
|
73
|
+
logger.warn(`Error in WebSocket duplex connection: ${e}`);
|
|
70
74
|
if (!this.done) {
|
|
71
75
|
this.close(e.error);
|
|
72
76
|
}
|
|
@@ -110,4 +114,31 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
110
114
|
});
|
|
111
115
|
}
|
|
112
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Tracks encoding and bytes written on a websocket connection, catering for compressed data.
|
|
119
|
+
*/
|
|
120
|
+
export class WebSocketTracker {
|
|
121
|
+
lastBytesWritten;
|
|
122
|
+
socket;
|
|
123
|
+
encoding;
|
|
124
|
+
constructor(ws) {
|
|
125
|
+
this.socket = ws._socket;
|
|
126
|
+
this.lastBytesWritten = this.socket.bytesWritten;
|
|
127
|
+
// Crude check, but this is the only extension that would actually be used
|
|
128
|
+
if (ws.extensions.includes('permessage-deflate')) {
|
|
129
|
+
this.encoding = 'permessage-deflate';
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
this.encoding = undefined;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Consumes and returns the number of bytes sent.
|
|
137
|
+
*/
|
|
138
|
+
getBytesWritten() {
|
|
139
|
+
const written = this.socket.bytesWritten - this.lastBytesWritten;
|
|
140
|
+
this.lastBytesWritten = this.socket.bytesWritten;
|
|
141
|
+
return written;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
113
144
|
//# sourceMappingURL=WebsocketDuplexConnection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebsocketDuplexConnection.js","sourceRoot":"","sources":["../../../src/router/transport/WebsocketDuplexConnection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"WebsocketDuplexConnection.js","sourceRoot":"","sources":["../../../src/router/transport/WebsocketDuplexConnection.ts"],"names":[],"mappings":"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"}
|
package/dist/router/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as t from 'ts-codec';
|
|
|
2
2
|
import { router } from '@powersync/lib-services-framework';
|
|
3
3
|
import { OnExtensionSubscriber, OnNextSubscriber, OnTerminalSubscriber } from 'rsocket-core';
|
|
4
4
|
import { SocketRouterObserver } from './SocketRouterListener.js';
|
|
5
|
+
import { WebsocketDuplexConnection } from './transport/WebsocketDuplexConnection.js';
|
|
5
6
|
export declare enum RS_ENDPOINT_TYPE {
|
|
6
7
|
STREAM = "stream"
|
|
7
8
|
}
|
|
@@ -17,6 +18,10 @@ export type CommonStreamPayload = {
|
|
|
17
18
|
observer: SocketRouterObserver;
|
|
18
19
|
responder: SocketResponder;
|
|
19
20
|
signal: AbortSignal;
|
|
21
|
+
/**
|
|
22
|
+
* The underlying websocket connection. Should not be used directly apart from tracking metadata.
|
|
23
|
+
*/
|
|
24
|
+
connection: WebsocketDuplexConnection;
|
|
20
25
|
};
|
|
21
26
|
export type ReactiveStreamPayload<O> = CommonStreamPayload & {
|
|
22
27
|
initialN: number;
|
package/dist/router/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAQ9B,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,sEAAsE;IACtE,qCAAiB,CAAA;AACnB,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM;CACf,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/service-rsocket-router",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
-
"license": "FSL-1.1-
|
|
7
|
+
"license": "FSL-1.1-ALv2",
|
|
8
8
|
"publishConfig": {
|
|
9
9
|
"access": "public"
|
|
10
10
|
},
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"ts-codec": "^1.3.0",
|
|
18
18
|
"uuid": "^11.1.0",
|
|
19
19
|
"ws": "^8.17.0",
|
|
20
|
-
"@powersync/lib-services-framework": "0.7.
|
|
20
|
+
"@powersync/lib-services-framework": "0.7.3"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/ws": "~8.2.0",
|