@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.
- package/build/src/ApiGatewayLinker.d.ts +15 -7
- package/build/src/ApiGatewayLinker.js +55 -48
- package/build/src/ApiGatewayLinker.js.map +1 -1
- package/build/src/ApiServiceLinker.d.ts +12 -0
- package/build/src/ApiServiceLinker.js +46 -0
- package/build/src/ApiServiceLinker.js.map +1 -0
- package/build/src/LivequeryDatasourceInterceptors.d.ts +8 -2
- package/build/src/LivequeryDatasourceInterceptors.js +16 -8
- package/build/src/LivequeryDatasourceInterceptors.js.map +1 -1
- package/build/src/LivequeryInterceptor.d.ts +4 -9
- package/build/src/LivequeryInterceptor.js +33 -31
- package/build/src/LivequeryInterceptor.js.map +1 -1
- package/build/src/LivequeryWebsocketSync.d.ts +1 -61
- package/build/src/LivequeryWebsocketSync.js +4 -224
- package/build/src/LivequeryWebsocketSync.js.map +1 -1
- package/build/src/RxjsUdp.d.ts +11 -11
- package/build/src/RxjsUdp.js +37 -32
- package/build/src/RxjsUdp.js.map +1 -1
- package/build/src/SimpleApiGateway.d.ts +5 -0
- package/build/src/SimpleApiGateway.js +14 -0
- package/build/src/SimpleApiGateway.js.map +1 -0
- package/build/src/UdpDiscovery.d.ts +35 -0
- package/build/src/UdpDiscovery.js +231 -0
- package/build/src/UdpDiscovery.js.map +1 -0
- package/build/src/WebsocketGateway.d.ts +29 -0
- package/build/src/WebsocketGateway.js +257 -0
- package/build/src/WebsocketGateway.js.map +1 -0
- package/build/src/const.d.ts +1 -1
- package/build/src/const.js +1 -1
- package/build/src/const.js.map +1 -1
- package/build/src/helpers/PathHelper.d.ts +1 -1
- package/build/src/helpers/createDatasourceMapper.d.ts +3 -3
- package/build/src/helpers/createDatasourceMapper.js +2 -2
- package/build/src/helpers/createDatasourceMapper.js.map +1 -1
- package/build/src/helpers/hidePrivateFields.d.ts +1 -1
- package/build/src/helpers/listPaths.d.ts +2 -2
- package/build/src/helpers/listPaths.js +30 -19
- package/build/src/helpers/listPaths.js.map +1 -1
- package/build/src/index.d.ts +6 -4
- package/build/src/index.js +5 -3
- package/build/src/index.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -1
- package/build/tests/gateway.d.ts +0 -2
- package/build/tests/gateway.js +0 -17
- package/build/tests/gateway.js.map +0 -1
- package/build/tests/service.d.ts +0 -14
- package/build/tests/service.js +0 -73
- 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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"}
|
package/build/src/const.d.ts
CHANGED
|
@@ -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;
|
package/build/src/const.js
CHANGED
|
@@ -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
|
package/build/src/const.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
|
@@ -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 {
|
|
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
|
|
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:
|
|
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 {
|
|
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,
|
|
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,
|
|
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"}
|