@powersync/service-rsocket-router 0.0.7 → 0.0.9
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/README.md +1 -1
- package/dist/router/ReactiveSocketRouter.d.ts +5 -0
- package/dist/router/ReactiveSocketRouter.js +27 -13
- package/dist/router/ReactiveSocketRouter.js.map +1 -1
- package/dist/router/transport/WebSocketServerTransport.js +2 -2
- package/dist/router/transport/WebSocketServerTransport.js.map +1 -1
- package/dist/router/transport/WebsocketDuplexConnection.js +4 -4
- package/dist/router/transport/WebsocketDuplexConnection.js.map +1 -1
- package/dist/router/types.d.ts +6 -4
- package/dist/router/types.js.map +1 -1
- package/dist/utils/BaseObserver.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/**
|
|
3
|
+
* This is a small Router wrapper which uses the RSocket lib
|
|
4
|
+
* to expose reactive websocket stream in an interface similar to
|
|
5
|
+
* other Journey micro routers.
|
|
6
|
+
*/
|
|
2
7
|
import * as http from 'http';
|
|
3
8
|
import { Payload } from 'rsocket-core';
|
|
4
9
|
import { SocketRouterObserver } from './SocketRouterListener.js';
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This is a small Router wrapper which uses the RSocket lib
|
|
3
|
-
* to expose reactive websocket stream in an interface similar to
|
|
4
|
-
* other journey micro routers.
|
|
5
|
-
*/
|
|
6
|
-
import * as micro from '@journeyapps-platform/micro';
|
|
7
1
|
import { RSocketServer } from 'rsocket-core';
|
|
8
2
|
import * as ws from 'ws';
|
|
9
3
|
import { SocketRouterObserver } from './SocketRouterListener.js';
|
|
10
4
|
import { RS_ENDPOINT_TYPE } from './types.js';
|
|
11
5
|
import { WebsocketServerTransport } from './transport/WebSocketServerTransport.js';
|
|
6
|
+
import { errors, logger } from '@powersync/lib-services-framework';
|
|
12
7
|
export class ReactiveSocketRouter {
|
|
13
8
|
constructor(options) {
|
|
14
9
|
this.options = options;
|
|
@@ -44,18 +39,31 @@ export class ReactiveSocketRouter {
|
|
|
44
39
|
transport,
|
|
45
40
|
acceptor: {
|
|
46
41
|
accept: async (payload) => {
|
|
42
|
+
const { max_concurrent_connections } = this.options ?? {};
|
|
43
|
+
// wss.clients.size includes this connection, so we check for greater than
|
|
44
|
+
// TODO: Share connection limit between this and http stream connections
|
|
45
|
+
if (max_concurrent_connections && wss.clients.size > max_concurrent_connections) {
|
|
46
|
+
const err = new errors.JourneyError({
|
|
47
|
+
status: 429,
|
|
48
|
+
code: 'SERVER_BUSY',
|
|
49
|
+
description: `Maximum active concurrent connections limit has been reached`
|
|
50
|
+
});
|
|
51
|
+
logger.warn(err);
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
47
54
|
// Throwing an exception in this context will be returned to the client side request
|
|
48
55
|
if (!payload.metadata) {
|
|
49
56
|
// Meta data is required for endpoint handler path matching
|
|
50
|
-
throw new
|
|
57
|
+
throw new errors.AuthorizationError('No context meta data provided');
|
|
51
58
|
}
|
|
52
59
|
const context = await params.contextProvider(payload.metadata);
|
|
53
60
|
return {
|
|
54
61
|
// RequestStream is currently the only supported connection type
|
|
55
62
|
requestStream: (payload, initialN, responder) => {
|
|
56
63
|
const observer = new SocketRouterObserver();
|
|
64
|
+
// TODO: Consider limiting the number of active streams per connection to prevent abuse
|
|
57
65
|
handleReactiveStream(context, { payload, initialN, responder }, observer, params).catch((ex) => {
|
|
58
|
-
|
|
66
|
+
logger.error(ex);
|
|
59
67
|
responder.onError(ex);
|
|
60
68
|
responder.onComplete();
|
|
61
69
|
});
|
|
@@ -81,31 +89,32 @@ export class ReactiveSocketRouter {
|
|
|
81
89
|
export async function handleReactiveStream(context, request, observer, params) {
|
|
82
90
|
const { payload, responder, initialN } = request;
|
|
83
91
|
const { metadata } = payload;
|
|
92
|
+
const startTime = new Date();
|
|
84
93
|
const exitWithError = (error) => {
|
|
85
94
|
responder.onError(error);
|
|
86
95
|
responder.onComplete();
|
|
87
96
|
};
|
|
88
97
|
if (!metadata) {
|
|
89
|
-
return exitWithError(new
|
|
98
|
+
return exitWithError(new errors.ValidationError('Metadata is not provided'));
|
|
90
99
|
}
|
|
91
100
|
const meta = await params.metaDecoder(metadata);
|
|
92
101
|
const { path } = meta;
|
|
93
102
|
const route = params.endpoints.find((e) => e.path == path && e.type == RS_ENDPOINT_TYPE.STREAM);
|
|
94
103
|
if (!route) {
|
|
95
|
-
return exitWithError(new
|
|
104
|
+
return exitWithError(new errors.ResourceNotFound('route', `No route for ${path} is configured`));
|
|
96
105
|
}
|
|
97
106
|
const { handler, authorize, validator, decoder = params.payloadDecoder } = route;
|
|
98
107
|
const requestPayload = await decoder(payload.data || undefined);
|
|
99
108
|
if (validator) {
|
|
100
109
|
const isValid = validator.validate(requestPayload);
|
|
101
110
|
if (!isValid.valid) {
|
|
102
|
-
return exitWithError(new
|
|
111
|
+
return exitWithError(new errors.ValidationError(isValid.errors));
|
|
103
112
|
}
|
|
104
113
|
}
|
|
105
114
|
if (authorize) {
|
|
106
115
|
const isAuthorized = await authorize({ params: requestPayload, context, observer, responder });
|
|
107
116
|
if (!isAuthorized.authorized) {
|
|
108
|
-
return exitWithError(new
|
|
117
|
+
return exitWithError(new errors.AuthorizationError(isAuthorized.errors));
|
|
109
118
|
}
|
|
110
119
|
}
|
|
111
120
|
try {
|
|
@@ -118,9 +127,14 @@ export async function handleReactiveStream(context, request, observer, params) {
|
|
|
118
127
|
});
|
|
119
128
|
}
|
|
120
129
|
catch (ex) {
|
|
121
|
-
|
|
130
|
+
logger.error(ex);
|
|
122
131
|
responder.onError(ex);
|
|
123
132
|
responder.onComplete();
|
|
124
133
|
}
|
|
134
|
+
finally {
|
|
135
|
+
logger.info(`STREAM ${path}`, {
|
|
136
|
+
duration_ms: Math.round(new Date().valueOf() - startTime.valueOf() + Number.EPSILON)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
125
139
|
}
|
|
126
140
|
//# sourceMappingURL=ReactiveSocketRouter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactiveSocketRouter.js","sourceRoot":"","sources":["../../src/router/ReactiveSocketRouter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ReactiveSocketRouter.js","sourceRoot":"","sources":["../../src/router/ReactiveSocketRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { Deferred } from 'rsocket-core';
|
|
18
18
|
import * as WebSocket from 'ws';
|
|
19
19
|
import { WebsocketDuplexConnection } from './WebsocketDuplexConnection.js';
|
|
20
|
-
import
|
|
20
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
21
21
|
const defaultFactory = (options) => {
|
|
22
22
|
return new WebSocket.WebSocketServer({
|
|
23
23
|
host: options.host,
|
|
@@ -40,7 +40,7 @@ export class WebsocketServerTransport {
|
|
|
40
40
|
WebsocketDuplexConnection.create(duplex, connectionAcceptor, multiplexerDemultiplexerFactory, websocket);
|
|
41
41
|
}
|
|
42
42
|
catch (ex) {
|
|
43
|
-
|
|
43
|
+
logger.error(`Could not create duplex connection`, ex);
|
|
44
44
|
if (websocket.readyState == websocket.OPEN) {
|
|
45
45
|
websocket.close();
|
|
46
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketServerTransport.js","sourceRoot":"","sources":["../../../src/router/transport/WebSocketServerTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAEL,QAAQ,EAQT,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"WebSocketServerTransport.js","sourceRoot":"","sources":["../../../src/router/transport/WebSocketServerTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
import
|
|
17
|
+
import { logger } from '@powersync/lib-services-framework';
|
|
18
18
|
import { Deferred, deserializeFrame, serializeFrame } from 'rsocket-core';
|
|
19
19
|
export class WebsocketDuplexConnection extends Deferred {
|
|
20
20
|
constructor(websocketDuplex, frame, multiplexerDemultiplexerFactory, rawSocket) {
|
|
@@ -25,7 +25,7 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
25
25
|
this.close(new Error(e.reason || 'WebsocketDuplexConnection: Socket closed unexpectedly.'));
|
|
26
26
|
};
|
|
27
27
|
this.handleError = (e) => {
|
|
28
|
-
|
|
28
|
+
logger.error(`Error in WebSocket duplex connection: ${e}`);
|
|
29
29
|
this.close(e.error);
|
|
30
30
|
};
|
|
31
31
|
this.handleMessage = (buffer) => {
|
|
@@ -82,7 +82,7 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
catch (ex) {
|
|
85
|
-
|
|
85
|
+
logger.info(`Received error deserializing initial frame buffer. Skipping connection request.`, ex);
|
|
86
86
|
// The initial frame should always be parsable
|
|
87
87
|
return socket.end();
|
|
88
88
|
}
|
|
@@ -96,7 +96,7 @@ export class WebsocketDuplexConnection extends Deferred {
|
|
|
96
96
|
socket.resume();
|
|
97
97
|
}
|
|
98
98
|
catch (error) {
|
|
99
|
-
|
|
99
|
+
logger.info(`Error accepting connection:`, error);
|
|
100
100
|
connection.close(error);
|
|
101
101
|
}
|
|
102
102
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebsocketDuplexConnection.js","sourceRoot":"","sources":["../../../src/router/transport/WebsocketDuplexConnection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,
|
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { router as micro_router } from '@journeyapps-platform/micro';
|
|
3
2
|
import * as t from 'ts-codec';
|
|
3
|
+
import { router } from '@powersync/lib-services-framework';
|
|
4
4
|
import { OnExtensionSubscriber, OnNextSubscriber, OnTerminalSubscriber } from 'rsocket-core';
|
|
5
5
|
import { SocketRouterObserver } from './SocketRouterListener.js';
|
|
6
6
|
export declare enum RS_ENDPOINT_TYPE {
|
|
@@ -10,7 +10,9 @@ export declare const RSocketRequestMeta: t.ObjectCodec<{
|
|
|
10
10
|
path: t.IdentityCodec<t.CodecType.String>;
|
|
11
11
|
}>;
|
|
12
12
|
export type RequestMeta = t.Decoded<typeof RSocketRequestMeta>;
|
|
13
|
-
export type ReactiveSocketRouterOptions<C> = {
|
|
13
|
+
export type ReactiveSocketRouterOptions<C> = {
|
|
14
|
+
max_concurrent_connections?: number;
|
|
15
|
+
};
|
|
14
16
|
export type SocketResponder = OnTerminalSubscriber & OnNextSubscriber & OnExtensionSubscriber;
|
|
15
17
|
export type CommonStreamPayload = {
|
|
16
18
|
observer: SocketRouterObserver;
|
|
@@ -19,7 +21,7 @@ export type CommonStreamPayload = {
|
|
|
19
21
|
export type ReactiveStreamPayload<O> = CommonStreamPayload & {
|
|
20
22
|
initialN: number;
|
|
21
23
|
};
|
|
22
|
-
export type IReactiveStream<I = any, O = any, C = any> =
|
|
24
|
+
export type IReactiveStream<I = any, O = any, C = any> = Omit<router.Endpoint<I, O, C, router.EndpointHandlerPayload<I, C> & CommonStreamPayload, router.EndpointHandler<router.EndpointHandlerPayload<I, C> & ReactiveStreamPayload<O>, undefined>>, 'method'> & {
|
|
23
25
|
type: RS_ENDPOINT_TYPE.STREAM;
|
|
24
26
|
/**
|
|
25
27
|
* Decodes raw payload buffer to [I].
|
|
@@ -27,7 +29,7 @@ export type IReactiveStream<I = any, O = any, C = any> = micro_router.Endpoint<I
|
|
|
27
29
|
*/
|
|
28
30
|
decoder?: (rawData?: Buffer) => Promise<I>;
|
|
29
31
|
};
|
|
30
|
-
export type IReactiveStreamInput<I, O, C> = Omit<IReactiveStream<I, O, C>, 'path' | 'type'>;
|
|
32
|
+
export type IReactiveStreamInput<I, O, C> = Omit<IReactiveStream<I, O, C>, 'path' | 'type' | 'method'>;
|
|
31
33
|
export type ReactiveEndpoint = IReactiveStream;
|
|
32
34
|
export type CommonParams<C> = {
|
|
33
35
|
endpoints: Array<ReactiveEndpoint>;
|
package/dist/router/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAO9B,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseObserver.js","sourceRoot":"","sources":["../../src/utils/BaseObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,MAAM,OAAO,YAAY;IAGvB;QACE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB,CAAC,QAAoB;QACnC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,EAAiC;QAChD,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE
|
|
1
|
+
{"version":3,"file":"BaseObserver.js","sourceRoot":"","sources":["../../src/utils/BaseObserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,MAAM,OAAO,YAAY;IAGvB;QACE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB,CAAC,QAAoB;QACnC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,EAAiC;QAChD,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACvB;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,EAA0C;QACpE,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5B,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7B;IACH,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/service-rsocket-router",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.9",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "FSL-1.1-Apache-2.0",
|
|
@@ -13,18 +13,18 @@
|
|
|
13
13
|
],
|
|
14
14
|
"type": "module",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@journeyapps-platform/micro": "^17.0.1",
|
|
17
16
|
"rsocket-core": "1.0.0-alpha.3",
|
|
18
17
|
"ts-codec": "^1.2.2",
|
|
19
18
|
"uuid": "^9.0.1",
|
|
20
|
-
"ws": "^8.17.0"
|
|
19
|
+
"ws": "^8.17.0",
|
|
20
|
+
"@powersync/lib-services-framework": "0.1.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/uuid": "^9.0.4",
|
|
24
24
|
"@types/ws": "~8.2.0",
|
|
25
25
|
"bson": "^6.6.0",
|
|
26
26
|
"rsocket-websocket-client": "1.0.0-alpha.3",
|
|
27
|
-
"typescript": "
|
|
27
|
+
"typescript": "~5.2.2",
|
|
28
28
|
"vitest": "^0.34.6"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|