@livequery/core 2.0.103 → 2.0.105

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.
Files changed (95) hide show
  1. package/README.md +569 -314
  2. package/build/src/ApiGatewayHandler.d.ts +56 -0
  3. package/build/src/ApiGatewayHandler.js +210 -0
  4. package/build/src/ApiGatewayHandler.js.map +1 -0
  5. package/build/src/ApiGatewayLinker.d.ts +61 -0
  6. package/build/src/ApiGatewayLinker.js +229 -0
  7. package/build/src/ApiGatewayLinker.js.map +1 -0
  8. package/build/src/ApiServiceLinker.d.ts +18 -0
  9. package/build/src/ApiServiceLinker.js +61 -0
  10. package/build/src/ApiServiceLinker.js.map +1 -0
  11. package/build/src/LivequeryContext.d.ts +43 -0
  12. package/build/src/LivequeryContext.js +2 -0
  13. package/build/src/LivequeryContext.js.map +1 -0
  14. package/build/src/LivequeryDatasource.d.ts +8 -0
  15. package/build/src/LivequeryDatasource.js +2 -0
  16. package/build/src/LivequeryDatasource.js.map +1 -0
  17. package/build/src/LivequeryRequestParser.d.ts +13 -0
  18. package/build/src/LivequeryRequestParser.js +34 -0
  19. package/build/src/LivequeryRequestParser.js.map +1 -0
  20. package/build/src/UdpDiscovery.d.ts +26 -0
  21. package/build/src/UdpDiscovery.js +238 -0
  22. package/build/src/UdpDiscovery.js.map +1 -0
  23. package/build/src/WebsocketGateway.d.ts +36 -0
  24. package/build/src/WebsocketGateway.js +353 -0
  25. package/build/src/WebsocketGateway.js.map +1 -0
  26. package/build/src/const.d.ts +8 -0
  27. package/build/src/const.js +10 -0
  28. package/build/src/const.js.map +1 -0
  29. package/build/src/headers.d.ts +9 -0
  30. package/build/src/headers.js +32 -0
  31. package/build/src/headers.js.map +1 -0
  32. package/build/src/helpers/PathHelper.d.ts +11 -0
  33. package/build/src/helpers/PathHelper.js +41 -0
  34. package/build/src/helpers/PathHelper.js.map +1 -0
  35. package/build/src/helpers/hidePrivateFields.d.ts +3 -0
  36. package/build/src/helpers/hidePrivateFields.js +29 -0
  37. package/build/src/helpers/hidePrivateFields.js.map +1 -0
  38. package/build/src/helpers/nodeRequestToWebRequest.d.ts +7 -0
  39. package/build/src/helpers/nodeRequestToWebRequest.js +17 -0
  40. package/build/src/helpers/nodeRequestToWebRequest.js.map +1 -0
  41. package/build/src/helpers/writeWebResponse.d.ts +2 -0
  42. package/build/src/helpers/writeWebResponse.js +9 -0
  43. package/build/src/helpers/writeWebResponse.js.map +1 -0
  44. package/build/src/index.d.ts +9 -0
  45. package/build/src/index.js +10 -0
  46. package/build/src/index.js.map +1 -0
  47. package/build/src/parseLivequeryRequest.d.ts +10 -0
  48. package/build/src/parseLivequeryRequest.js +17 -0
  49. package/build/src/parseLivequeryRequest.js.map +1 -0
  50. package/build/tsconfig.tsbuildinfo +1 -0
  51. package/package.json +39 -103
  52. package/dist/LivequeryCollection.d.ts +0 -182
  53. package/dist/LivequeryCollection.d.ts.map +0 -1
  54. package/dist/LivequeryCollection.js +0 -231
  55. package/dist/LivequeryCollection.js.map +0 -1
  56. package/dist/LivequeryCore.d.ts +0 -157
  57. package/dist/LivequeryCore.d.ts.map +0 -1
  58. package/dist/LivequeryCore.js +0 -343
  59. package/dist/LivequeryCore.js.map +0 -1
  60. package/dist/LivequeryDocument.d.ts +0 -15
  61. package/dist/LivequeryDocument.d.ts.map +0 -1
  62. package/dist/LivequeryDocument.js +0 -22
  63. package/dist/LivequeryDocument.js.map +0 -1
  64. package/dist/LivequeryMemoryStorage.d.ts +0 -14
  65. package/dist/LivequeryMemoryStorage.d.ts.map +0 -1
  66. package/dist/LivequeryMemoryStorage.js +0 -89
  67. package/dist/LivequeryMemoryStorage.js.map +0 -1
  68. package/dist/LivequeryStorge.d.ts +0 -12
  69. package/dist/LivequeryStorge.d.ts.map +0 -1
  70. package/dist/LivequeryStorge.js +0 -2
  71. package/dist/LivequeryStorge.js.map +0 -1
  72. package/dist/LivequeryTransporter.d.ts +0 -22
  73. package/dist/LivequeryTransporter.d.ts.map +0 -1
  74. package/dist/LivequeryTransporter.js +0 -2
  75. package/dist/LivequeryTransporter.js.map +0 -1
  76. package/dist/helpers/filterDocs.d.ts +0 -5
  77. package/dist/helpers/filterDocs.d.ts.map +0 -1
  78. package/dist/helpers/filterDocs.js +0 -80
  79. package/dist/helpers/filterDocs.js.map +0 -1
  80. package/dist/helpers/tryCatch.d.ts +0 -2
  81. package/dist/helpers/tryCatch.d.ts.map +0 -1
  82. package/dist/helpers/tryCatch.js +0 -10
  83. package/dist/helpers/tryCatch.js.map +0 -1
  84. package/dist/helpers/whenCompleted.d.ts +0 -3
  85. package/dist/helpers/whenCompleted.d.ts.map +0 -1
  86. package/dist/helpers/whenCompleted.js +0 -5
  87. package/dist/helpers/whenCompleted.js.map +0 -1
  88. package/dist/index.d.ts +0 -9
  89. package/dist/index.d.ts.map +0 -1
  90. package/dist/index.js +0 -9
  91. package/dist/index.js.map +0 -1
  92. package/dist/types.d.ts +0 -70
  93. package/dist/types.d.ts.map +0 -1
  94. package/dist/types.js +0 -2
  95. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=LivequeryContext.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=LivequeryDatasource.js.map
@@ -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 {};