@livequery/core 2.0.104 → 2.0.106
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/LIVEQUERY_SPEC.md +451 -0
- package/README.md +571 -314
- package/build/src/ApiGatewayHandler.d.ts +56 -0
- package/build/src/ApiGatewayHandler.js +210 -0
- package/build/src/ApiGatewayHandler.js.map +1 -0
- package/build/src/ApiGatewayLinker.d.ts +61 -0
- package/build/src/ApiGatewayLinker.js +229 -0
- package/build/src/ApiGatewayLinker.js.map +1 -0
- package/build/src/ApiServiceLinker.d.ts +18 -0
- package/build/src/ApiServiceLinker.js +61 -0
- package/build/src/ApiServiceLinker.js.map +1 -0
- package/build/src/LivequeryContext.d.ts +43 -0
- package/build/src/LivequeryContext.js +2 -0
- package/build/src/LivequeryContext.js.map +1 -0
- package/build/src/LivequeryDatasource.d.ts +8 -0
- package/build/src/LivequeryDatasource.js +2 -0
- package/build/src/LivequeryDatasource.js.map +1 -0
- package/build/src/LivequeryRequestParser.d.ts +13 -0
- package/build/src/LivequeryRequestParser.js +34 -0
- package/build/src/LivequeryRequestParser.js.map +1 -0
- package/build/src/UdpDiscovery.d.ts +26 -0
- package/build/src/UdpDiscovery.js +238 -0
- package/build/src/UdpDiscovery.js.map +1 -0
- package/build/src/WebsocketGateway.d.ts +36 -0
- package/build/src/WebsocketGateway.js +353 -0
- package/build/src/WebsocketGateway.js.map +1 -0
- package/build/src/const.d.ts +8 -0
- package/build/src/const.js +10 -0
- package/build/src/const.js.map +1 -0
- package/build/src/headers.d.ts +9 -0
- package/build/src/headers.js +32 -0
- package/build/src/headers.js.map +1 -0
- package/build/src/helpers/PathHelper.d.ts +11 -0
- package/build/src/helpers/PathHelper.js +41 -0
- package/build/src/helpers/PathHelper.js.map +1 -0
- package/build/src/helpers/hidePrivateFields.d.ts +3 -0
- package/build/src/helpers/hidePrivateFields.js +29 -0
- package/build/src/helpers/hidePrivateFields.js.map +1 -0
- package/build/src/helpers/nodeRequestToWebRequest.d.ts +7 -0
- package/build/src/helpers/nodeRequestToWebRequest.js +17 -0
- package/build/src/helpers/nodeRequestToWebRequest.js.map +1 -0
- package/build/src/helpers/writeWebResponse.d.ts +2 -0
- package/build/src/helpers/writeWebResponse.js +9 -0
- package/build/src/helpers/writeWebResponse.js.map +1 -0
- package/build/src/index.d.ts +9 -0
- package/build/src/index.js +10 -0
- package/build/src/index.js.map +1 -0
- package/build/src/parseLivequeryRequest.d.ts +10 -0
- package/build/src/parseLivequeryRequest.js +17 -0
- package/build/src/parseLivequeryRequest.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +40 -103
- package/dist/LivequeryCollection.d.ts +0 -92
- package/dist/LivequeryCollection.d.ts.map +0 -1
- package/dist/LivequeryCollection.js +0 -231
- package/dist/LivequeryCollection.js.map +0 -1
- package/dist/LivequeryCore.d.ts +0 -67
- package/dist/LivequeryCore.d.ts.map +0 -1
- package/dist/LivequeryCore.js +0 -343
- package/dist/LivequeryCore.js.map +0 -1
- package/dist/LivequeryDocument.d.ts +0 -23
- package/dist/LivequeryDocument.d.ts.map +0 -1
- package/dist/LivequeryDocument.js +0 -22
- package/dist/LivequeryDocument.js.map +0 -1
- package/dist/LivequeryMemoryStorage.d.ts +0 -14
- package/dist/LivequeryMemoryStorage.d.ts.map +0 -1
- package/dist/LivequeryMemoryStorage.js +0 -89
- package/dist/LivequeryMemoryStorage.js.map +0 -1
- package/dist/LivequeryStorge.d.ts +0 -12
- package/dist/LivequeryStorge.d.ts.map +0 -1
- package/dist/LivequeryStorge.js +0 -2
- package/dist/LivequeryStorge.js.map +0 -1
- package/dist/LivequeryTransporter.d.ts +0 -22
- package/dist/LivequeryTransporter.d.ts.map +0 -1
- package/dist/LivequeryTransporter.js +0 -2
- package/dist/LivequeryTransporter.js.map +0 -1
- package/dist/helpers/filterDocs.d.ts +0 -5
- package/dist/helpers/filterDocs.d.ts.map +0 -1
- package/dist/helpers/filterDocs.js +0 -80
- package/dist/helpers/filterDocs.js.map +0 -1
- package/dist/helpers/tryCatch.d.ts +0 -2
- package/dist/helpers/tryCatch.d.ts.map +0 -1
- package/dist/helpers/tryCatch.js +0 -10
- package/dist/helpers/tryCatch.js.map +0 -1
- package/dist/helpers/whenCompleted.d.ts +0 -3
- package/dist/helpers/whenCompleted.d.ts.map +0 -1
- package/dist/helpers/whenCompleted.js +0 -5
- package/dist/helpers/whenCompleted.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts +0 -70
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiServiceLinker.js","sourceRoot":"","sources":["../../src/ApiServiceLinker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EACH,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAWhD,MAAM,OAAO,gBAAgB;IAChB,MAAM,CAAyC;IAC/C,OAAO,CAAQ;IACf,IAAI,CAAmB;IACvB,UAAU,CAAkC;IACrD,aAAa,CAAe;IAC5B,SAAS,CAAqB;IAE9B,YAAY,OAAgC;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE,CAAA;QAC9C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,EAAE,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,YAAY,CAAqB,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAC7G,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,IAAY;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjD,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YAClD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAM;YACnC,IAAI,IAAI,CAAC,SAAS,KAAK,qBAAqB;gBAAE,OAAM;YACpD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;gBAAE,OAAM;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA;YAC/B,IAAI,QAAQ;gBAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9F,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,KAAK;QACD,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAA;QACjC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,IAAY;QACtC,OAAO;YACH,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,qBAAqB;YAChC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;YACnB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,MAAM,EAAE,EAAE;YACV,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,IAAI,EAAE,cAAc;aACvB,CAAC,CAAC,CAAC,SAAS;SAChB,CAAA;IACL,CAAC;IAED,KAAK,CAAC,QAA4B;QAC9B,OAAO;YACH,GAAG,QAAQ;YACX,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAA;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export type CollectionResponse<T> = {
|
|
2
|
+
items: T[];
|
|
3
|
+
paging: {
|
|
4
|
+
current: number;
|
|
5
|
+
total: number;
|
|
6
|
+
};
|
|
7
|
+
cursor: {
|
|
8
|
+
current: string;
|
|
9
|
+
next: string;
|
|
10
|
+
prev: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type DocumentResponse<T> = {
|
|
14
|
+
item: T;
|
|
15
|
+
};
|
|
16
|
+
export type LivequeryRequest<I> = {
|
|
17
|
+
keys: Record<string, any>;
|
|
18
|
+
path: string;
|
|
19
|
+
document_id?: string;
|
|
20
|
+
collection_ref: string;
|
|
21
|
+
schema_collection_ref: string;
|
|
22
|
+
ref: string;
|
|
23
|
+
method: string;
|
|
24
|
+
body: I;
|
|
25
|
+
query: Record<string, any>;
|
|
26
|
+
};
|
|
27
|
+
export type RawRequest = {
|
|
28
|
+
path: string;
|
|
29
|
+
ref: string;
|
|
30
|
+
method: string;
|
|
31
|
+
body?: any;
|
|
32
|
+
params: Record<string, any>;
|
|
33
|
+
query: Record<string, any>;
|
|
34
|
+
headers: Map<string, string>;
|
|
35
|
+
};
|
|
36
|
+
export type LivequeryContext<T = {}> = {
|
|
37
|
+
request: RawRequest;
|
|
38
|
+
livequery?: LivequeryRequest<any>;
|
|
39
|
+
response?: T;
|
|
40
|
+
};
|
|
41
|
+
export type LivequeryHandler<O = {}> = {
|
|
42
|
+
handle(ctx: LivequeryContext<O>): any;
|
|
43
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LivequeryContext.js","sourceRoot":"","sources":["../../src/LivequeryContext.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LivequeryHandler } from "./LivequeryContext.js";
|
|
2
|
+
export type LivequeryDatasourceInitConfig<Config> = Config & {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
};
|
|
6
|
+
export type LivequeryDatasource<RouteConfig> = LivequeryHandler & {
|
|
7
|
+
init(routes: Array<LivequeryDatasourceInitConfig<RouteConfig>>): Promise<void> | void;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LivequeryDatasource.js","sourceRoot":"","sources":["../../src/LivequeryDatasource.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LivequeryContext, LivequeryHandler } from './LivequeryContext.js';
|
|
2
|
+
export type HttpRequestContext = {
|
|
3
|
+
pathname: string;
|
|
4
|
+
routePath: string;
|
|
5
|
+
query: Record<string, any>;
|
|
6
|
+
params: Record<string, any>;
|
|
7
|
+
body?: any;
|
|
8
|
+
method: string;
|
|
9
|
+
};
|
|
10
|
+
export declare class LivequeryRequestParser implements LivequeryHandler {
|
|
11
|
+
#private;
|
|
12
|
+
handle(ctx: LivequeryContext): import("./LivequeryContext.js").LivequeryRequest<any>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class LivequeryRequestParser {
|
|
2
|
+
#parse(request) {
|
|
3
|
+
const refs = this.#routePath(request.ref).split('/').filter(Boolean);
|
|
4
|
+
if (refs.length === 0)
|
|
5
|
+
return;
|
|
6
|
+
const paths = this.#routePath(request.path).split('/').filter(Boolean);
|
|
7
|
+
const start = refs.findIndex((p, i) => !refs[i + 1] || refs[i + 1].startsWith(':'));
|
|
8
|
+
const document_id = refs[refs.length - 1]?.startsWith(':') ? paths[refs.length - 1] : undefined;
|
|
9
|
+
const ref = paths.slice(start).join('/');
|
|
10
|
+
const collection_ref = paths.slice(start, document_id ? paths.length - 1 : undefined).join('/');
|
|
11
|
+
const schema_collection_ref = refs.slice(start, document_id ? refs.length - 1 : undefined).map(c => c.startsWith(':') ? c.slice(1) : c).join('/');
|
|
12
|
+
return {
|
|
13
|
+
ref,
|
|
14
|
+
collection_ref,
|
|
15
|
+
schema_collection_ref,
|
|
16
|
+
document_id,
|
|
17
|
+
keys: request.params,
|
|
18
|
+
body: request.body,
|
|
19
|
+
method: request.method.toUpperCase(),
|
|
20
|
+
path: request.path,
|
|
21
|
+
query: request.query,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
#routePath(path) {
|
|
25
|
+
const queryIndex = path.indexOf('?');
|
|
26
|
+
const pathname = queryIndex === -1 ? path : path.slice(0, queryIndex);
|
|
27
|
+
return pathname.split('~')[0];
|
|
28
|
+
}
|
|
29
|
+
handle(ctx) {
|
|
30
|
+
ctx.livequery = this.#parse(ctx.request);
|
|
31
|
+
return ctx.livequery;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=LivequeryRequestParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LivequeryRequestParser.js","sourceRoot":"","sources":["../../src/LivequeryRequestParser.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,sBAAsB;IAE/B,MAAM,CAAC,OAAmB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAEtE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;QACnF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/F,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/F,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAGjJ,OAAO;YACH,GAAG;YACH,cAAc;YACd,qBAAqB;YACrB,WAAW;YACX,IAAI,EAAE,OAAO,CAAC,MAAM;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE;YACpC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;SACvB,CAAA;IACL,CAAC;IAED,UAAU,CAAC,IAAY;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QACrE,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,CAAC,GAAqB;QACxB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO,GAAG,CAAC,SAAS,CAAA;IACxB,CAAC;CACJ"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
export type UdpDiscoveryNode = {
|
|
3
|
+
node_id: string;
|
|
4
|
+
namespace: string;
|
|
5
|
+
version: number;
|
|
6
|
+
host?: string;
|
|
7
|
+
};
|
|
8
|
+
export type UdpDiscoveryOptions = {
|
|
9
|
+
key: string;
|
|
10
|
+
port?: number;
|
|
11
|
+
};
|
|
12
|
+
export type UdpDiscoveryPacket<T extends UdpDiscoveryNode> = {
|
|
13
|
+
version: 1;
|
|
14
|
+
sender_id: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
node: T;
|
|
17
|
+
signature: string;
|
|
18
|
+
};
|
|
19
|
+
export type UdpDiscoveryStatus = 'not_ready' | 'ready' | 'closed';
|
|
20
|
+
export declare class UdpDiscovery<T extends UdpDiscoveryNode> extends Observable<T> {
|
|
21
|
+
#private;
|
|
22
|
+
readonly status$: Observable<UdpDiscoveryStatus>;
|
|
23
|
+
constructor(options: UdpDiscoveryOptions);
|
|
24
|
+
broadcast(node: T, targetIp?: string | string[]): Promise<void>;
|
|
25
|
+
close(): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { createHmac } from 'crypto';
|
|
2
|
+
import { createSocket } from 'dgram';
|
|
3
|
+
import { networkInterfaces } from 'os';
|
|
4
|
+
import { BehaviorSubject, Observable, Subject } from 'rxjs';
|
|
5
|
+
import { pack, unpack } from 'msgpackr';
|
|
6
|
+
import { API_GATEWAY_MULTICAST_ADDRESS, API_GATEWAY_MULTICAST_PORT, API_GATEWAY_WHITELIST_ADDRESS, } from './const.js';
|
|
7
|
+
const BIND_ADDRESS = '0.0.0.0';
|
|
8
|
+
const DEFAULT_PACKET_TTL_MS = 30_000;
|
|
9
|
+
export class UdpDiscovery extends Observable {
|
|
10
|
+
#nodes = new Subject();
|
|
11
|
+
#status$ = new BehaviorSubject('not_ready');
|
|
12
|
+
#externalSocket = createSocket({ type: 'udp4', reuseAddr: true, reusePort: true });
|
|
13
|
+
#localSocket = createSocket({ type: 'udp4', reuseAddr: true, reusePort: true });
|
|
14
|
+
#localAddresses = this.#readLocalAddresses();
|
|
15
|
+
status$ = this.#status$.asObservable();
|
|
16
|
+
#config;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
super((subscriber) => this.#nodes.subscribe(subscriber));
|
|
19
|
+
const port = options.port ?? API_GATEWAY_MULTICAST_PORT;
|
|
20
|
+
this.#config = {
|
|
21
|
+
key: options.key,
|
|
22
|
+
port,
|
|
23
|
+
peers: [
|
|
24
|
+
API_GATEWAY_MULTICAST_ADDRESS,
|
|
25
|
+
...this.#expandPeers(this.#envPeers()),
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
this.#bindSockets();
|
|
29
|
+
}
|
|
30
|
+
async broadcast(node, targetIp) {
|
|
31
|
+
await this.#waitReady();
|
|
32
|
+
if (this.#isClosed())
|
|
33
|
+
return;
|
|
34
|
+
const ips = targetIp ? [targetIp].flat(2) : this.#config.peers;
|
|
35
|
+
const packet = this.#createPacket(node);
|
|
36
|
+
const raw = pack(packet);
|
|
37
|
+
await Promise.all(ips.map(ip => this.#send(this.#externalSocket, raw, this.#config.port, ip)));
|
|
38
|
+
if (!targetIp)
|
|
39
|
+
await this.#sendLocal(packet);
|
|
40
|
+
}
|
|
41
|
+
close() {
|
|
42
|
+
if (this.#isClosed())
|
|
43
|
+
return;
|
|
44
|
+
this.#status$.next('closed');
|
|
45
|
+
this.#nodes.complete();
|
|
46
|
+
this.#status$.complete();
|
|
47
|
+
this.#externalSocket.close();
|
|
48
|
+
this.#localSocket.close();
|
|
49
|
+
}
|
|
50
|
+
#bindSockets() {
|
|
51
|
+
this.#externalSocket.on('message', (raw, rinfo) => this.#onExternalMessage(raw, rinfo));
|
|
52
|
+
this.#externalSocket.on('error', e => this.#onError(e));
|
|
53
|
+
const externalReady = new Promise(resolve => this.#externalSocket.once('listening', () => {
|
|
54
|
+
this.#configureMulticast(this.#externalSocket);
|
|
55
|
+
for (const address of this.#localAddresses) {
|
|
56
|
+
try {
|
|
57
|
+
this.#externalSocket.addMembership(API_GATEWAY_MULTICAST_ADDRESS, address);
|
|
58
|
+
}
|
|
59
|
+
catch { }
|
|
60
|
+
}
|
|
61
|
+
resolve();
|
|
62
|
+
}));
|
|
63
|
+
this.#externalSocket.bind(this.#config.port, BIND_ADDRESS);
|
|
64
|
+
this.#localSocket.on('message', (raw, rinfo) => this.#onLocalMessage(raw, rinfo));
|
|
65
|
+
this.#localSocket.on('error', e => this.#onError(e));
|
|
66
|
+
const localReady = new Promise(resolve => this.#localSocket.once('listening', () => {
|
|
67
|
+
this.#configureMulticast(this.#localSocket);
|
|
68
|
+
for (const address of this.#localAddresses) {
|
|
69
|
+
try {
|
|
70
|
+
this.#localSocket.addMembership(API_GATEWAY_MULTICAST_ADDRESS, address);
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
73
|
+
}
|
|
74
|
+
resolve();
|
|
75
|
+
}));
|
|
76
|
+
this.#localSocket.bind(this.#config.port, BIND_ADDRESS);
|
|
77
|
+
Promise.all([externalReady, localReady]).then(() => {
|
|
78
|
+
if (!this.#isClosed())
|
|
79
|
+
this.#status$.next('ready');
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async #onExternalMessage(raw, rinfo) {
|
|
83
|
+
if (this.#isClosed())
|
|
84
|
+
return;
|
|
85
|
+
const decoded = this.#decode(raw);
|
|
86
|
+
if (!decoded)
|
|
87
|
+
return;
|
|
88
|
+
const signatureMatches = decoded.packet.signature === this.#sign(decoded.unsigned);
|
|
89
|
+
const shouldRelay = !this.#isLocalAddress(rinfo.address)
|
|
90
|
+
|| (rinfo.port !== this.#config.port && !signatureMatches);
|
|
91
|
+
if (shouldRelay) {
|
|
92
|
+
await this.#relayLocal(raw);
|
|
93
|
+
}
|
|
94
|
+
this.#consume(decoded, rinfo.address);
|
|
95
|
+
}
|
|
96
|
+
#onLocalMessage(raw, rinfo) {
|
|
97
|
+
if (this.#isClosed())
|
|
98
|
+
return;
|
|
99
|
+
const decoded = this.#decode(raw);
|
|
100
|
+
if (!decoded)
|
|
101
|
+
return;
|
|
102
|
+
this.#consume(decoded, rinfo.address);
|
|
103
|
+
}
|
|
104
|
+
#consume({ packet, unsigned }, host) {
|
|
105
|
+
if (Math.abs(Date.now() - packet.timestamp) > DEFAULT_PACKET_TTL_MS)
|
|
106
|
+
return;
|
|
107
|
+
if (packet.signature !== this.#sign(unsigned))
|
|
108
|
+
return;
|
|
109
|
+
this.#nodes.next({
|
|
110
|
+
...packet.node,
|
|
111
|
+
host: packet.node.host || host,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
#decode(raw) {
|
|
115
|
+
try {
|
|
116
|
+
const packet = unpack(raw);
|
|
117
|
+
if (packet.version !== 1)
|
|
118
|
+
return;
|
|
119
|
+
if (!packet.sender_id || !packet.timestamp || !packet.node || !packet.signature)
|
|
120
|
+
return;
|
|
121
|
+
if (!packet.node.node_id || typeof packet.node.version !== 'number')
|
|
122
|
+
return;
|
|
123
|
+
const { signature: _signature, ...unsigned } = packet;
|
|
124
|
+
return { packet, unsigned };
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
#createPacket(node) {
|
|
131
|
+
const unsigned = {
|
|
132
|
+
version: 1,
|
|
133
|
+
sender_id: node.node_id,
|
|
134
|
+
timestamp: Date.now(),
|
|
135
|
+
node,
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
...unsigned,
|
|
139
|
+
signature: this.#sign(unsigned),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
#sign(packet) {
|
|
143
|
+
return createHmac('sha256', this.#config.key).update(pack(packet)).digest('hex');
|
|
144
|
+
}
|
|
145
|
+
async #relayLocal(raw) {
|
|
146
|
+
await Promise.all([
|
|
147
|
+
this.#sendLocalMulticast(raw),
|
|
148
|
+
this.#send(this.#localSocket, raw, this.#config.port, '127.0.0.1'),
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
async #sendLocal(packet) {
|
|
152
|
+
await this.#sendLocalMulticast(pack(packet));
|
|
153
|
+
}
|
|
154
|
+
async #sendLocalMulticast(raw) {
|
|
155
|
+
const addresses = [...this.#localAddresses].filter(address => address.includes('.') && address !== '0.0.0.0');
|
|
156
|
+
for (const address of addresses) {
|
|
157
|
+
try {
|
|
158
|
+
this.#localSocket.setMulticastInterface(address);
|
|
159
|
+
}
|
|
160
|
+
catch { }
|
|
161
|
+
await this.#send(this.#localSocket, raw, this.#config.port, API_GATEWAY_MULTICAST_ADDRESS);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
#isLocalAddress(address) {
|
|
165
|
+
return this.#localAddresses.has(address);
|
|
166
|
+
}
|
|
167
|
+
#send(socket, raw, port, host) {
|
|
168
|
+
return new Promise(resolve => {
|
|
169
|
+
if (this.#isClosed()) {
|
|
170
|
+
resolve();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
socket.send(raw, 0, raw.length, port, host, e => {
|
|
174
|
+
if (e)
|
|
175
|
+
this.#onError(e);
|
|
176
|
+
resolve();
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
#configureMulticast(socket) {
|
|
181
|
+
try {
|
|
182
|
+
socket.setMulticastTTL(1);
|
|
183
|
+
}
|
|
184
|
+
catch { }
|
|
185
|
+
try {
|
|
186
|
+
socket.setMulticastLoopback(true);
|
|
187
|
+
}
|
|
188
|
+
catch { }
|
|
189
|
+
}
|
|
190
|
+
#readLocalAddresses() {
|
|
191
|
+
const addresses = Object.values(networkInterfaces())
|
|
192
|
+
.flatMap(items => items ?? [])
|
|
193
|
+
.map(item => item.address)
|
|
194
|
+
.filter(Boolean);
|
|
195
|
+
return new Set(['127.0.0.1', '0.0.0.0', ...addresses]);
|
|
196
|
+
}
|
|
197
|
+
#envPeers() {
|
|
198
|
+
return API_GATEWAY_WHITELIST_ADDRESS
|
|
199
|
+
.split(',')
|
|
200
|
+
.map(ip => ip.trim())
|
|
201
|
+
.filter(Boolean);
|
|
202
|
+
}
|
|
203
|
+
#expandPeers(peers) {
|
|
204
|
+
return peers.flatMap(peer => {
|
|
205
|
+
const parts = peer.trim().split('.');
|
|
206
|
+
if (parts.length === 4)
|
|
207
|
+
return [peer.trim()];
|
|
208
|
+
if (parts.length === 3) {
|
|
209
|
+
return Array.from({ length: 256 }, (_, index) => `${peer.trim()}.${index}`);
|
|
210
|
+
}
|
|
211
|
+
return [];
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
#waitReady() {
|
|
215
|
+
const status = this.#status$.getValue();
|
|
216
|
+
if (status === 'ready' || status === 'closed')
|
|
217
|
+
return Promise.resolve();
|
|
218
|
+
return new Promise(resolve => {
|
|
219
|
+
let subscription;
|
|
220
|
+
subscription = this.#status$.subscribe(next => {
|
|
221
|
+
if (next !== 'ready' && next !== 'closed')
|
|
222
|
+
return;
|
|
223
|
+
subscription?.unsubscribe();
|
|
224
|
+
resolve();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
#onError(error) {
|
|
229
|
+
if (this.#isClosed())
|
|
230
|
+
return;
|
|
231
|
+
if (process.env.LIVEQUERY_UDP_DEBUG)
|
|
232
|
+
console.error(error);
|
|
233
|
+
}
|
|
234
|
+
#isClosed() {
|
|
235
|
+
return this.#status$.getValue() === 'closed';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=UdpDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UdpDiscovery.js","sourceRoot":"","sources":["../../src/UdpDiscovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as http from 'http';
|
|
2
|
+
import { Subject, Observable, Subscription } from 'rxjs';
|
|
3
|
+
import { UpdatedData, LivequeryBaseEntity } from '@livequery/types';
|
|
4
|
+
import { LivequeryContext, LivequeryHandler } from './LivequeryContext.js';
|
|
5
|
+
export type RealtimeSubscription = {
|
|
6
|
+
ref: string;
|
|
7
|
+
client_id: string;
|
|
8
|
+
gateway_id: string;
|
|
9
|
+
listener_node_id: string;
|
|
10
|
+
};
|
|
11
|
+
type SocketMeta = {
|
|
12
|
+
send(data: string): void;
|
|
13
|
+
close(): void;
|
|
14
|
+
on(event: 'message', h: (raw: string | Buffer) => void): void;
|
|
15
|
+
on(event: 'close' | 'error', h: () => void): void;
|
|
16
|
+
id: string;
|
|
17
|
+
gateway: boolean;
|
|
18
|
+
refs: Set<string>;
|
|
19
|
+
};
|
|
20
|
+
export declare class WebsocketGateway extends Subject<UpdatedData> implements LivequeryHandler {
|
|
21
|
+
#private;
|
|
22
|
+
readonly id: `${string}-${string}-${string}-${string}-${string}`;
|
|
23
|
+
readonly auth: `${string}-${string}-${string}-${string}-${string}`;
|
|
24
|
+
constructor(server: http.Server | number);
|
|
25
|
+
handle(ctx: LivequeryContext): any;
|
|
26
|
+
listen(events: RealtimeSubscription[]): void;
|
|
27
|
+
unsubscribe_client(socket: SocketMeta, body: {
|
|
28
|
+
ref?: string;
|
|
29
|
+
refs?: string[];
|
|
30
|
+
client_id?: string;
|
|
31
|
+
}): void;
|
|
32
|
+
link<T extends LivequeryBaseEntity>(ref: string, handler: (o?: Observable<UpdatedData<T>>) => Promise<Observable<UpdatedData<T>>> | Observable<UpdatedData<T>> | undefined | void): Promise<void>;
|
|
33
|
+
connect(url: string, auth: string, ondisconnect?: () => void): Subscription;
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
export {};
|