awesomerpc 0.1.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/README.md +59 -0
- package/lib/error.d.ts +29 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +43 -0
- package/lib/error.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5 -0
- package/lib/index.js.map +1 -0
- package/lib/integration.test.d.ts +2 -0
- package/lib/integration.test.d.ts.map +1 -0
- package/lib/integration.test.js +90 -0
- package/lib/integration.test.js.map +1 -0
- package/lib/protocol.d.ts +30 -0
- package/lib/protocol.d.ts.map +1 -0
- package/lib/protocol.js +140 -0
- package/lib/protocol.js.map +1 -0
- package/lib/proxy.d.ts +13 -0
- package/lib/proxy.d.ts.map +1 -0
- package/lib/proxy.js +16 -0
- package/lib/proxy.js.map +1 -0
- package/lib/rpc.d.ts +43 -0
- package/lib/rpc.d.ts.map +1 -0
- package/lib/rpc.js +395 -0
- package/lib/rpc.js.map +1 -0
- package/lib/serve/hono.d.ts +7 -0
- package/lib/serve/hono.d.ts.map +1 -0
- package/lib/serve/hono.js +31 -0
- package/lib/serve/hono.js.map +1 -0
- package/lib/transport.d.ts +63 -0
- package/lib/transport.d.ts.map +1 -0
- package/lib/transport.js +151 -0
- package/lib/transport.js.map +1 -0
- package/lib/types.d.ts +84 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +135 -0
- package/lib/types.js.map +1 -0
- package/lib/util.d.ts +13 -0
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +21 -0
- package/lib/util.js.map +1 -0
- package/package.json +38 -0
- package/src/error.ts +44 -0
- package/src/index.ts +6 -0
- package/src/integration.test.ts +110 -0
- package/src/protocol.ts +155 -0
- package/src/proxy.ts +28 -0
- package/src/rpc.ts +453 -0
- package/src/serve/hono.ts +51 -0
- package/src/transport.ts +200 -0
- package/src/types.ts +217 -0
- package/src/util.ts +32 -0
- package/tsconfig.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# AwesomeRPC
|
|
2
|
+
|
|
3
|
+
AwesomeRPC is an easy-to-use RPC framework written in TypeScript. It features
|
|
4
|
+
advanced reflection capabilities, allowing you to define type-safe APIs in nothing
|
|
5
|
+
more than a bit of TypeScript. No copy-pasting or code generators needed!
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
First, you need to define a _contract_ for your API. A contract is kind of like
|
|
10
|
+
a TypeScript interface: it defines what methods (and events) are allowed.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { contract } from "awesomerpc";
|
|
14
|
+
|
|
15
|
+
// A client API that connects to the server in the browser via web sockets
|
|
16
|
+
const petStoreClientContract = contract({
|
|
17
|
+
// These methods the server can call on the client at any time
|
|
18
|
+
methods: {
|
|
19
|
+
refresh: t.callable([] as const, t.void()),
|
|
20
|
+
},
|
|
21
|
+
// These events may be received by the client, coming from the server
|
|
22
|
+
events: {
|
|
23
|
+
logout: t.undefined(),
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Next, you need to implement this contract, like so:
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import { implement } from "awesomerpc";
|
|
32
|
+
|
|
33
|
+
const petStoreClientImpl = implement(petStoreClient)
|
|
34
|
+
.method('refresh', (_ctx) => {
|
|
35
|
+
window.location.reload();
|
|
36
|
+
})
|
|
37
|
+
.finish();
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Finally, you can connect to the server using, for example, the browser's web socket:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { WebSocketTransport, RPC } from "awesomerpc";
|
|
44
|
+
|
|
45
|
+
const transport = new WebSocketTransport(`http://localhost:8080/ws`);
|
|
46
|
+
transport.open(); // will open the socket in the background
|
|
47
|
+
|
|
48
|
+
const rpc = new RPC(
|
|
49
|
+
transport,
|
|
50
|
+
petStoreClientImpl, // local API
|
|
51
|
+
petStoreServerContract, // remote API
|
|
52
|
+
{} // local state
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
console.log(`Available products: ${await rpc.callMethod('getProducts', [])}`);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
For more information, read the full example in the `example/` directory.
|
|
59
|
+
|
package/lib/error.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ValidationError } from "reflect-types";
|
|
2
|
+
export declare class RPCError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* An error that was caused by the remote doing something wrong.
|
|
6
|
+
*/
|
|
7
|
+
export declare class RemoteError extends RPCError {
|
|
8
|
+
}
|
|
9
|
+
export declare class ProtocolError extends RemoteError {
|
|
10
|
+
}
|
|
11
|
+
export declare class MethodNotFoundError extends RemoteError {
|
|
12
|
+
methodName: string;
|
|
13
|
+
constructor(methodName: string);
|
|
14
|
+
}
|
|
15
|
+
export declare class ParamCountMismatchError extends RemoteError {
|
|
16
|
+
expected: number;
|
|
17
|
+
actual: number;
|
|
18
|
+
constructor(expected: number, actual: number);
|
|
19
|
+
}
|
|
20
|
+
export declare class EventNotFoundError extends RemoteError {
|
|
21
|
+
eventName: string;
|
|
22
|
+
constructor(eventName: string);
|
|
23
|
+
}
|
|
24
|
+
export declare class FailedValidationError extends RemoteError {
|
|
25
|
+
actual: any;
|
|
26
|
+
errors: ValidationError[];
|
|
27
|
+
constructor(actual: any, errors: ValidationError[]);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,qBAAa,QAAS,SAAQ,KAAK;CAClC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,QAAQ;CACxC;AAED,qBAAa,aAAc,SAAQ,WAAW;CAC7C;AAED,qBAAa,mBAAoB,SAAQ,WAAW;IACxB,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAG7C;AAED,qBAAa,uBAAwB,SAAQ,WAAW;IAE7C,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM;gBADd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAIxB;AAED,qBAAa,kBAAmB,SAAQ,WAAW;IACvB,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAG5C;AAED,qBAAa,qBAAsB,SAAQ,WAAW;IAE3C,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,eAAe,EAAE;gBADzB,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,eAAe,EAAE;CAKnC"}
|
package/lib/error.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export class RPCError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/**
|
|
4
|
+
* An error that was caused by the remote doing something wrong.
|
|
5
|
+
*/
|
|
6
|
+
export class RemoteError extends RPCError {
|
|
7
|
+
}
|
|
8
|
+
export class ProtocolError extends RemoteError {
|
|
9
|
+
}
|
|
10
|
+
export class MethodNotFoundError extends RemoteError {
|
|
11
|
+
methodName;
|
|
12
|
+
constructor(methodName) {
|
|
13
|
+
super(`Method '${methodName}' not found.`);
|
|
14
|
+
this.methodName = methodName;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ParamCountMismatchError extends RemoteError {
|
|
18
|
+
expected;
|
|
19
|
+
actual;
|
|
20
|
+
constructor(expected, actual) {
|
|
21
|
+
super(`Invalid number of parameters received. Expected ${expected}, got ${actual}`);
|
|
22
|
+
this.expected = expected;
|
|
23
|
+
this.actual = actual;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class EventNotFoundError extends RemoteError {
|
|
27
|
+
eventName;
|
|
28
|
+
constructor(eventName) {
|
|
29
|
+
super(`Requested event named '${eventName}' not found on this RPC object.`);
|
|
30
|
+
this.eventName = eventName;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class FailedValidationError extends RemoteError {
|
|
34
|
+
actual;
|
|
35
|
+
errors;
|
|
36
|
+
constructor(actual, errors) {
|
|
37
|
+
const msg = errors.map(e => e.message).join(', ');
|
|
38
|
+
super(`contract error on value ${actual}: ${msg}`);
|
|
39
|
+
this.actual = actual;
|
|
40
|
+
this.errors = errors;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=error.js.map
|
package/lib/error.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,QAAS,SAAQ,KAAK;CAClC;AAED;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;CACxC;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;CAC7C;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IACxB;IAA1B,YAA0B,UAAkB;QAC1C,KAAK,CAAC,WAAW,UAAU,cAAc,CAAC,CAAA;QADlB,eAAU,GAAV,UAAU,CAAQ;IAE5C,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,WAAW;IAE7C;IACA;IAFT,YACS,QAAgB,EAChB,MAAc;QAErB,KAAK,CAAC,mDAAmD,QAAQ,SAAS,MAAM,EAAE,CAAC,CAAA;QAH5E,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;IAGvB,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACvB;IAA1B,YAA0B,SAAiB;QACzC,KAAK,CAAC,0BAA0B,SAAS,iCAAiC,CAAC,CAAA;QADnD,cAAS,GAAT,SAAS,CAAQ;IAE3C,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,WAAW;IAE3C;IACA;IAFT,YACS,MAAW,EACX,MAAyB;QAEhC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,KAAK,CAAC,2BAA2B,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;QAJ5C,WAAM,GAAN,MAAM,CAAK;QACX,WAAM,GAAN,MAAM,CAAmB;IAIlC,CAAC;CACF"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { type Transport, WebSocketTransport, DummyTransport, RawTransport, createDuplex, } from "./transport.js";
|
|
2
|
+
export { implement, contract } from "./types.js";
|
|
3
|
+
export { RPC, type AnyMethods, type AnyEvents } from "./rpc.js";
|
|
4
|
+
export { createProxy } from "./proxy.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,GAAI,MAAM,gBAAgB,CAAA;AACjH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
|
package/lib/index.js
ADDED
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,GAAI,MAAM,gBAAgB,CAAA;AACjH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,GAAG,EAAmC,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { test, expect } from "bun:test";
|
|
2
|
+
import { types as t } from "reflect-types";
|
|
3
|
+
import { contract, implement } from "./types.js";
|
|
4
|
+
import { createDuplex } from "./transport.js";
|
|
5
|
+
import { connect } from "./rpc.js";
|
|
6
|
+
import { FailedValidationError } from "./error.js";
|
|
7
|
+
const local = contract({
|
|
8
|
+
methods: {
|
|
9
|
+
getState: t.callable([], t.number()),
|
|
10
|
+
setState: t.callable([t.number()], t.undefined()),
|
|
11
|
+
returnInvalid: t.callable([], t.number()),
|
|
12
|
+
},
|
|
13
|
+
events: {
|
|
14
|
+
someevent: t.string(),
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const remote = contract({
|
|
18
|
+
methods: {
|
|
19
|
+
getState: t.callable([], t.number()),
|
|
20
|
+
setState: t.callable([t.number()], t.undefined()),
|
|
21
|
+
getLength: t.callable([t.string()], t.number()),
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
const leftImpl = implement(local)
|
|
25
|
+
.state()
|
|
26
|
+
.methods({
|
|
27
|
+
getState(ctx) {
|
|
28
|
+
return ctx.foo;
|
|
29
|
+
},
|
|
30
|
+
setState(ctx, state) {
|
|
31
|
+
ctx.foo = state;
|
|
32
|
+
},
|
|
33
|
+
// @ts-expect-error Wrong function return type on purpose
|
|
34
|
+
returnInvalid() {
|
|
35
|
+
return "a string";
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
.finish();
|
|
39
|
+
const rightImpl = implement(remote)
|
|
40
|
+
.state()
|
|
41
|
+
.methods({
|
|
42
|
+
getState(ctx) {
|
|
43
|
+
return ctx.foo;
|
|
44
|
+
},
|
|
45
|
+
setState(ctx, state) {
|
|
46
|
+
ctx.foo = state;
|
|
47
|
+
},
|
|
48
|
+
getLength(_ctx, s) {
|
|
49
|
+
return s.length;
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
.finish();
|
|
53
|
+
test('can call methods on both sides', async () => {
|
|
54
|
+
const [leftTransport, rightTransport] = createDuplex();
|
|
55
|
+
const left = connect(leftImpl, remote, leftTransport, { foo: 42 });
|
|
56
|
+
const right = connect(rightImpl, local, rightTransport, { foo: 33 });
|
|
57
|
+
expect(await left.callMethod('getLength', ["foobar"])).toStrictEqual(6);
|
|
58
|
+
expect(await left.callMethod('getState', [])).toStrictEqual(33);
|
|
59
|
+
expect(await right.callMethod('getState', [])).toStrictEqual(42);
|
|
60
|
+
left.close();
|
|
61
|
+
right.close();
|
|
62
|
+
});
|
|
63
|
+
test('throws an error on invalid param count', async () => {
|
|
64
|
+
const [leftTransport, rightTransport] = createDuplex();
|
|
65
|
+
const left = connect(leftImpl, remote, leftTransport, { foo: 42 });
|
|
66
|
+
const right = connect(rightImpl, local, rightTransport, { foo: 33 });
|
|
67
|
+
expect(left.callMethod('getLength',
|
|
68
|
+
// @ts-expect-error Deliberatly added a param
|
|
69
|
+
["foo", "bar"])).rejects.toBeInstanceOf(Error); // TODO be more specific
|
|
70
|
+
expect(left.callMethod('getLength',
|
|
71
|
+
// @ts-expect-error Deliberatly removed a param
|
|
72
|
+
[])).rejects.toBeInstanceOf(Error); // TODO be more specific
|
|
73
|
+
});
|
|
74
|
+
test('throws an error on invalid return', async () => {
|
|
75
|
+
const [leftTransport, rightTransport] = createDuplex();
|
|
76
|
+
const left = connect(leftImpl, remote, leftTransport, { foo: 42 });
|
|
77
|
+
const right = connect(rightImpl, local, rightTransport, { foo: 33 });
|
|
78
|
+
expect(right.callMethod('returnInvalid', [])).rejects.toBeInstanceOf(FailedValidationError);
|
|
79
|
+
});
|
|
80
|
+
test('can send events', done => {
|
|
81
|
+
const [leftTransport, rightTransport] = createDuplex();
|
|
82
|
+
const left = connect(leftImpl, remote, leftTransport, { foo: 42 });
|
|
83
|
+
const right = connect(rightImpl, local, rightTransport, { foo: 33 });
|
|
84
|
+
left.getEvent('someevent').subscribe(msg => {
|
|
85
|
+
expect(msg).toStrictEqual('foo');
|
|
86
|
+
done();
|
|
87
|
+
});
|
|
88
|
+
right.notify('someevent', 'foo');
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { JSONArray, JSONValue } from "./util.js";
|
|
2
|
+
export declare const TYPE_PRIMITIVE = 0;
|
|
3
|
+
export declare const TYPE_ASYNC_GENERATOR = 1;
|
|
4
|
+
export declare const TYPE_ARRAY = 2;
|
|
5
|
+
export declare const TYPE_OBJECT = 3;
|
|
6
|
+
export declare const TYPE_UNDEFINED = 4;
|
|
7
|
+
export declare const TYPE_SUBJECT = 5;
|
|
8
|
+
export declare const TYPE_BEHAVIORSUBJECT = 6;
|
|
9
|
+
export declare const MSGID_REQUEST = 0;
|
|
10
|
+
export declare const MSGID_RESPOND_OK = 1;
|
|
11
|
+
export declare const MSGID_RESPOND_ERROR = 2;
|
|
12
|
+
export declare const MSGID_EVENT = 3;
|
|
13
|
+
export declare const MSGID_STREAM_ELEMENT = 4;
|
|
14
|
+
export declare const MSGID_STREAM_FINISH = 5;
|
|
15
|
+
export declare const MSGID_OBSERVABLE_EVENT = 6;
|
|
16
|
+
export declare const MSGID_OBSERVABLE_COMPLETE = 7;
|
|
17
|
+
export declare const MSGID_OBSERVABLE_ERROR = 8;
|
|
18
|
+
export declare const MSGID_OBSERVABLE_CLOSE = 9;
|
|
19
|
+
export declare function isTypeId(value: number): boolean;
|
|
20
|
+
export declare function isEncodedValue(data: JSONValue): boolean;
|
|
21
|
+
export declare function decodeEvent(msg: JSONArray): [string, JSONValue];
|
|
22
|
+
export declare function decodeRequest(msg: JSONArray): [number, string, JSONArray];
|
|
23
|
+
export declare function decodeRespondOk(msg: JSONArray): [number, JSONValue];
|
|
24
|
+
export declare function decodeRespondError(msg: JSONArray): [number, string];
|
|
25
|
+
export declare function decodeStreamElement(msg: JSONArray): [number, JSONValue];
|
|
26
|
+
export declare function decodeStreamFinish(msg: JSONArray): [number, JSONValue];
|
|
27
|
+
export declare function decodeObservableEvent(msg: JSONArray): [number, JSONValue];
|
|
28
|
+
export declare function decodeObservableComplete(msg: JSONArray): [number];
|
|
29
|
+
export declare function decodeObservableClose(msg: JSONArray): [number];
|
|
30
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtD,eAAO,MAAM,cAAc,IAAU,CAAC;AACtC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,UAAU,IAAc,CAAC;AACtC,eAAO,MAAM,WAAW,IAAa,CAAC;AACtC,eAAO,MAAM,cAAc,IAAU,CAAC;AACtC,eAAO,MAAM,YAAY,IAAY,CAAC;AACtC,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,eAAO,MAAM,aAAa,IAAgB,CAAC;AAC3C,eAAO,MAAM,gBAAgB,IAAa,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAU,CAAC;AAC3C,eAAO,MAAM,WAAW,IAAkB,CAAC;AAC3C,eAAO,MAAM,oBAAoB,IAAS,CAAC;AAC3C,eAAO,MAAM,mBAAmB,IAAU,CAAC;AAC3C,eAAO,MAAM,sBAAsB,IAAO,CAAC;AAC3C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,sBAAsB,IAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,IAAO,CAAC;AAE3C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAKvD;AAcD,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAU/D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAezE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAQnE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWnE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAavE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAatE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAQzE;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,CAAC,CAOjE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,MAAM,CAAC,CAO9D"}
|
package/lib/protocol.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ProtocolError } from "./error.js";
|
|
2
|
+
export const TYPE_PRIMITIVE = 0;
|
|
3
|
+
export const TYPE_ASYNC_GENERATOR = 1;
|
|
4
|
+
export const TYPE_ARRAY = 2;
|
|
5
|
+
export const TYPE_OBJECT = 3;
|
|
6
|
+
export const TYPE_UNDEFINED = 4;
|
|
7
|
+
export const TYPE_SUBJECT = 5;
|
|
8
|
+
export const TYPE_BEHAVIORSUBJECT = 6;
|
|
9
|
+
export const MSGID_REQUEST = 0;
|
|
10
|
+
export const MSGID_RESPOND_OK = 1;
|
|
11
|
+
export const MSGID_RESPOND_ERROR = 2;
|
|
12
|
+
export const MSGID_EVENT = 3;
|
|
13
|
+
export const MSGID_STREAM_ELEMENT = 4;
|
|
14
|
+
export const MSGID_STREAM_FINISH = 5;
|
|
15
|
+
export const MSGID_OBSERVABLE_EVENT = 6;
|
|
16
|
+
export const MSGID_OBSERVABLE_COMPLETE = 7;
|
|
17
|
+
export const MSGID_OBSERVABLE_ERROR = 8;
|
|
18
|
+
export const MSGID_OBSERVABLE_CLOSE = 9;
|
|
19
|
+
export function isTypeId(value) {
|
|
20
|
+
// Keep in sync with the TYPE_* defitions
|
|
21
|
+
return value >= 0 && value <= 6;
|
|
22
|
+
}
|
|
23
|
+
export function isEncodedValue(data) {
|
|
24
|
+
return Array.isArray(data)
|
|
25
|
+
&& data.length === 2
|
|
26
|
+
&& typeof (data[0]) === 'number'
|
|
27
|
+
&& isTypeId(data[0]);
|
|
28
|
+
}
|
|
29
|
+
function checkMethodId(value) {
|
|
30
|
+
if (!Number.isInteger(value)) {
|
|
31
|
+
throw new ProtocolError(`Expected method ID to be an integer.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function checkObservableId(value) {
|
|
35
|
+
if (!Number.isInteger(value)) {
|
|
36
|
+
throw new ProtocolError(`Expected observable ID to be an integer.`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function decodeEvent(msg) {
|
|
40
|
+
if (msg.length !== 3) {
|
|
41
|
+
throw new ProtocolError(`Expected EVENT message to be a JSON array with exactly three elements.`);
|
|
42
|
+
}
|
|
43
|
+
const name = msg[1];
|
|
44
|
+
if (typeof (name) !== 'string') {
|
|
45
|
+
throw new ProtocolError(`Expected event message name to be a string.`);
|
|
46
|
+
}
|
|
47
|
+
const rawValue = msg[2];
|
|
48
|
+
return [name, rawValue];
|
|
49
|
+
}
|
|
50
|
+
export function decodeRequest(msg) {
|
|
51
|
+
if (msg.length !== 4) {
|
|
52
|
+
throw new ProtocolError(`Expected REQUEST message to be a JSON array with exactly four elements.`);
|
|
53
|
+
}
|
|
54
|
+
const id = msg[1];
|
|
55
|
+
checkMethodId(id);
|
|
56
|
+
const name = msg[2];
|
|
57
|
+
if (typeof (name) !== 'string') {
|
|
58
|
+
throw new ProtocolError(`Expected request method name to be a string.`);
|
|
59
|
+
}
|
|
60
|
+
const args = msg[3];
|
|
61
|
+
if (!Array.isArray(args)) {
|
|
62
|
+
throw new ProtocolError(`Expected request arguments list to be an array.`);
|
|
63
|
+
}
|
|
64
|
+
return [id, name, args];
|
|
65
|
+
}
|
|
66
|
+
export function decodeRespondOk(msg) {
|
|
67
|
+
if (msg.length !== 3) {
|
|
68
|
+
throw new ProtocolError(`Expected RESPOND_OK message to be a JSON array with exactly three elements.`);
|
|
69
|
+
}
|
|
70
|
+
const id = msg[1];
|
|
71
|
+
checkMethodId(id);
|
|
72
|
+
const value = msg[2];
|
|
73
|
+
return [id, value];
|
|
74
|
+
}
|
|
75
|
+
export function decodeRespondError(msg) {
|
|
76
|
+
if (msg.length !== 3) {
|
|
77
|
+
throw new ProtocolError(`Expected RESPOND_ERROR message to be a JSON array with exactly three elements.`);
|
|
78
|
+
}
|
|
79
|
+
const id = msg[1];
|
|
80
|
+
checkMethodId(id);
|
|
81
|
+
const message = msg[2];
|
|
82
|
+
if (typeof (message) !== 'string') {
|
|
83
|
+
throw new ProtocolError(`Expected response error message to be a string.`);
|
|
84
|
+
}
|
|
85
|
+
return [id, message];
|
|
86
|
+
}
|
|
87
|
+
export function decodeStreamElement(msg) {
|
|
88
|
+
if (msg.length !== 3) {
|
|
89
|
+
throw new ProtocolError(`Expected STREAM_ELEMENT message to contain 3 elements.`);
|
|
90
|
+
}
|
|
91
|
+
const id = msg[1];
|
|
92
|
+
if (typeof (id) !== 'number') {
|
|
93
|
+
throw new ProtocolError(`Expected message ID to be a positive integer.`);
|
|
94
|
+
}
|
|
95
|
+
const rawValue = msg[2];
|
|
96
|
+
if (!isEncodedValue(rawValue)) {
|
|
97
|
+
throw new ProtocolError(`Expected actual stream element to be a valid encoded RPC value.`);
|
|
98
|
+
}
|
|
99
|
+
return [id, rawValue];
|
|
100
|
+
}
|
|
101
|
+
export function decodeStreamFinish(msg) {
|
|
102
|
+
if (msg.length !== 3) {
|
|
103
|
+
throw new ProtocolError(`Expected STREAM_FINISH message to contain 3 elements.`);
|
|
104
|
+
}
|
|
105
|
+
const id = msg[1];
|
|
106
|
+
if (typeof (id) !== 'number') {
|
|
107
|
+
throw new ProtocolError(`Expeccted generator ID to be a number.`);
|
|
108
|
+
}
|
|
109
|
+
const rawValue = msg[2];
|
|
110
|
+
if (!isEncodedValue(rawValue)) {
|
|
111
|
+
throw new ProtocolError(`Expected generator result value to be a valid encoded RPC value.`);
|
|
112
|
+
}
|
|
113
|
+
return [id, rawValue];
|
|
114
|
+
}
|
|
115
|
+
export function decodeObservableEvent(msg) {
|
|
116
|
+
if (msg.length !== 3) {
|
|
117
|
+
throw new ProtocolError(`Expected OBSERVABLE_EVENT message to contain 3 elements.`);
|
|
118
|
+
}
|
|
119
|
+
const id = msg[1];
|
|
120
|
+
checkMethodId(id);
|
|
121
|
+
const rawValue = msg[2];
|
|
122
|
+
return [id, rawValue];
|
|
123
|
+
}
|
|
124
|
+
export function decodeObservableComplete(msg) {
|
|
125
|
+
if (msg.length !== 2) {
|
|
126
|
+
throw new ProtocolError(`Expected OBSERVABLE_COMPLETE message to contain 2 elements.`);
|
|
127
|
+
}
|
|
128
|
+
const id = msg[1];
|
|
129
|
+
checkObservableId(id);
|
|
130
|
+
return [id];
|
|
131
|
+
}
|
|
132
|
+
export function decodeObservableClose(msg) {
|
|
133
|
+
if (msg.length !== 2) {
|
|
134
|
+
throw new ProtocolError(`Expected OBSERVABLE_CLOSE message to contain 2 elements.`);
|
|
135
|
+
}
|
|
136
|
+
const id = msg[1];
|
|
137
|
+
checkObservableId(id);
|
|
138
|
+
return [id];
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/lib/proxy.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Subject } from "rxjs";
|
|
2
|
+
import type { RPC } from "./rpc.js";
|
|
3
|
+
import type { Impl, Spec, MethodSpec, EventSpec } from "./types.js";
|
|
4
|
+
import type { CallableType } from "reflect-types";
|
|
5
|
+
type Promisify<T extends CallableType> = (...args: T['paramTypes']) => Promise<Awaited<T['returnType']>>;
|
|
6
|
+
type Obj<M extends Record<string, MethodSpec>, E extends Record<string, EventSpec>> = {
|
|
7
|
+
[K in keyof M]: Promisify<M[K]>;
|
|
8
|
+
} & {
|
|
9
|
+
[K in keyof E]: Subject<E[K]['ty']>;
|
|
10
|
+
};
|
|
11
|
+
export declare function createProxy<L extends Impl, R extends Spec>(rpc: RPC<L, R>): Obj<R["methods"], L["spec"]["events"]>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,KAAK,SAAS,CAAC,CAAC,SAAS,YAAY,IACjC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAEpE,KAAK,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAC9E;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACnC;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;CAAE,CAAC;AAE5C,wBAAgB,WAAW,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,0CAczE"}
|
package/lib/proxy.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function createProxy(rpc) {
|
|
2
|
+
return new Proxy({}, {
|
|
3
|
+
get(target, p, receiver) {
|
|
4
|
+
if (typeof (p) === 'string') {
|
|
5
|
+
if (rpc.remote.hasMethod(p)) {
|
|
6
|
+
return (...args) => rpc.callMethod(p, args);
|
|
7
|
+
}
|
|
8
|
+
if (rpc.local.spec.hasEvent(p)) {
|
|
9
|
+
return rpc.getEvent(p);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return Reflect.get(target, p, receiver);
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=proxy.js.map
|
package/lib/proxy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,WAAW,CAAiC,GAAc;IACxE,OAAO,IAAI,KAAK,CAAyC,EAAS,EAAE;QAClE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ;YACrB,IAAI,OAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC3B,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,IAAW,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/B,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/lib/rpc.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BehaviorSubject, Subject } from "rxjs";
|
|
2
|
+
import { type Infer } from "reflect-types";
|
|
3
|
+
import { type JSONValue } from "./util.js";
|
|
4
|
+
import type { Transport } from "./transport.js";
|
|
5
|
+
import type { Impl, Spec, InferTuple } from "./types.js";
|
|
6
|
+
export declare class Resource<T> {
|
|
7
|
+
value: T;
|
|
8
|
+
close: () => void;
|
|
9
|
+
constructor(value: T, close: () => void);
|
|
10
|
+
}
|
|
11
|
+
export declare function isResource(value: any): value is Resource<unknown>;
|
|
12
|
+
export type NotifyFn = (eventName: string, value: any) => void;
|
|
13
|
+
export type MethodFn = (...args: any[]) => any;
|
|
14
|
+
export type AnyEvents = Record<string, Subject<any>>;
|
|
15
|
+
export type AnyMethods = Record<string, MethodFn>;
|
|
16
|
+
export type RPCValue = JSONValue | AsyncIterable<any, any, any> | Resource<Subject<any>> | Resource<BehaviorSubject<any>>;
|
|
17
|
+
export declare class RPC<L extends Impl, R extends Spec> {
|
|
18
|
+
private transport;
|
|
19
|
+
local: L;
|
|
20
|
+
remote: R;
|
|
21
|
+
private state;
|
|
22
|
+
private nextMessageId;
|
|
23
|
+
private nextStreamId;
|
|
24
|
+
private nextSubjectId;
|
|
25
|
+
private sendSubscriptions;
|
|
26
|
+
private recvSubjects;
|
|
27
|
+
private pending;
|
|
28
|
+
private asyncGenerators;
|
|
29
|
+
private events;
|
|
30
|
+
private readerSubscription;
|
|
31
|
+
constructor(transport: Transport, local: L, remote: R, state: L['state']);
|
|
32
|
+
getEvent<K extends keyof L['spec']['events'] & string>(name: K): Subject<Infer<L['spec']['events'][K]['ty']>>;
|
|
33
|
+
getEvent(name: string): undefined;
|
|
34
|
+
notify<K extends keyof R['events']>(eventName: K, value: Infer<R['events'][K]['ty']>): Promise<void>;
|
|
35
|
+
hasMethod(name: string): boolean;
|
|
36
|
+
callMethod<K extends keyof R['methods'] & string>(name: K, args: InferTuple<R['methods'][K]['paramTypes']>): Promise<Infer<R['methods'][K]['returnType']>>;
|
|
37
|
+
private encode;
|
|
38
|
+
private decode;
|
|
39
|
+
private processMessage;
|
|
40
|
+
close(): void;
|
|
41
|
+
}
|
|
42
|
+
export declare function connect<L extends Impl, R extends Spec>(local: L, remote: R, transport: Transport, state?: L['state']): RPC<L, R>;
|
|
43
|
+
//# sourceMappingURL=rpc.d.ts.map
|
package/lib/rpc.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAgB,MAAM,MAAM,CAAC;AAC9D,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AA4BrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGzD,qBAAa,QAAQ,CAAC,CAAC;IAGZ,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,MAAM,IAAI;gBADjB,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,MAAM,IAAI;CAK3B;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,CAEjE;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;AAE/D,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;AAEpD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AASlD,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1H,qBAAa,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,IAAI;IAkB3C,OAAO,CAAC,SAAS;IACV,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK;IAlBf,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,iBAAiB,CAAmC;IAG5D,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,OAAO,CAAqF;IACpG,OAAO,CAAC,eAAe,CAAkE;IACzF,OAAO,CAAC,MAAM,CAA2G;IAGzH,OAAO,CAAC,kBAAkB,CAAe;gBAG/B,SAAS,EAAE,SAAS,EACrB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACR,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;IAgBpB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7G,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAY3B,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1G,SAAS,CAAC,IAAI,EAAE,MAAM;IAIhB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAUvK,OAAO,CAAC,MAAM;IAoEd,OAAO,CAAC,MAAM;IA0Fd,OAAO,CAAC,cAAc;IAsJf,KAAK,IAAI,IAAI;CAIrB;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAEhI"}
|