@powersync/service-rsocket-router 0.0.7 → 0.0.8
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 +6 -0
- package/dist/router/ReactiveSocketRouter.js +24 -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,10 +1,16 @@
|
|
|
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';
|
|
5
10
|
import { CommonParams, IReactiveStream, IReactiveStreamInput, ReactiveSocketRouterOptions, SocketResponder } from './types.js';
|
|
6
11
|
export declare class ReactiveSocketRouter<C> {
|
|
7
12
|
protected options?: ReactiveSocketRouterOptions<C> | undefined;
|
|
13
|
+
protected activeConnections: number;
|
|
8
14
|
constructor(options?: ReactiveSocketRouterOptions<C> | undefined);
|
|
9
15
|
reactiveStream<I, O>(path: string, stream: IReactiveStreamInput<I, O, C>): IReactiveStream<I, O, C>;
|
|
10
16
|
/**
|
|
@@ -1,17 +1,13 @@
|
|
|
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;
|
|
10
|
+
this.activeConnections = 0;
|
|
15
11
|
}
|
|
16
12
|
reactiveStream(path, stream) {
|
|
17
13
|
return {
|
|
@@ -44,10 +40,17 @@ export class ReactiveSocketRouter {
|
|
|
44
40
|
transport,
|
|
45
41
|
acceptor: {
|
|
46
42
|
accept: async (payload) => {
|
|
43
|
+
const { max_concurrent_connections } = this.options ?? {};
|
|
44
|
+
if (max_concurrent_connections && this.activeConnections >= max_concurrent_connections) {
|
|
45
|
+
throw new errors.JourneyError({
|
|
46
|
+
code: '429',
|
|
47
|
+
description: `Maximum active concurrent connections limit has been reached`
|
|
48
|
+
});
|
|
49
|
+
}
|
|
47
50
|
// Throwing an exception in this context will be returned to the client side request
|
|
48
51
|
if (!payload.metadata) {
|
|
49
52
|
// Meta data is required for endpoint handler path matching
|
|
50
|
-
throw new
|
|
53
|
+
throw new errors.AuthorizationError('No context meta data provided');
|
|
51
54
|
}
|
|
52
55
|
const context = await params.contextProvider(payload.metadata);
|
|
53
56
|
return {
|
|
@@ -55,12 +58,14 @@ export class ReactiveSocketRouter {
|
|
|
55
58
|
requestStream: (payload, initialN, responder) => {
|
|
56
59
|
const observer = new SocketRouterObserver();
|
|
57
60
|
handleReactiveStream(context, { payload, initialN, responder }, observer, params).catch((ex) => {
|
|
58
|
-
|
|
61
|
+
logger.error(ex);
|
|
59
62
|
responder.onError(ex);
|
|
60
63
|
responder.onComplete();
|
|
61
64
|
});
|
|
65
|
+
this.activeConnections++;
|
|
62
66
|
return {
|
|
63
67
|
cancel: () => {
|
|
68
|
+
this.activeConnections--;
|
|
64
69
|
observer.triggerCancel();
|
|
65
70
|
},
|
|
66
71
|
onExtension: () => observer.triggerExtension(),
|
|
@@ -81,31 +86,32 @@ export class ReactiveSocketRouter {
|
|
|
81
86
|
export async function handleReactiveStream(context, request, observer, params) {
|
|
82
87
|
const { payload, responder, initialN } = request;
|
|
83
88
|
const { metadata } = payload;
|
|
89
|
+
const startTime = new Date();
|
|
84
90
|
const exitWithError = (error) => {
|
|
85
91
|
responder.onError(error);
|
|
86
92
|
responder.onComplete();
|
|
87
93
|
};
|
|
88
94
|
if (!metadata) {
|
|
89
|
-
return exitWithError(new
|
|
95
|
+
return exitWithError(new errors.ValidationError('Metadata is not provided'));
|
|
90
96
|
}
|
|
91
97
|
const meta = await params.metaDecoder(metadata);
|
|
92
98
|
const { path } = meta;
|
|
93
99
|
const route = params.endpoints.find((e) => e.path == path && e.type == RS_ENDPOINT_TYPE.STREAM);
|
|
94
100
|
if (!route) {
|
|
95
|
-
return exitWithError(new
|
|
101
|
+
return exitWithError(new errors.ResourceNotFound('route', `No route for ${path} is configured`));
|
|
96
102
|
}
|
|
97
103
|
const { handler, authorize, validator, decoder = params.payloadDecoder } = route;
|
|
98
104
|
const requestPayload = await decoder(payload.data || undefined);
|
|
99
105
|
if (validator) {
|
|
100
106
|
const isValid = validator.validate(requestPayload);
|
|
101
107
|
if (!isValid.valid) {
|
|
102
|
-
return exitWithError(new
|
|
108
|
+
return exitWithError(new errors.ValidationError(isValid.errors));
|
|
103
109
|
}
|
|
104
110
|
}
|
|
105
111
|
if (authorize) {
|
|
106
112
|
const isAuthorized = await authorize({ params: requestPayload, context, observer, responder });
|
|
107
113
|
if (!isAuthorized.authorized) {
|
|
108
|
-
return exitWithError(new
|
|
114
|
+
return exitWithError(new errors.AuthorizationError(isAuthorized.errors));
|
|
109
115
|
}
|
|
110
116
|
}
|
|
111
117
|
try {
|
|
@@ -118,9 +124,14 @@ export async function handleReactiveStream(context, request, observer, params) {
|
|
|
118
124
|
});
|
|
119
125
|
}
|
|
120
126
|
catch (ex) {
|
|
121
|
-
|
|
127
|
+
logger.error(ex);
|
|
122
128
|
responder.onError(ex);
|
|
123
129
|
responder.onComplete();
|
|
124
130
|
}
|
|
131
|
+
finally {
|
|
132
|
+
logger.info(`STREAM ${path}`, {
|
|
133
|
+
duration_ms: Math.round(new Date().valueOf() - startTime.valueOf() + Number.EPSILON)
|
|
134
|
+
});
|
|
135
|
+
}
|
|
125
136
|
}
|
|
126
137
|
//# 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.8",
|
|
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.0"
|
|
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": {
|