@livequery/nestjs 2.0.57 → 2.0.147

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 (49) hide show
  1. package/build/src/ApiGatewayLinker.d.ts +15 -7
  2. package/build/src/ApiGatewayLinker.js +55 -48
  3. package/build/src/ApiGatewayLinker.js.map +1 -1
  4. package/build/src/ApiServiceLinker.d.ts +12 -0
  5. package/build/src/ApiServiceLinker.js +46 -0
  6. package/build/src/ApiServiceLinker.js.map +1 -0
  7. package/build/src/LivequeryDatasourceInterceptors.d.ts +8 -2
  8. package/build/src/LivequeryDatasourceInterceptors.js +16 -8
  9. package/build/src/LivequeryDatasourceInterceptors.js.map +1 -1
  10. package/build/src/LivequeryInterceptor.d.ts +4 -9
  11. package/build/src/LivequeryInterceptor.js +33 -31
  12. package/build/src/LivequeryInterceptor.js.map +1 -1
  13. package/build/src/LivequeryWebsocketSync.d.ts +1 -61
  14. package/build/src/LivequeryWebsocketSync.js +4 -224
  15. package/build/src/LivequeryWebsocketSync.js.map +1 -1
  16. package/build/src/RxjsUdp.d.ts +11 -11
  17. package/build/src/RxjsUdp.js +37 -32
  18. package/build/src/RxjsUdp.js.map +1 -1
  19. package/build/src/SimpleApiGateway.d.ts +5 -0
  20. package/build/src/SimpleApiGateway.js +14 -0
  21. package/build/src/SimpleApiGateway.js.map +1 -0
  22. package/build/src/UdpDiscovery.d.ts +35 -0
  23. package/build/src/UdpDiscovery.js +231 -0
  24. package/build/src/UdpDiscovery.js.map +1 -0
  25. package/build/src/WebsocketGateway.d.ts +29 -0
  26. package/build/src/WebsocketGateway.js +257 -0
  27. package/build/src/WebsocketGateway.js.map +1 -0
  28. package/build/src/const.d.ts +1 -1
  29. package/build/src/const.js +1 -1
  30. package/build/src/const.js.map +1 -1
  31. package/build/src/helpers/PathHelper.d.ts +1 -1
  32. package/build/src/helpers/createDatasourceMapper.d.ts +3 -3
  33. package/build/src/helpers/createDatasourceMapper.js +2 -2
  34. package/build/src/helpers/createDatasourceMapper.js.map +1 -1
  35. package/build/src/helpers/hidePrivateFields.d.ts +1 -1
  36. package/build/src/helpers/listPaths.d.ts +2 -2
  37. package/build/src/helpers/listPaths.js +30 -19
  38. package/build/src/helpers/listPaths.js.map +1 -1
  39. package/build/src/index.d.ts +6 -4
  40. package/build/src/index.js +5 -3
  41. package/build/src/index.js.map +1 -1
  42. package/build/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +3 -1
  44. package/build/tests/gateway.d.ts +0 -2
  45. package/build/tests/gateway.js +0 -17
  46. package/build/tests/gateway.js.map +0 -1
  47. package/build/tests/service.d.ts +0 -14
  48. package/build/tests/service.js +0 -73
  49. package/build/tests/service.js.map +0 -1
@@ -0,0 +1,231 @@
1
+ import { createHmac, randomUUID } from 'crypto';
2
+ import { createSocket } from 'dgram';
3
+ import { networkInterfaces } from 'os';
4
+ import { Subject, Subscription, interval } 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 DEFAULT_PACKET_TTL_MS = 30_000;
8
+ const DEFAULT_SEEN_TTL_MS = 60_000;
9
+ export class UdpDiscovery {
10
+ node;
11
+ nodes$;
12
+ errors$;
13
+ #nodes = new Subject();
14
+ #errors = new Subject();
15
+ #externalSocket;
16
+ #localSocket;
17
+ #seen = new Map();
18
+ #subscriptions = new Subscription();
19
+ #localAddresses = new Set();
20
+ #key;
21
+ #port;
22
+ #localRelayPort;
23
+ #multicastAddress;
24
+ #packetTtlMs;
25
+ #seenTtlMs;
26
+ #peers;
27
+ #closed = false;
28
+ constructor(node, options) {
29
+ this.node = node;
30
+ this.#key = options.key;
31
+ this.#port = options.port ?? API_GATEWAY_MULTICAST_PORT;
32
+ this.#localRelayPort = options.localRelayPort ?? this.#port + 1;
33
+ this.#multicastAddress = options.multicastAddress ?? API_GATEWAY_MULTICAST_ADDRESS;
34
+ this.#packetTtlMs = options.packetTtlMs ?? DEFAULT_PACKET_TTL_MS;
35
+ this.#seenTtlMs = options.seenTtlMs ?? DEFAULT_SEEN_TTL_MS;
36
+ this.#peers = [
37
+ this.#multicastAddress,
38
+ ...this.#expandPeers(options.peers ?? this.#envPeers()),
39
+ ];
40
+ this.nodes$ = this.#nodes.asObservable();
41
+ this.errors$ = this.#errors.asObservable();
42
+ this.#externalSocket = createSocket({ type: 'udp4', reuseAddr: true });
43
+ this.#localSocket = createSocket({ type: 'udp4', reuseAddr: true });
44
+ this.#localAddresses = this.#readLocalAddresses();
45
+ this.#bindSockets();
46
+ if (options.announceIntervalMs && options.announceIntervalMs > 0) {
47
+ this.#subscriptions.add(interval(options.announceIntervalMs).subscribe(() => {
48
+ this.announce().catch(e => this.#onError(e));
49
+ }));
50
+ }
51
+ }
52
+ async announce() {
53
+ await this.broadcast(this.#peers);
54
+ await this.#sendLocal(this.#createPacket());
55
+ }
56
+ async broadcastTo(ip) {
57
+ await this.broadcast([ip]);
58
+ }
59
+ async broadcast(ips = this.#peers) {
60
+ const packet = this.#createPacket();
61
+ const raw = pack(packet);
62
+ await Promise.all(ips.map(ip => this.#send(this.#externalSocket, raw, this.#port, ip)));
63
+ }
64
+ close() {
65
+ if (this.#closed)
66
+ return;
67
+ this.#closed = true;
68
+ this.#subscriptions.unsubscribe();
69
+ this.#nodes.complete();
70
+ this.#errors.complete();
71
+ this.#externalSocket.close();
72
+ this.#localSocket.close();
73
+ }
74
+ #bindSockets() {
75
+ this.#externalSocket.on('message', (raw, rinfo) => this.#onExternalMessage(raw, rinfo));
76
+ this.#externalSocket.on('error', e => this.#onError(e));
77
+ this.#externalSocket.bind(this.#port, '0.0.0.0', () => {
78
+ this.#configureMulticast(this.#externalSocket);
79
+ for (const address of this.#localAddresses) {
80
+ try {
81
+ this.#externalSocket.addMembership(this.#multicastAddress, address);
82
+ }
83
+ catch { }
84
+ }
85
+ });
86
+ this.#localSocket.on('message', (raw, rinfo) => this.#onLocalMessage(raw, rinfo));
87
+ this.#localSocket.on('error', e => this.#onError(e));
88
+ this.#localSocket.bind(this.#localRelayPort, '0.0.0.0', () => {
89
+ this.#configureMulticast(this.#localSocket);
90
+ for (const address of this.#localAddresses) {
91
+ try {
92
+ this.#localSocket.addMembership(this.#multicastAddress, address);
93
+ }
94
+ catch { }
95
+ }
96
+ });
97
+ }
98
+ async #onExternalMessage(raw, rinfo) {
99
+ const decoded = this.#decode(raw);
100
+ if (!decoded)
101
+ return;
102
+ const isExternal = !this.#localAddresses.has(rinfo.address);
103
+ const firstSeen = this.#markSeen(decoded.packet.id);
104
+ if (isExternal && firstSeen) {
105
+ await this.#relayLocal(raw);
106
+ }
107
+ this.#consume(decoded, rinfo.address);
108
+ }
109
+ #onLocalMessage(raw, rinfo) {
110
+ const decoded = this.#decode(raw);
111
+ if (!decoded)
112
+ return;
113
+ if (!this.#markSeen(decoded.packet.id))
114
+ return;
115
+ this.#consume(decoded, rinfo.address);
116
+ }
117
+ #consume({ packet, unsigned }, host) {
118
+ if (packet.sender_id === this.node.node_id)
119
+ return;
120
+ if (packet.node.node_id === this.node.node_id)
121
+ return;
122
+ if (packet.node.namespace !== this.node.namespace)
123
+ return;
124
+ if (Math.abs(Date.now() - packet.timestamp) > this.#packetTtlMs)
125
+ return;
126
+ if (packet.signature !== this.#sign(unsigned))
127
+ return;
128
+ this.#nodes.next({
129
+ ...packet.node,
130
+ host: packet.node.host || host,
131
+ });
132
+ }
133
+ #decode(raw) {
134
+ try {
135
+ const packet = unpack(raw);
136
+ if (packet.version !== 1)
137
+ return;
138
+ if (!packet.id || !packet.sender_id || !packet.timestamp || !packet.node || !packet.signature)
139
+ return;
140
+ const { signature: _signature, ...unsigned } = packet;
141
+ return { packet, unsigned };
142
+ }
143
+ catch {
144
+ return;
145
+ }
146
+ }
147
+ #createPacket() {
148
+ const unsigned = {
149
+ version: 1,
150
+ id: randomUUID(),
151
+ sender_id: this.node.node_id,
152
+ timestamp: Date.now(),
153
+ node: this.node,
154
+ };
155
+ return {
156
+ ...unsigned,
157
+ signature: this.#sign(unsigned),
158
+ };
159
+ }
160
+ #sign(packet) {
161
+ return createHmac('sha256', this.#key).update(pack(packet)).digest('hex');
162
+ }
163
+ #markSeen(id) {
164
+ const now = Date.now();
165
+ this.#cleanupSeen(now);
166
+ if (this.#seen.has(id))
167
+ return false;
168
+ this.#seen.set(id, now + this.#seenTtlMs);
169
+ return true;
170
+ }
171
+ #cleanupSeen(now = Date.now()) {
172
+ for (const [id, expiresAt] of this.#seen) {
173
+ if (expiresAt <= now)
174
+ this.#seen.delete(id);
175
+ }
176
+ }
177
+ async #relayLocal(raw) {
178
+ await this.#send(this.#localSocket, raw, this.#localRelayPort, this.#multicastAddress);
179
+ }
180
+ async #sendLocal(packet) {
181
+ await this.#send(this.#localSocket, pack(packet), this.#localRelayPort, this.#multicastAddress);
182
+ }
183
+ #send(socket, raw, port, host) {
184
+ return new Promise(resolve => {
185
+ socket.send(raw, 0, raw.length, port, host, e => {
186
+ if (e)
187
+ this.#onError(e);
188
+ resolve();
189
+ });
190
+ });
191
+ }
192
+ #configureMulticast(socket) {
193
+ try {
194
+ socket.setMulticastTTL(1);
195
+ }
196
+ catch { }
197
+ try {
198
+ socket.setMulticastLoopback(true);
199
+ }
200
+ catch { }
201
+ }
202
+ #readLocalAddresses() {
203
+ const addresses = Object.values(networkInterfaces())
204
+ .flatMap(items => items ?? [])
205
+ .map(item => item.address)
206
+ .filter(Boolean);
207
+ return new Set(['127.0.0.1', '0.0.0.0', ...addresses]);
208
+ }
209
+ #envPeers() {
210
+ return API_GATEWAY_WHITELIST_ADDRESS
211
+ .split(',')
212
+ .map(ip => ip.trim())
213
+ .filter(Boolean);
214
+ }
215
+ #expandPeers(peers) {
216
+ return peers.flatMap(peer => {
217
+ const parts = peer.trim().split('.');
218
+ if (parts.length === 4)
219
+ return [peer.trim()];
220
+ if (parts.length === 3) {
221
+ return Array.from({ length: 256 }, (_, index) => `${peer.trim()}.${index}`);
222
+ }
223
+ return [];
224
+ });
225
+ }
226
+ #onError(error) {
227
+ if (!this.#closed)
228
+ this.#errors.next(error);
229
+ }
230
+ }
231
+ //# 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,29 @@
1
+ import * as http from 'http';
2
+ import { Subject, Observable, Subscription } from 'rxjs';
3
+ import { UpdatedData, LivequeryBaseEntity } from '@livequery/types';
4
+ import { RealtimeSubscription } from './LivequeryInterceptor.js';
5
+ type SocketMeta = {
6
+ send(data: string): void;
7
+ close(): void;
8
+ on(event: 'message', h: (raw: string | Buffer) => void): void;
9
+ on(event: 'close' | 'error', h: () => void): void;
10
+ id: string;
11
+ gateway: boolean;
12
+ refs: Set<string>;
13
+ };
14
+ export declare const WEBSOCKET_PATH: string;
15
+ export declare class WebsocketGateway extends Subject<UpdatedData> {
16
+ #private;
17
+ readonly id: `${string}-${string}-${string}-${string}-${string}`;
18
+ readonly auth: `${string}-${string}-${string}-${string}-${string}`;
19
+ constructor(server: http.Server | number);
20
+ listen(events: RealtimeSubscription[]): void;
21
+ unsubscribe_client(socket: SocketMeta, body: {
22
+ ref?: string;
23
+ refs?: string[];
24
+ client_id?: string;
25
+ }): void;
26
+ link<T extends LivequeryBaseEntity>(ref: string, handler: (o?: Observable<UpdatedData<T>>) => Promise<Observable<UpdatedData<T>>> | Observable<UpdatedData<T>> | undefined | void): Promise<void>;
27
+ connect(url: string, auth: string, ondisconnect?: () => void): Subscription;
28
+ }
29
+ export {};
@@ -0,0 +1,257 @@
1
+ import { WebSocket, WebSocketServer } from 'ws';
2
+ import { Subject, BehaviorSubject, of, fromEvent, merge, EMPTY, timer, } from 'rxjs';
3
+ import { tap, map, switchMap, filter, finalize, mergeAll, retry, takeWhile, } from 'rxjs/operators';
4
+ import { randomUUID } from 'crypto';
5
+ import { NODE_ID } from './const.js';
6
+ const isBun = typeof globalThis.Bun !== 'undefined';
7
+ const ENDPOINT_RESTARTED = 'ENDPOINT_RESTARTED';
8
+ export const WEBSOCKET_PATH = process.env.REALTIME_UPDATE_SOCKET_PATH || '/livequery/realtime-updates';
9
+ export class WebsocketGateway extends Subject {
10
+ #connections = new Map();
11
+ #subscriptions = new Map();
12
+ #pipes = new Map();
13
+ id = NODE_ID;
14
+ auth = randomUUID();
15
+ constructor(server) {
16
+ super();
17
+ if (typeof server === 'number') {
18
+ if (!isBun)
19
+ throw new Error('Passing a port number requires Bun runtime');
20
+ this.#startBun(server);
21
+ }
22
+ else {
23
+ this.#startNode(server);
24
+ }
25
+ this.subscribe(({ ref, data, type }) => {
26
+ const targets = [
27
+ ...this.#subscriptions.get(ref) ?? new Map(),
28
+ ...this.#subscriptions.get(`${ref}/${data.id}`) ?? new Map(),
29
+ ].reduce((acc, [client_id, { gateway_id }]) => {
30
+ const conn_id = gateway_id === NODE_ID ? client_id : gateway_id;
31
+ const prev = acc.get(conn_id);
32
+ const socket = prev?.socket ?? this.#connections.get(conn_id);
33
+ if (!socket)
34
+ return acc;
35
+ acc.set(conn_id, { socket, cids: [...prev?.cids ?? [], client_id] });
36
+ return acc;
37
+ }, new Map());
38
+ for (const [, { socket, cids }] of targets) {
39
+ const event = { event: 'sync', cids, data: { changes: [{ ref, data, type }] } };
40
+ socket.send(JSON.stringify(event));
41
+ }
42
+ });
43
+ }
44
+ #startNode(server) {
45
+ const wss = new WebSocketServer({ server, path: WEBSOCKET_PATH });
46
+ wss.on('connection', (ws) => {
47
+ const socket = Object.assign(ws, {
48
+ id: '', gateway: false, refs: new Set()
49
+ });
50
+ this.#onConnection(socket);
51
+ });
52
+ }
53
+ #startBun(port) {
54
+ const self = this;
55
+ const Bun = globalThis.Bun;
56
+ Bun.serve({
57
+ port,
58
+ fetch(req, server) {
59
+ if (new URL(req.url).pathname === WEBSOCKET_PATH) {
60
+ const ok = server.upgrade(req, {
61
+ data: {
62
+ id: '', gateway: false,
63
+ refs: new Set(),
64
+ _on: {},
65
+ },
66
+ });
67
+ if (ok)
68
+ return;
69
+ }
70
+ return new Response('Not found', { status: 404 });
71
+ },
72
+ websocket: {
73
+ open(ws) {
74
+ const socket = {
75
+ send: (d) => ws.send(d),
76
+ close: () => ws.close(),
77
+ on(event, h) {
78
+ if (event === 'message')
79
+ ws.data._on.msg = h;
80
+ else
81
+ ws.data._on.close = h;
82
+ },
83
+ get id() { return ws.data.id; },
84
+ set id(v) { ws.data.id = v; },
85
+ get gateway() { return ws.data.gateway; },
86
+ set gateway(v) { ws.data.gateway = v; },
87
+ get refs() { return ws.data.refs; },
88
+ set refs(v) { ws.data.refs = v; },
89
+ };
90
+ self.#onConnection(socket);
91
+ },
92
+ message(ws, data) { ws.data._on.msg?.(data); },
93
+ close(ws) { ws.data._on.close?.(); },
94
+ error(ws) { ws.data._on.close?.(); },
95
+ },
96
+ });
97
+ }
98
+ #onConnection(socket) {
99
+ socket.on('message', (raw) => {
100
+ try {
101
+ const msg = JSON.parse(raw.toString());
102
+ if (msg.event === 'start')
103
+ this.#onStart(socket, msg.data);
104
+ if (msg.event === 'unsubscribe')
105
+ this.unsubscribe_client(socket, msg.data);
106
+ if (msg.event === 'subscribe')
107
+ this.listen([msg]);
108
+ }
109
+ catch { }
110
+ });
111
+ socket.on('close', () => this.#onDisconnect(socket));
112
+ socket.on('error', () => this.#onDisconnect(socket));
113
+ }
114
+ #onStart(socket, { id, auth }) {
115
+ if (socket.id)
116
+ return;
117
+ if (auth && auth !== this.auth) {
118
+ socket.close();
119
+ return;
120
+ }
121
+ if (this.#connections.has(id)) {
122
+ socket.close();
123
+ return;
124
+ }
125
+ socket.id = id;
126
+ socket.gateway = auth === this.auth;
127
+ socket.refs = new Set();
128
+ this.#connections.set(id, socket);
129
+ const hello = { event: 'hello', gid: NODE_ID };
130
+ socket.send(JSON.stringify(hello));
131
+ }
132
+ #onDisconnect(socket) {
133
+ if (!socket.id)
134
+ return;
135
+ if (socket.gateway) {
136
+ for (const [ref, map] of this.#subscriptions) {
137
+ for (const [client_id, { gateway_id }] of map) {
138
+ if (gateway_id === socket.id)
139
+ map.delete(client_id);
140
+ }
141
+ if (map.size === 0) {
142
+ this.#pipes.get(ref)?.s.unsubscribe();
143
+ this.#subscriptions.delete(ref);
144
+ }
145
+ }
146
+ }
147
+ else {
148
+ const refs = [...socket.refs ?? []];
149
+ if (refs.length > 0)
150
+ this.unsubscribe_client(socket, { refs, client_id: socket.id });
151
+ }
152
+ this.#connections.delete(socket.id);
153
+ }
154
+ listen(events) {
155
+ for (const { ref, client_id, gateway_id, listener_node_id } of events) {
156
+ if (client_id === gateway_id)
157
+ continue;
158
+ const socket = this.#connections.get(client_id);
159
+ if (gateway_id === NODE_ID && (!socket || socket.refs?.has(ref))) {
160
+ if (listener_node_id !== NODE_ID) {
161
+ const target = this.#connections.get(listener_node_id);
162
+ if (target) {
163
+ const ev = { event: 'unsubscribe', data: { client_id, ref } };
164
+ target.send(JSON.stringify(ev));
165
+ }
166
+ }
167
+ continue;
168
+ }
169
+ const map = this.#subscriptions.get(ref) ?? new Map();
170
+ if (map.has(client_id))
171
+ continue;
172
+ map.set(client_id, { gateway_id, listener_node_id });
173
+ this.#subscriptions.set(ref, map);
174
+ socket?.refs?.add(ref);
175
+ if (gateway_id !== NODE_ID) {
176
+ const target = this.#connections.get(gateway_id);
177
+ if (target) {
178
+ const ev = { event: 'subscribe', client_id, gateway_id, ref, listener_node_id };
179
+ target.send(JSON.stringify(ev));
180
+ }
181
+ }
182
+ }
183
+ }
184
+ unsubscribe_client(socket, body) {
185
+ const client_id = body.client_id ?? socket.id;
186
+ const refs = [...body.ref ? [body.ref] : [], ...body.refs ?? []];
187
+ for (const ref of refs) {
188
+ const map = this.#subscriptions.get(ref);
189
+ if (!map)
190
+ continue;
191
+ const routing = map.get(client_id);
192
+ map.delete(client_id);
193
+ if (map.size === 0) {
194
+ this.#pipes.get(ref)?.s.unsubscribe();
195
+ this.#subscriptions.delete(ref);
196
+ }
197
+ this.#connections.get(client_id)?.refs?.delete(ref);
198
+ const listener_node_id = routing?.listener_node_id;
199
+ if (listener_node_id && listener_node_id !== NODE_ID) {
200
+ const gateway = this.#connections.get(listener_node_id);
201
+ if (gateway) {
202
+ const ev = { event: 'unsubscribe', data: { ref, client_id } };
203
+ gateway.send(JSON.stringify(ev));
204
+ }
205
+ }
206
+ }
207
+ }
208
+ async link(ref, handler) {
209
+ if (!this.#subscriptions.has(ref))
210
+ return;
211
+ const m = this.#pipes.get(ref);
212
+ const merged = handler(m?.o);
213
+ const o = merged instanceof Promise ? await merged : merged;
214
+ if (!o || o === m?.o)
215
+ return;
216
+ m?.s.unsubscribe();
217
+ this.#pipes.set(ref, {
218
+ o,
219
+ s: o.pipe(finalize(() => this.#pipes.delete(ref))).subscribe(data => this.next(data))
220
+ });
221
+ }
222
+ connect(url, auth, ondisconnect) {
223
+ const gateway$ = new BehaviorSubject({ id: '', stop: false });
224
+ return of(0).pipe(takeWhile(() => !gateway$.getValue().stop), map(() => new WebSocket(url)), switchMap((ws) => merge(fromEvent(ws, 'open').pipe(tap(() => {
225
+ const ev = { event: 'start', data: { id: NODE_ID, auth } };
226
+ ws.send(JSON.stringify(ev));
227
+ })), fromEvent(ws, 'close').pipe(map(() => { throw 'CLOSED'; })), fromEvent(ws, 'error').pipe(map(e => { throw e; })), fromEvent(ws, 'message').pipe(map(({ data }) => {
228
+ const parsed = JSON.parse(data.toString());
229
+ if (parsed.event === 'hello') {
230
+ const old_id = gateway$.getValue().id;
231
+ if (old_id === '') {
232
+ gateway$.next({ id: parsed.gid, stop: false });
233
+ }
234
+ else if (old_id !== parsed.gid) {
235
+ gateway$.next({ id: parsed.gid, stop: true });
236
+ throw ENDPOINT_RESTARTED;
237
+ }
238
+ this.#connections.set(parsed.gid, Object.assign(ws, { id: parsed.gid, gateway: true, refs: new Set() }));
239
+ return null;
240
+ }
241
+ if (parsed.event === 'subscribe') {
242
+ this.listen([parsed]);
243
+ return null;
244
+ }
245
+ return parsed;
246
+ }), filter(Boolean), map(({ cids, data }) => cids.map(client_id => ({ event: 'sync', data, client_id }))), mergeAll(), tap(({ client_id, ...event }) => {
247
+ this.#connections.get(client_id)?.send(JSON.stringify(event));
248
+ }))).pipe(finalize(() => {
249
+ const id = ws.id;
250
+ if (id)
251
+ this.#connections.delete(id);
252
+ }))), retry({
253
+ delay: (e, n) => (n >= 5 || e === ENDPOINT_RESTARTED) ? EMPTY : timer(1000)
254
+ }), finalize(() => ondisconnect?.())).subscribe();
255
+ }
256
+ }
257
+ //# sourceMappingURL=WebsocketGateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketGateway.js","sourceRoot":"","sources":["../../src/WebsocketGateway.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
+ export declare const NODE_ID: `${string}-${string}-${string}-${string}-${string}`;
1
2
  export declare const API_GATEWAY_NAMESPACE: string;
2
3
  export declare const LIVEQUERY_MAGIC_KEY: string;
3
4
  export declare const API_GATEWAY_MULTICAST_PORT: number;
4
5
  export declare const API_GATEWAY_MULTICAST_ADDRESS: string;
5
6
  export declare const API_GATEWAY_WHITELIST_ADDRESS: string;
6
- export declare const NODE_ID: `${string}-${string}-${string}-${string}-${string}`;
7
7
  export declare const LIVEQUERY_API_GATEWAY_DEBUG: string | boolean;
@@ -1,9 +1,9 @@
1
1
  import { randomUUID } from "crypto";
2
+ export const NODE_ID = randomUUID();
2
3
  export const API_GATEWAY_NAMESPACE = process.env.API_GATEWAY_NAMESPACE || 'default';
3
4
  export const LIVEQUERY_MAGIC_KEY = `${process.env.LIVEQUERY_MAGIC_KEY || 'livequery'}/`;
4
5
  export const API_GATEWAY_MULTICAST_PORT = Number(process.env.UDP_PUBLIC_PORT || 11001);
5
6
  export const API_GATEWAY_MULTICAST_ADDRESS = process.env.UDP_MULTICAST_ADDRESS || "239.0.1.1";
6
7
  export const API_GATEWAY_WHITELIST_ADDRESS = process.env.UDP_WHITELIST_ADDRESS || '';
7
- export const NODE_ID = randomUUID();
8
8
  export const LIVEQUERY_API_GATEWAY_DEBUG = process.env.LIVEQUERY_API_GATEWAY_DEBUG || false;
9
9
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAA;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,WAAW,GAAG,CAAA;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC,CAAA;AACtF,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,WAAW,CAAA;AAC7F,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAA;AACpF,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,KAAK,CAAA"}
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;AACnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAA;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,WAAW,GAAG,CAAA;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC,CAAA;AACtF,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,WAAW,CAAA;AAC7F,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAA;AACpF,MAAM,CAAC,MAAM,2BAA2B,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,KAAK,CAAA"}
@@ -4,7 +4,7 @@ export declare class PathHelper {
4
4
  ref: string;
5
5
  schema_ref: string;
6
6
  is_collection: boolean;
7
- doc_id: string;
7
+ doc_id: string | null | undefined;
8
8
  collection_ref: string;
9
9
  };
10
10
  static join(a: string | string[], b: string | string[]): string[];
@@ -3,7 +3,7 @@ import { RouterOptions } from "express";
3
3
  import { Observable } from 'rxjs';
4
4
  import { ModuleRef } from "@nestjs/core";
5
5
  import { UpdatedData } from "@livequery/types";
6
- import { LivequeryWebsocketSync } from "../LivequeryWebsocketSync.js";
6
+ import { WebsocketGateway } from "@livequery/core";
7
7
  export type ResolverRoutes = Array<{
8
8
  path: string;
9
9
  options: RouterOptions;
@@ -25,10 +25,10 @@ export type CreateDatasourceOptions<Config, RouteOptions> = {
25
25
  querier: LivequeryDatasourceFactory<Config, RouteOptions>;
26
26
  watcher?: LivequeryDatasourceWatcherFactory<Config, RouteOptions>;
27
27
  injects?: any[];
28
- config?: Config | ((...args: any[]) => Promise<Config> | Config);
28
+ config: Config | ((...args: any[]) => Promise<Config> | Config);
29
29
  };
30
30
  export declare const createDatasourceMapper: <Config, RouteOptions>({ querier, injects, config: configResolver, watcher }: CreateDatasourceOptions<Config, RouteOptions>) => [(options: RouteOptions) => <TFunction extends Function, Y>(target: TFunction | object, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void, {
31
31
  provide: LivequeryDatasourceFactory<Config, RouteOptions>;
32
32
  inject: any[];
33
- useFactory: (moduleRef: ModuleRef, ws: LivequeryWebsocketSync, ...injections: any[]) => Promise<LivequeryDatasource<Config, RouteOptions>>;
33
+ useFactory: (moduleRef: ModuleRef, ws: WebsocketGateway, ...injections: any[]) => Promise<LivequeryDatasource<Config, RouteOptions>>;
34
34
  }];
@@ -2,7 +2,7 @@ import { applyDecorators, SetMetadata, UseInterceptors } from "@nestjs/common";
2
2
  import { LivequeryDatasourceInterceptors } from "../LivequeryDatasourceInterceptors.js";
3
3
  import { UseLivequeryInterceptor } from "../LivequeryInterceptor.js";
4
4
  import { ModuleRef } from "@nestjs/core";
5
- import { LivequeryWebsocketSync } from "../LivequeryWebsocketSync.js";
5
+ import { WebsocketGateway } from "@livequery/core";
6
6
  export const createDatasourceMapper = ({ querier, injects = [], config: configResolver, watcher }) => {
7
7
  const decorator = (options) => {
8
8
  const metadata = {
@@ -13,7 +13,7 @@ export const createDatasourceMapper = ({ querier, injects = [], config: configRe
13
13
  };
14
14
  const provider = {
15
15
  provide: querier,
16
- inject: [ModuleRef, LivequeryWebsocketSync, ...injects],
16
+ inject: [ModuleRef, WebsocketGateway, ...injects],
17
17
  useFactory: async (moduleRef, ws, ...injections) => {
18
18
  const ds = await moduleRef.create(querier);
19
19
  const interceptor = await moduleRef.create(LivequeryDatasourceInterceptors);
@@ -1 +1 @@
1
- {"version":3,"file":"createDatasourceMapper.js","sourceRoot":"","sources":["../../../src/helpers/createDatasourceMapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAkD,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxI,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AA+BtE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAuB,EACzD,OAAO,EACP,OAAO,GAAG,EAAE,EACZ,MAAM,EAAE,cAAc,EACtB,OAAO,EACqC,EAAE,EAAE;IAGhD,MAAM,SAAS,GAAG,CAAC,OAAqB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAA4C;YACtD,OAAO;YACP,UAAU,EAAE,OAA4B;SAC3C,CAAA;QACD,OAAO,eAAe,CAClB,uBAAuB,EAAE,EACzB,eAAe,CAAC,+BAA+B,CAAC,EAChD,WAAW,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CACzD,CAAA;IACL,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG;QACb,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,CAAC,SAAS,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC;QACvD,UAAU,EAAE,KAAK,EAAE,SAAoB,EAAE,EAA0B,EAAE,GAAG,UAAiB,EAAE,EAAE;YACzF,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAA4C,OAAO,CAAC,CAAA;YACrF,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAkC,+BAA+B,CAAC,CAAA;YAC5G,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAe,OAA4B,CAAC,CAAA;YAChF,MAAM,MAAM,GAAG,cAAc,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;YACxG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC7B,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,MAAM,CAAmD,OAAO,CAAC,CAAA;gBAC3F,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC;oBAClC,IAAI,CAAC,KAAK;wBACN,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBAClB,CAAC;iBACJ,CAAC,CAAA;YACN,CAAC;YACD,OAAO,EAAE,CAAA;QACb,CAAC;KACJ,CAAA;IAGD,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAwC,CAAA;AACvE,CAAC,CAAA"}
1
+ {"version":3,"file":"createDatasourceMapper.js","sourceRoot":"","sources":["../../../src/helpers/createDatasourceMapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAkD,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxI,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA+BnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAuB,EACzD,OAAO,EACP,OAAO,GAAG,EAAE,EACZ,MAAM,EAAE,cAAc,EACtB,OAAO,EACqC,EAAE,EAAE;IAGhD,MAAM,SAAS,GAAG,CAAC,OAAqB,EAAE,EAAE;QACxC,MAAM,QAAQ,GAA4C;YACtD,OAAO;YACP,UAAU,EAAE,OAA4B;SAC3C,CAAA;QACD,OAAO,eAAe,CAClB,uBAAuB,EAAE,EACzB,eAAe,CAAC,+BAA+B,CAAC,EAChD,WAAW,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CACzD,CAAA;IACL,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG;QACb,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;QACjD,UAAU,EAAE,KAAK,EAAE,SAAoB,EAAE,EAAoB,EAAE,GAAG,UAAiB,EAAE,EAAE;YACnF,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,CAA4C,OAAO,CAAC,CAAA;YACrF,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAkC,+BAA+B,CAAC,CAAA;YAC5G,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAe,OAA4B,CAAC,CAAA;YAChF,MAAM,MAAM,GAAG,cAAc,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;YACxG,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC7B,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,MAAM,CAAmD,OAAO,CAAC,CAAA;gBAC3F,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC;oBAClC,IAAI,CAAC,KAAK;wBACN,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBAClB,CAAC;iBACJ,CAAC,CAAA;YACN,CAAC;YACD,OAAO,EAAE,CAAA;QACb,CAAC;KACJ,CAAA;IAGD,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAwC,CAAA;AACvE,CAAC,CAAA"}
@@ -2,5 +2,5 @@ import { LivequeryBaseEntity } from "@livequery/types";
2
2
  export declare const hidePrivateFields: <T extends LivequeryBaseEntity>(data: T & {
3
3
  _id?: string;
4
4
  }) => {
5
- id: string;
5
+ id: string | undefined;
6
6
  };