@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
|
@@ -1,229 +1,9 @@
|
|
|
1
|
-
import { __decorate
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import WebSocket from 'ws';
|
|
5
|
-
import { of, fromEvent, map, finalize, merge, EMPTY, filter, mergeAll } from 'rxjs';
|
|
6
|
-
import { randomUUID } from "crypto";
|
|
7
|
-
import { NODE_ID } from "./const.js";
|
|
8
|
-
const ENDPOINT_RESTARTED = 'ENDPOINT_RESTARTED';
|
|
9
|
-
export const WEBSOCKET_PATH = process.env.REALTIME_UPDATE_SOCKET_PATH || '/livequery/realtime-updates';
|
|
10
|
-
let LivequeryWebsocketSync = class LivequeryWebsocketSync extends Subject {
|
|
11
|
-
#connections = new Map();
|
|
12
|
-
#subscriptions = new Map();
|
|
13
|
-
#pipes = new Map();
|
|
14
|
-
id = NODE_ID;
|
|
15
|
-
auth = randomUUID();
|
|
16
|
-
constructor() {
|
|
17
|
-
super();
|
|
18
|
-
this.subscribe(({ ref, data, type }) => {
|
|
19
|
-
const targets = [
|
|
20
|
-
...this.#subscriptions.get(ref) || new Map(),
|
|
21
|
-
...this.#subscriptions.get(`${ref}/${data.id}`) || new Map()
|
|
22
|
-
].reduce((p, [client_id, { gateway_id }]) => {
|
|
23
|
-
const connection_id = gateway_id == NODE_ID ? client_id : gateway_id;
|
|
24
|
-
const old = p.get(connection_id);
|
|
25
|
-
const socket = old ? old.socket : this.#connections.get(connection_id);
|
|
26
|
-
if (!socket)
|
|
27
|
-
return p;
|
|
28
|
-
const cids = [...old ? old.cids : [], client_id];
|
|
29
|
-
p.set(connection_id, { cids, socket });
|
|
30
|
-
return p;
|
|
31
|
-
}, new Map());
|
|
32
|
-
for (const [_, { cids, socket }] of targets) {
|
|
33
|
-
const event = {
|
|
34
|
-
event: 'sync',
|
|
35
|
-
cids,
|
|
36
|
-
data: { changes: [{ ref, data, type }] }
|
|
37
|
-
};
|
|
38
|
-
const payload = JSON.stringify(event);
|
|
39
|
-
socket.send(payload);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
async link(ref, handler) {
|
|
44
|
-
if (!this.#subscriptions.has(ref))
|
|
45
|
-
return;
|
|
46
|
-
const m = this.#pipes.get(ref);
|
|
47
|
-
const merged = handler(m?.o);
|
|
48
|
-
const o = merged instanceof Promise ? await merged : merged;
|
|
49
|
-
if (!o || o == m?.o)
|
|
50
|
-
return;
|
|
51
|
-
m?.s.unsubscribe();
|
|
52
|
-
this.#pipes.set(ref, {
|
|
53
|
-
o,
|
|
54
|
-
s: o.pipe(finalize(() => {
|
|
55
|
-
this.#pipes.delete(ref);
|
|
56
|
-
})).subscribe(data => this.next(data))
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
connect(url, auth, ondisconect) {
|
|
60
|
-
const gateway$ = new BehaviorSubject({ id: '', stop: false });
|
|
61
|
-
return of(0).pipe(takeWhile(() => !gateway$.getValue().stop), map(() => new WebSocket(url)), switchMap((ws) => {
|
|
62
|
-
return merge(fromEvent(ws, 'open').pipe(tap(() => {
|
|
63
|
-
const payload = { event: 'start', data: { id: NODE_ID, auth } };
|
|
64
|
-
ws.send(JSON.stringify(payload));
|
|
65
|
-
})), fromEvent(ws, 'close').pipe(map(() => { throw 'CLOSED'; })), fromEvent(ws, 'error').pipe(map(e => { throw e; })), fromEvent(ws, 'message').pipe(map((event) => {
|
|
66
|
-
const data = event.data;
|
|
67
|
-
const parsed = JSON.parse(data.toString());
|
|
68
|
-
if (parsed.event == 'hello') {
|
|
69
|
-
ws.id = parsed.gid;
|
|
70
|
-
const old_id = gateway$.getValue().id;
|
|
71
|
-
if (old_id == '') {
|
|
72
|
-
gateway$.next({ id: ws.id, stop: false });
|
|
73
|
-
}
|
|
74
|
-
if (old_id != '' && old_id != ws.id) {
|
|
75
|
-
gateway$.next({ id: ws.id, stop: true });
|
|
76
|
-
throw ENDPOINT_RESTARTED;
|
|
77
|
-
}
|
|
78
|
-
this.#connections.set(parsed.gid, ws);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
if (parsed.event == 'subscribe') {
|
|
82
|
-
this.listen([parsed]);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
return parsed;
|
|
86
|
-
}), filter(Boolean), map(({ event, cids, data }) => cids.map(client_id => ({ event, data, client_id }))), mergeAll(), tap(({ client_id, ...event }) => {
|
|
87
|
-
const socket = this.#connections.get(client_id);
|
|
88
|
-
socket && socket.send(JSON.stringify(event));
|
|
89
|
-
}))).pipe(finalize(() => {
|
|
90
|
-
this.#connections.delete(ws.id);
|
|
91
|
-
}));
|
|
92
|
-
}), retry({
|
|
93
|
-
delay: (e, n) => {
|
|
94
|
-
if (n >= 5 || e == ENDPOINT_RESTARTED)
|
|
95
|
-
return EMPTY;
|
|
96
|
-
return timer(1000);
|
|
97
|
-
}
|
|
98
|
-
}), finalize(() => {
|
|
99
|
-
ondisconect?.();
|
|
100
|
-
})).subscribe();
|
|
101
|
-
}
|
|
102
|
-
start(socket, { id, auth }) {
|
|
103
|
-
if (socket.id)
|
|
104
|
-
return;
|
|
105
|
-
if (auth && auth != this.auth) {
|
|
106
|
-
socket.close();
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
if (this.#connections.has(id)) {
|
|
110
|
-
socket.close();
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
socket.id = id;
|
|
114
|
-
socket.gateway = auth == this.auth;
|
|
115
|
-
socket.refs = new Set();
|
|
116
|
-
this.#connections.set(id, socket);
|
|
117
|
-
const payload = { event: 'hello', gid: NODE_ID };
|
|
118
|
-
socket.send(JSON.stringify(payload));
|
|
119
|
-
}
|
|
120
|
-
unref(socket, body) {
|
|
121
|
-
const client_id = body.client_id || socket.id;
|
|
122
|
-
const refs = [
|
|
123
|
-
...body.ref ? [body.ref] : [],
|
|
124
|
-
...body.refs || []
|
|
125
|
-
];
|
|
126
|
-
for (const ref of refs) {
|
|
127
|
-
const map = this.#subscriptions.get(ref);
|
|
128
|
-
if (!map)
|
|
129
|
-
return;
|
|
130
|
-
const routing = map.get(client_id);
|
|
131
|
-
map.delete(client_id);
|
|
132
|
-
if (map.size == 0) {
|
|
133
|
-
const $ = this.#pipes.get(ref);
|
|
134
|
-
$?.s?.unsubscribe();
|
|
135
|
-
this.#subscriptions.delete(ref);
|
|
136
|
-
}
|
|
137
|
-
this.#connections.get(client_id)?.refs?.delete(ref);
|
|
138
|
-
if (routing.listener_node_id != NODE_ID) {
|
|
139
|
-
const gateway = this.#connections.get(routing.listener_node_id);
|
|
140
|
-
if (gateway) {
|
|
141
|
-
const payload = { event: 'unsubscribe', data: { ref, client_id } };
|
|
142
|
-
gateway && gateway.send(JSON.stringify(payload));
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
handleDisconnect(socket) {
|
|
148
|
-
if (socket.gateway) {
|
|
149
|
-
for (const [ref, map] of this.#subscriptions) {
|
|
150
|
-
for (const [client_id, { gateway_id }] of map) {
|
|
151
|
-
if (gateway_id == socket.id) {
|
|
152
|
-
map.delete(client_id);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (map.size == 0) {
|
|
156
|
-
const $ = this.#pipes.get(ref);
|
|
157
|
-
$?.s?.unsubscribe();
|
|
158
|
-
this.#subscriptions.delete(ref);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
const refs = [...socket.refs || []];
|
|
164
|
-
refs.length > 0 && this.unref(socket, { refs });
|
|
165
|
-
}
|
|
166
|
-
this.#connections.delete(socket.id);
|
|
167
|
-
}
|
|
168
|
-
listen(e) {
|
|
169
|
-
for (const { ref, client_id, gateway_id, listener_node_id } of e) {
|
|
170
|
-
if (client_id == gateway_id)
|
|
171
|
-
continue;
|
|
172
|
-
const socket = this.#connections.get(client_id);
|
|
173
|
-
if (gateway_id == NODE_ID && (!socket || socket.refs?.has(ref))) {
|
|
174
|
-
if (listener_node_id != NODE_ID) {
|
|
175
|
-
const target = this.#connections.get(listener_node_id);
|
|
176
|
-
if (target) {
|
|
177
|
-
const e = {
|
|
178
|
-
event: 'unsubscribe',
|
|
179
|
-
data: { client_id, ref }
|
|
180
|
-
};
|
|
181
|
-
target.send(JSON.stringify(e));
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
const map = this.#subscriptions.get(ref) || new Map();
|
|
187
|
-
if (map.has(client_id))
|
|
188
|
-
continue;
|
|
189
|
-
map.set(client_id, { gateway_id, listener_node_id });
|
|
190
|
-
this.#subscriptions.set(ref, map);
|
|
191
|
-
this.#connections.get(client_id)?.refs?.add(ref);
|
|
192
|
-
if (gateway_id != NODE_ID) {
|
|
193
|
-
const target = this.#connections.get(gateway_id);
|
|
194
|
-
if (target) {
|
|
195
|
-
const payload = {
|
|
196
|
-
client_id,
|
|
197
|
-
event: 'subscribe',
|
|
198
|
-
gateway_id,
|
|
199
|
-
ref,
|
|
200
|
-
listener_node_id
|
|
201
|
-
};
|
|
202
|
-
target.send(JSON.stringify(payload));
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Injectable } from '@nestjs/common';
|
|
3
|
+
let LivequeryWebsocketSync = class LivequeryWebsocketSync {
|
|
207
4
|
};
|
|
208
|
-
__decorate([
|
|
209
|
-
SubscribeMessage('start'),
|
|
210
|
-
__param(0, ConnectedSocket()),
|
|
211
|
-
__param(1, MessageBody()),
|
|
212
|
-
__metadata("design:type", Function),
|
|
213
|
-
__metadata("design:paramtypes", [Object, Object]),
|
|
214
|
-
__metadata("design:returntype", void 0)
|
|
215
|
-
], LivequeryWebsocketSync.prototype, "start", null);
|
|
216
|
-
__decorate([
|
|
217
|
-
SubscribeMessage('unsubscribe'),
|
|
218
|
-
__param(0, ConnectedSocket()),
|
|
219
|
-
__param(1, MessageBody()),
|
|
220
|
-
__metadata("design:type", Function),
|
|
221
|
-
__metadata("design:paramtypes", [Object, Object]),
|
|
222
|
-
__metadata("design:returntype", void 0)
|
|
223
|
-
], LivequeryWebsocketSync.prototype, "unref", null);
|
|
224
5
|
LivequeryWebsocketSync = __decorate([
|
|
225
|
-
|
|
226
|
-
__metadata("design:paramtypes", [])
|
|
6
|
+
Injectable()
|
|
227
7
|
], LivequeryWebsocketSync);
|
|
228
8
|
export { LivequeryWebsocketSync };
|
|
229
9
|
//# sourceMappingURL=LivequeryWebsocketSync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LivequeryWebsocketSync.js","sourceRoot":"","sources":["../../src/LivequeryWebsocketSync.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"LivequeryWebsocketSync.js","sourceRoot":"","sources":["../../src/LivequeryWebsocketSync.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAKpC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;CAAG,CAAA;AAAzB,sBAAsB;IADlC,UAAU,EAAE;GACA,sBAAsB,CAAG"}
|
package/build/src/RxjsUdp.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export type
|
|
3
|
-
host: string;
|
|
1
|
+
import { Observable } from "rxjs";
|
|
2
|
+
export type BaseNodeInfo = {
|
|
4
3
|
node_id: string;
|
|
5
4
|
namespace: string;
|
|
5
|
+
host: string;
|
|
6
6
|
};
|
|
7
|
-
export type MdnsMessage<T
|
|
7
|
+
export type MdnsMessage<T> = {
|
|
8
|
+
version: number;
|
|
8
9
|
hi: boolean;
|
|
9
10
|
node: T;
|
|
10
|
-
sender_id: string;
|
|
11
11
|
forwarder_id?: string;
|
|
12
12
|
receiver_id?: string;
|
|
13
|
+
time: number;
|
|
14
|
+
hash: string;
|
|
13
15
|
};
|
|
14
|
-
export declare class RxjsUdp {
|
|
16
|
+
export declare class RxjsUdp<T extends BaseNodeInfo> extends Observable<T> {
|
|
15
17
|
#private;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
host: any;
|
|
20
|
-
}>>;
|
|
18
|
+
private key;
|
|
19
|
+
constructor(metadata: T, key: string);
|
|
20
|
+
broadcast(data: Omit<MdnsMessage<T>, 'hash' | 'time' | 'version'>, ips?: string[]): Promise<void>;
|
|
21
21
|
}
|
package/build/src/RxjsUdp.js
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { createSocket } from "dgram";
|
|
2
2
|
import { networkInterfaces } from "os";
|
|
3
|
+
import { createHmac } from "crypto";
|
|
3
4
|
import { API_GATEWAY_WHITELIST_ADDRESS, API_GATEWAY_MULTICAST_PORT, API_GATEWAY_MULTICAST_ADDRESS } from "./const.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { map, Observable } from "rxjs";
|
|
6
|
+
import { fromEvent } from "rxjs";
|
|
7
|
+
import { mergeMap, filter } from "rxjs/operators";
|
|
7
8
|
import { unpack, pack } from 'msgpackr';
|
|
8
|
-
export class RxjsUdp {
|
|
9
|
+
export class RxjsUdp extends Observable {
|
|
10
|
+
key;
|
|
9
11
|
#udp4 = createSocket({
|
|
10
12
|
type: 'udp4',
|
|
11
13
|
reuseAddr: true
|
|
12
14
|
});
|
|
13
15
|
#localAddress = new Set(Object.values(networkInterfaces()).flat(2).map(e => e?.address).filter(Boolean));
|
|
16
|
+
#computeHmac(data) {
|
|
17
|
+
return createHmac('sha256', this.key).update(pack(data)).digest('hex');
|
|
18
|
+
}
|
|
14
19
|
#broadcastAddress = new Set([
|
|
15
20
|
API_GATEWAY_MULTICAST_ADDRESS,
|
|
16
21
|
...(API_GATEWAY_WHITELIST_ADDRESS || '').split(',').map(e => {
|
|
@@ -24,7 +29,9 @@ export class RxjsUdp {
|
|
|
24
29
|
return [];
|
|
25
30
|
}).flat(2)
|
|
26
31
|
]);
|
|
27
|
-
constructor() {
|
|
32
|
+
constructor(metadata, key) {
|
|
33
|
+
super();
|
|
34
|
+
this.key = key;
|
|
28
35
|
this.#udp4.on('listening', () => {
|
|
29
36
|
this.#udp4.setMulticastInterface("127.0.0.1");
|
|
30
37
|
this.#udp4.addMembership(API_GATEWAY_MULTICAST_ADDRESS, "127.0.0.1");
|
|
@@ -33,33 +40,16 @@ export class RxjsUdp {
|
|
|
33
40
|
throw e;
|
|
34
41
|
});
|
|
35
42
|
this.#udp4.bind(API_GATEWAY_MULTICAST_PORT, '0.0.0.0');
|
|
36
|
-
|
|
37
|
-
async broadcast(data, ips = [...this.#broadcastAddress]) {
|
|
38
|
-
const msg = pack(data);
|
|
39
|
-
for (const ip of ips) {
|
|
40
|
-
this.#udp4.send(msg, 0, msg.length, API_GATEWAY_MULTICAST_PORT, ip, e => {
|
|
41
|
-
e && console.error('UDP Broadcast error', e);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
link(metadata$) {
|
|
46
|
-
return from(firstValueFrom(metadata$)).pipe(debounceTime(1000), mergeMap(async (metadata) => {
|
|
47
|
-
this.broadcast({
|
|
48
|
-
node: metadata,
|
|
49
|
-
hi: true,
|
|
50
|
-
sender_id: metadata.node_id
|
|
51
|
-
});
|
|
52
|
-
return metadata;
|
|
53
|
-
}), switchMap(metadata => fromEvent(this.#udp4, 'message').pipe(map(([raw, r]) => ({ raw, r, metadata })))), mergeMap(async ({ raw, r, metadata }) => {
|
|
43
|
+
fromEvent(this.#udp4, 'message').pipe(map(([raw, r]) => ({ raw, r }))).pipe(mergeMap(async ({ raw, r }) => {
|
|
54
44
|
try {
|
|
55
45
|
const msg = unpack(raw);
|
|
56
|
-
if (msg.
|
|
46
|
+
if (msg.version != 2)
|
|
57
47
|
return;
|
|
58
|
-
if (msg.
|
|
48
|
+
if (msg.time <= Date.now() - 500)
|
|
59
49
|
return;
|
|
60
|
-
if (msg.
|
|
50
|
+
if (msg.node.node_id == metadata.node_id)
|
|
61
51
|
return;
|
|
62
|
-
if (msg.
|
|
52
|
+
if (msg.forwarder_id == metadata.node_id)
|
|
63
53
|
return;
|
|
64
54
|
const node = { ...msg.node, host: msg.node.host || r.address };
|
|
65
55
|
const is_remote = !this.#localAddress.has(r.address);
|
|
@@ -68,21 +58,36 @@ export class RxjsUdp {
|
|
|
68
58
|
node,
|
|
69
59
|
forwarder_id: metadata.node_id
|
|
70
60
|
}, [API_GATEWAY_MULTICAST_ADDRESS]);
|
|
61
|
+
if (msg.node.namespace != metadata.namespace)
|
|
62
|
+
return;
|
|
63
|
+
if (msg.hash !== this.#computeHmac(msg))
|
|
64
|
+
return;
|
|
71
65
|
if (msg.receiver_id && msg.receiver_id != metadata.node_id)
|
|
72
66
|
return;
|
|
73
67
|
if (msg.hi) {
|
|
74
|
-
const node = await firstValueFrom(metadata$);
|
|
75
68
|
await this.broadcast({
|
|
76
|
-
node,
|
|
69
|
+
node: metadata,
|
|
77
70
|
hi: false,
|
|
78
|
-
|
|
79
|
-
receiver_id: msg.sender_id
|
|
71
|
+
receiver_id: msg.node.node_id
|
|
80
72
|
}, [is_remote ? r.address : API_GATEWAY_MULTICAST_ADDRESS]);
|
|
81
73
|
}
|
|
82
74
|
return node;
|
|
83
75
|
}
|
|
84
76
|
catch (e) { }
|
|
85
|
-
}), filter(Boolean));
|
|
77
|
+
}), filter(Boolean)).subscribe();
|
|
78
|
+
}
|
|
79
|
+
async broadcast(data, ips = [...this.#broadcastAddress]) {
|
|
80
|
+
const metadata = { ...data, time: Date.now(), version: 2 };
|
|
81
|
+
const signed = {
|
|
82
|
+
...metadata,
|
|
83
|
+
hash: this.#computeHmac(metadata)
|
|
84
|
+
};
|
|
85
|
+
const msg = pack(signed);
|
|
86
|
+
for (const ip of ips) {
|
|
87
|
+
this.#udp4.send(msg, 0, msg.length, API_GATEWAY_MULTICAST_PORT, ip, e => {
|
|
88
|
+
e && console.error('UDP Broadcast error', e);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
86
91
|
}
|
|
87
92
|
}
|
|
88
93
|
//# sourceMappingURL=RxjsUdp.js.map
|
package/build/src/RxjsUdp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RxjsUdp.js","sourceRoot":"","sources":["../../src/RxjsUdp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AACtH,OAAO,
|
|
1
|
+
{"version":3,"file":"RxjsUdp.js","sourceRoot":"","sources":["../../src/RxjsUdp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Injectable } from '@nestjs/common';
|
|
3
|
+
import { ApiGatewayHandler } from '@livequery/core';
|
|
4
|
+
let SimpleApiGateway = class SimpleApiGateway extends ApiGatewayHandler {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
super(options);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
SimpleApiGateway = __decorate([
|
|
10
|
+
Injectable(),
|
|
11
|
+
__metadata("design:paramtypes", [Object])
|
|
12
|
+
], SimpleApiGateway);
|
|
13
|
+
export { SimpleApiGateway };
|
|
14
|
+
//# sourceMappingURL=SimpleApiGateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleApiGateway.js","sourceRoot":"","sources":["../../src/SimpleApiGateway.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAA0B,MAAM,iBAAiB,CAAA;AAGpE,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,iBAAiB;IACnD,YAAY,UAA6B,EAAE;QACvC,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;CACJ,CAAA;AAJY,gBAAgB;IAD5B,UAAU,EAAE;;GACA,gBAAgB,CAI5B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
export type UdpDiscoveryNode = {
|
|
3
|
+
node_id: string;
|
|
4
|
+
namespace: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
};
|
|
7
|
+
export type UdpDiscoveryOptions = {
|
|
8
|
+
key: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
localRelayPort?: number;
|
|
11
|
+
multicastAddress?: string;
|
|
12
|
+
peers?: string[];
|
|
13
|
+
announceIntervalMs?: number;
|
|
14
|
+
packetTtlMs?: number;
|
|
15
|
+
seenTtlMs?: number;
|
|
16
|
+
};
|
|
17
|
+
export type UdpDiscoveryPacket<T extends UdpDiscoveryNode> = {
|
|
18
|
+
version: 1;
|
|
19
|
+
id: string;
|
|
20
|
+
sender_id: string;
|
|
21
|
+
timestamp: number;
|
|
22
|
+
node: T;
|
|
23
|
+
signature: string;
|
|
24
|
+
};
|
|
25
|
+
export declare class UdpDiscovery<T extends UdpDiscoveryNode> {
|
|
26
|
+
#private;
|
|
27
|
+
private readonly node;
|
|
28
|
+
readonly nodes$: Observable<T>;
|
|
29
|
+
readonly errors$: Observable<unknown>;
|
|
30
|
+
constructor(node: T, options: UdpDiscoveryOptions);
|
|
31
|
+
announce(): Promise<void>;
|
|
32
|
+
broadcastTo(ip: string): Promise<void>;
|
|
33
|
+
broadcast(ips?: string[]): Promise<void>;
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|