@spider-mesh/core 1.0.20 → 1.0.22

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 (38) hide show
  1. package/build/index.d.ts +0 -1
  2. package/build/index.js +0 -1
  3. package/build/index.js.map +1 -1
  4. package/build/src/BuiltinTransporter.d.ts +10 -12
  5. package/build/src/BuiltinTransporter.js +106 -259
  6. package/build/src/BuiltinTransporter.js.map +1 -1
  7. package/build/src/RemoteService.d.ts +11 -6
  8. package/build/src/RxjsTcpServer.d.ts +9 -0
  9. package/build/src/RxjsTcpServer.js +31 -0
  10. package/build/src/RxjsTcpServer.js.map +1 -0
  11. package/build/src/RxjsTcpSocket.d.ts +14 -0
  12. package/build/src/RxjsTcpSocket.js +83 -0
  13. package/build/src/RxjsTcpSocket.js.map +1 -0
  14. package/build/src/RxjsUdpBroadcaster.d.ts +20 -0
  15. package/build/src/RxjsUdpBroadcaster.js +60 -0
  16. package/build/src/RxjsUdpBroadcaster.js.map +1 -0
  17. package/build/src/SpiderMesh.d.ts +31 -16
  18. package/build/src/SpiderMesh.js +225 -167
  19. package/build/src/SpiderMesh.js.map +1 -1
  20. package/build/src/SpiderMeshNode.d.ts +4 -5
  21. package/build/src/SpiderMeshTransporter.d.ts +19 -8
  22. package/build/src/decorators/Microservice.d.ts +5 -2
  23. package/build/src/decorators/Microservice.js +11 -12
  24. package/build/src/decorators/Microservice.js.map +1 -1
  25. package/build/src/decorators/SubscribeEvent.d.ts +6 -0
  26. package/build/src/decorators/SubscribeEvent.js +14 -0
  27. package/build/src/decorators/SubscribeEvent.js.map +1 -0
  28. package/build/src/helpers/sleep.d.ts +1 -0
  29. package/build/src/helpers/sleep.js +2 -0
  30. package/build/src/helpers/sleep.js.map +1 -0
  31. package/build/src/helpers/waitFirstEvent.d.ts +3 -0
  32. package/build/src/helpers/waitFirstEvent.js +5 -0
  33. package/build/src/helpers/waitFirstEvent.js.map +1 -0
  34. package/package.json +3 -2
  35. package/yarn.lock +197 -0
  36. package/build/src/decorators/createMicroserviceEvent.d.ts +0 -16
  37. package/build/src/decorators/createMicroserviceEvent.js +0 -54
  38. package/build/src/decorators/createMicroserviceEvent.js.map +0 -1
package/build/index.d.ts CHANGED
@@ -5,5 +5,4 @@ export { SpiderMeshTransporter, SpiderMeshTransporterFactory } from './src/Spide
5
5
  export { RemoteService } from './src/RemoteService';
6
6
  export { RPCOptions, RPCOptionsList } from './src/RPCOptions';
7
7
  export { OnMicroserviceReady } from './src/decorators/OnMicroserviceReady';
8
- export { createMicroserviceEvent } from './src/decorators/createMicroserviceEvent';
9
8
  export { Microservice } from './src/decorators/Microservice';
package/build/index.js CHANGED
@@ -2,6 +2,5 @@ export { BuiltinTransporter } from './src/BuiltinTransporter';
2
2
  export { SpiderMesh } from './src/SpiderMesh';
3
3
  export { RPCOptionsList } from './src/RPCOptions';
4
4
  export { OnMicroserviceReady } from './src/decorators/OnMicroserviceReady';
5
- export { createMicroserviceEvent } from './src/decorators/createMicroserviceEvent';
6
5
  export { Microservice } from './src/decorators/Microservice';
7
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAI7C,OAAO,EAAc,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAI7C,OAAO,EAAc,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA"}
@@ -1,17 +1,15 @@
1
- import { SpiderMeshTransporter } from "./SpiderMeshTransporter";
1
+ import { PublishMetadata, SpiderMeshTransporter, SpiderMeshTransporterEvent } from "./SpiderMeshTransporter";
2
+ import { Observable, Subject } from 'rxjs';
2
3
  export declare class BuiltinTransporter implements SpiderMeshTransporter {
3
4
  #private;
4
5
  readonly node_id: string;
5
6
  readonly namespace: string;
6
- constructor(node_id: string, namespace: string);
7
- on_node_offline(cb: (node_id: string) => any): {
8
- unsubscribe: () => boolean;
9
- };
10
- on_node_online(cb: (node_id: string) => any): {
11
- unsubscribe: () => boolean;
12
- };
13
- listen<T = any>(topic: string, cb: (node_id: string, data: T) => any): {
14
- unsubscribe: () => void;
15
- };
16
- publish<T = any>(event: string, node_id: string | null, data: T, queue?: boolean): Promise<void>;
7
+ readonly $nodes_status: Subject<{
8
+ node_id: string;
9
+ online: boolean;
10
+ }>;
11
+ constructor(node_id: string, namespace?: string);
12
+ start(): Promise<void>;
13
+ listen<T = any>(topic: string): Observable<SpiderMeshTransporterEvent<T>>;
14
+ publish<T = any>({ data, event, node_id }: PublishMetadata<T>): Promise<void>;
17
15
  }
@@ -1,301 +1,148 @@
1
1
  import { randomUUID } from "crypto";
2
- import dgram from 'dgram';
3
- import { createConnection, createServer } from "net";
4
- import { networkInterfaces } from 'os';
5
- import { EventEmitter } from "events";
6
- import { PassThrough } from "stream";
2
+ import { Observable, Subject, debounceTime, filter, first, map, merge, mergeAll, mergeMap, takeUntil } from 'rxjs';
3
+ import { RxjsTcpSocket } from "./RxjsTcpSocket";
4
+ import { RxjsTcpServer } from "./RxjsTcpServer";
5
+ import { RxjsUdpBroadcaster } from "./RxjsUdpBroadcaster";
7
6
  const UDP_PORT = Number(process.env.UDP_PORT || 10000);
8
- const SEEDING_IP = process.env.SEEDING_IP;
9
- class StableTCP extends EventEmitter {
10
- #input = new PassThrough();
11
- static #separator = String.fromCharCode(0x1E);
12
- constructor() {
13
- super();
14
- }
15
- async #connect(socket) {
16
- let buffer = '';
17
- this.#input.removeAllListeners('data');
18
- this.#input.on('data', data => socket.write(data));
19
- socket.on('data', msg => {
20
- buffer += msg.toString('utf8');
21
- if (buffer.endsWith(StableTCP.#separator)) {
22
- for (const part of buffer.split(StableTCP.#separator)) {
23
- if (part != '') {
24
- try {
25
- const json = JSON.parse(part);
26
- buffer = '';
27
- this.emit('data', json);
28
- }
29
- catch (e) {
30
- console.log({
31
- can_not_decode: part
32
- });
33
- }
34
- }
35
- }
36
- buffer = '';
37
- }
38
- });
39
- }
40
- static async init(options) {
41
- const $this = new this();
42
- await new Promise(async (s) => {
43
- for (let i = 0; i <= 5; i++) {
44
- const socket = await new Promise(s => {
45
- const socket = createConnection(options);
46
- socket.on('ready', () => s(socket));
47
- socket.on('connect', () => s(socket));
48
- socket.on('timeout', () => s(null));
49
- socket.on('error', (e) => s(null));
50
- });
51
- if (!socket)
52
- return s(false);
53
- await $this.#connect(socket);
54
- i = 0;
55
- s(true);
56
- // await socket error here
57
- const code = await new Promise(s => {
58
- socket.on('close', () => s('close'));
59
- socket.on('error', () => s('error'));
60
- socket.on('end', () => s('close'));
61
- });
62
- if (code == 'close') {
63
- $this.emit('close');
64
- return;
65
- }
66
- process.env.SPIDERMESH_DEBUG && console.log(`[${new Date().toLocaleTimeString()}] Socket error, retrying in 1 sec`);
67
- await new Promise(s => setTimeout(s, 1000));
68
- }
69
- s(false);
70
- });
71
- return $this;
72
- }
73
- static async join(socket) {
74
- const $this = new this();
75
- socket.on('error', () => $this.emit('error'));
76
- socket.on('close', () => $this.emit('close'));
77
- await $this.#connect(socket);
78
- return $this;
79
- }
80
- async write(data) {
81
- const msg = JSON.stringify(data) + StableTCP.#separator;
82
- const buffer = Buffer.from(msg);
83
- this.#input.write(buffer);
84
- }
85
- }
7
+ const SEEDING_IP_RANGES = process.env.SEEDING_IP_RANGE;
8
+ const SEEDING_IPS = process.env.SEEDING_IP;
86
9
  export class BuiltinTransporter {
87
10
  node_id;
88
11
  namespace;
89
- #node_offline_callbacks = new Map;
90
- #node_online_callbacks = new Map;
91
- #listeners = new Map;
12
+ $nodes_status = new Subject();
92
13
  #version = Date.now();
14
+ #listeners = new Map;
93
15
  #nodes_map = new Map;
94
16
  #events_map = new Map();
95
- #initing;
96
- constructor(node_id, namespace) {
17
+ #$rebroadcast = new Subject();
18
+ constructor(node_id, namespace = 'default') {
97
19
  this.node_id = node_id;
98
20
  this.namespace = namespace;
99
- process.env.SPIDERMESH_DEBUG && console.log(`[${new Date().toLocaleTimeString()}] Online ${node_id}:${UDP_PORT}`);
100
- setTimeout(async () => {
101
- while (true) {
102
- this.#initing = this.#init();
103
- const task = await this.#initing;
104
- await task.next();
105
- await task.wait_error();
106
- await task.flush();
107
- }
108
- });
109
21
  }
110
- async #init() {
111
- // Create UDP
112
- const udp = dgram.createSocket({ type: 'udp4', reuseAddr: true });
113
- udp.bind({
114
- address: '0.0.0.0',
115
- port: UDP_PORT,
116
- }, () => udp.setBroadcast(true));
117
- udp.on('message', async (raw, rinfo) => {
118
- try {
119
- const json = JSON.parse(raw.toString('utf-8'));
120
- this.#on_message(rinfo.address, json);
121
- }
122
- catch (e) {
123
- }
124
- });
125
- // Find free port
126
- const { tcp_port, server } = await new Promise(async (s) => {
127
- for (let tcp_port = 10001; true; tcp_port++) {
128
- const server = createServer();
129
- server.listen(tcp_port);
130
- const success = await new Promise(s => {
131
- server.on('listening', () => s(true));
132
- server.on('error', () => s(false));
133
- });
134
- if (success)
135
- return s({ tcp_port, server });
136
- }
137
- });
138
- server.on('connection', async (socket) => {
139
- const remote_host = socket.remoteAddress?.split(':')?.pop();
140
- if (remote_host) {
141
- const stable_tcp = await StableTCP.join(socket);
142
- stable_tcp.on('data', data => this.#on_message(remote_host, data, stable_tcp));
143
- }
22
+ async start() {
23
+ const $tcp_server = await RxjsTcpServer.start();
24
+ const udp_broadcaster = await RxjsUdpBroadcaster.start({
25
+ namespace: this.namespace,
26
+ node_id: this.node_id,
27
+ SEEDING_IP_RANGES,
28
+ SEEDING_IPS,
29
+ UDP_PORT
144
30
  });
145
- return {
146
- udp,
147
- tcp_port,
148
- next: async () => {
149
- const broadcast_ips = ['255.255.255.255'];
150
- // Add multicast IP or scan all subnets
151
- const current_ips = Object.values(networkInterfaces()).map(c => c?.map(f => f.address) || []).flat(2);
152
- const current_ip = current_ips.find(ip => ip.startsWith('192.168'));
153
- const subnet = current_ip?.split('.').slice(0, 3).join('.');
154
- if (subnet) {
155
- for (let i = 1; i <= 255; i++) {
156
- const host = `${subnet}.${i}`;
157
- !current_ips.includes(host) && broadcast_ips.push(host);
31
+ $tcp_server.subscribe(({ port, $connection, $error }) => {
32
+ merge($connection, udp_broadcaster.$new_node_discovered.pipe(mergeMap(node => RxjsTcpSocket.connect({
33
+ ...node,
34
+ keepAlive: true
35
+ })), filter(Boolean), map(socket => Object.assign(socket, { udp: true })))).pipe(takeUntil($error), map(socket => {
36
+ socket.$incoming_data
37
+ .pipe(filter(msg => !!msg), filter(msg => msg.sender_node_id != this.node_id), filter(msg => msg.namespace == this.namespace))
38
+ .subscribe(async (msg) => {
39
+ if (msg.topic == `#hello`) {
40
+ const status = await this.#add_node(socket, msg.data);
41
+ status && !status.peer_updated && this.#tcp_hello(status.socket, port);
42
+ return;
158
43
  }
159
- }
160
- // Hello via UDP
161
- broadcast_ips.forEach(host => {
162
- this.#hello(undefined, { host, socket: udp });
44
+ this.#listeners.get(msg.topic)?.forEach(cb => cb(msg.sender_node_id, msg.data));
163
45
  });
164
- // Scan remote node ( <= internet)
165
- if (SEEDING_IP) {
166
- const ips = SEEDING_IP.split(',').map(c => c.trim().split(':'));
167
- await Promise.all(ips.map(async ([host, port]) => {
168
- const stable_tcp = await StableTCP.init({ host, port: Number(port), keepAlive: true, timeout: 5000 });
169
- if (stable_tcp) {
170
- stable_tcp.on('data', data => this.#on_message(host, data, stable_tcp));
171
- this.#hello(stable_tcp);
172
- }
173
- }));
174
- }
175
- },
176
- wait_error: () => new Promise(async (s) => {
177
- await new Promise(s => {
178
- udp.on('close', s);
179
- udp.on('error', s);
180
- server.on('error', s);
181
- server.on('drop', s);
182
- server.on('close', s);
46
+ 'udp' in socket && this.#tcp_hello(socket, port);
47
+ })).subscribe();
48
+ udp_broadcaster.broadcast(port);
49
+ this.#$rebroadcast.pipe(debounceTime(1000), takeUntil($error), map(() => [...this.#nodes_map.values()]), mergeAll(), mergeMap(node => this.#tcp_hello(node.socket, port))).subscribe();
50
+ });
51
+ }
52
+ async #add_node(node_socket, new_node) {
53
+ const host = node_socket.rawSocket.remoteAddress;
54
+ if (!host)
55
+ return;
56
+ // process.env.SPIDERMESH_DEBUG && console.log(`[${new Date().toLocaleTimeString()}] [TCP] Node online [${host}]`, new_node)
57
+ const new_node_id = new_node.node_id;
58
+ if (!this.#nodes_map.has(new_node_id)) {
59
+ const socket = node_socket.opened_by_remote_side ? (await RxjsTcpSocket.connect({
60
+ host,
61
+ port: new_node.port,
62
+ keepAlive: true
63
+ }) || node_socket) : node_socket;
64
+ // When ofline
65
+ socket.$status.pipe(filter(status => status == 'closed' || status == 'error'), first()).subscribe(() => {
66
+ // process.env.SPIDERMESH_DEBUG && console.log(`[${new Date().toLocaleTimeString()}] [TCP] Node offline ${new_node_id}`)
67
+ const node = this.#nodes_map.get(new_node_id);
68
+ node && node.listening.map(evt => {
69
+ this.#events_map.get(evt)?.delete(node.node_id);
183
70
  });
184
- }),
185
- flush: () => {
186
- udp.close();
187
- server.close();
188
- }
71
+ this.#nodes_map.delete(new_node_id);
72
+ this.$nodes_status.next({ node_id: new_node_id, online: false });
73
+ });
74
+ // Add to map
75
+ this.#nodes_map.set(new_node_id, { ...new_node, host, socket });
76
+ }
77
+ const remote_info = new_node.peers.find(p => p.node_id == this.node_id);
78
+ const peer_updated = remote_info && remote_info.version == this.#version;
79
+ for (const event of new_node.listening) {
80
+ !this.#events_map.has(event) && this.#events_map.set(event, new Set());
81
+ this.#events_map.get(event)?.add(new_node_id);
82
+ }
83
+ peer_updated && this.$nodes_status.next({ node_id: new_node_id, online: true });
84
+ return {
85
+ peer_updated,
86
+ socket: this.#nodes_map.get(new_node_id).socket
189
87
  };
190
88
  }
191
- async #hello(socket, udp_socket) {
192
- const { tcp_port } = await this.#initing;
89
+ async #tcp_hello(tcp_socket, self_tcp_port) {
193
90
  const msg = {
194
91
  data: {
195
92
  node_id: this.node_id,
196
- port: tcp_port,
197
- listening_events: ['#hello', ...this.#listeners.keys()],
198
- peers: [...this.#nodes_map.values()].map(({ host, listening_events, node_id, port }) => ({ listening_events, node_id, port, host })),
93
+ port: self_tcp_port,
94
+ listening: ['#hello', ...this.#listeners.keys()],
95
+ peers: [...this.#nodes_map.values()].map(({ socket, ...node }) => node),
199
96
  version: this.#version
200
97
  },
201
98
  namespace: this.namespace,
202
99
  sender_node_id: this.node_id,
203
100
  topic: '#hello'
204
101
  };
205
- if (socket) {
206
- socket?.write(msg);
207
- }
208
- if (udp_socket) {
209
- const buffer = Buffer.from(JSON.stringify(msg), 'utf8');
210
- udp_socket?.socket.send(buffer, UDP_PORT, udp_socket.host);
211
- }
102
+ tcp_socket.write(msg);
212
103
  }
213
- async #on_message(remote_address, msg, old_socket) {
214
- if (!remote_address)
215
- return;
216
- if (!msg)
217
- return;
218
- if (msg.sender_node_id == this.node_id)
219
- return;
220
- // New node
221
- if (msg.topic == `#hello` && msg.namespace == this.namespace) {
222
- return this.#add_node(remote_address, msg.data, old_socket);
223
- }
224
- this.#listeners.get(msg.topic)?.forEach(cb => cb(msg.sender_node_id, msg.data));
225
- }
226
- async #add_node(host, new_node, tcp_socket) {
227
- process.env.SPIDERMESH_DEBUG && console.log(`[${new Date().toLocaleTimeString()}] [TCP] Node online [${host}]`, new_node);
228
- const remote_info = new_node.peers.find(p => p.node_id == this.node_id);
229
- const peer_updated = remote_info && remote_info.version == this.#version;
230
- if (!this.#nodes_map.get(new_node.node_id)?.socket) {
231
- const socket = await StableTCP.init({ host, port: new_node.port, keepAlive: true, timeout: 5000 }) || tcp_socket;
232
- if (!socket)
233
- return;
234
- const on_offline = (e) => {
235
- process.env.SPIDERMESH_DEBUG && console.log(`[${new Date().toLocaleTimeString()}] [TCP] Node offline ${new_node.node_id}`);
236
- this.#node_offline_callbacks?.forEach(cb => cb(new_node.node_id));
237
- const node = this.#nodes_map.get(new_node.node_id);
238
- node && node.listening_events.map(evt => {
239
- this.#events_map.get(evt)?.delete(node.node_id);
240
- });
241
- this.#nodes_map.delete(new_node.node_id);
242
- };
243
- socket.on('error', on_offline);
244
- socket.on('close', on_offline);
245
- this.#nodes_map.set(new_node.node_id, { ...new_node, host, socket });
246
- !peer_updated && await this.#hello(socket);
247
- }
248
- for (const event of new_node.listening_events) {
249
- !this.#events_map.has(event) && this.#events_map.set(event, new Set());
250
- this.#events_map.get(event)?.add(new_node.node_id);
251
- }
252
- remote_info && this.#node_online_callbacks.forEach(fn => fn(new_node.node_id));
253
- }
254
- on_node_offline(cb) {
255
- const id = randomUUID();
256
- this.#node_offline_callbacks.set(id, cb);
257
- return { unsubscribe: () => this.#node_offline_callbacks.delete(id) };
258
- }
259
- on_node_online(cb) {
260
- const id = randomUUID();
261
- this.#node_online_callbacks.set(id, cb);
262
- return { unsubscribe: () => this.#node_online_callbacks.delete(id) };
263
- }
264
- #broadcast_listen;
265
- listen(topic, cb) {
266
- this.#version = Date.now();
267
- this.#broadcast_listen && clearTimeout(this.#broadcast_listen);
268
- this.#broadcast_listen = setTimeout(() => {
269
- // Notify about update
270
- this.#nodes_map.forEach(node => this.#hello(node.socket));
271
- }, 1000);
272
- !this.#listeners.has(topic) && this.#listeners.set(topic, new Map());
273
- const id = randomUUID();
274
- this.#listeners.get(topic)?.set(id, cb);
275
- return {
276
- unsubscribe: () => {
104
+ listen(topic) {
105
+ return new Observable(o => {
106
+ this.#version = Date.now();
107
+ !this.#listeners.has(topic) && this.#listeners.set(topic, new Map());
108
+ const id = randomUUID();
109
+ this.#listeners.get(topic)?.set(id, (sender_node_id, data) => o.next({
110
+ sender_node_id,
111
+ data
112
+ }));
113
+ this.#$rebroadcast.next();
114
+ return () => {
277
115
  this.#version = Date.now();
278
116
  this.#listeners.get(topic)?.delete(id);
279
117
  this.#listeners.get(topic)?.size == 0 && this.#listeners.delete(topic);
280
- }
281
- };
118
+ };
119
+ });
282
120
  }
283
- async publish(event, node_id, data, queue) {
121
+ async publish({ data, event, node_id }) {
284
122
  const msg = {
285
123
  data,
286
124
  namespace: this.namespace,
287
125
  sender_node_id: this.node_id,
288
126
  topic: event || node_id || '#'
289
127
  };
290
- if (node_id) {
291
- const node = this.#nodes_map.get(node_id);
292
- node?.socket?.write(msg);
128
+ if (node_id == 'all' || !node_id) {
129
+ for (const node_id of this.#events_map.get(event) || []) {
130
+ const node = this.#nodes_map.get(node_id);
131
+ await node?.peers.find(p => p.node_id == this.node_id) && node?.socket?.write(msg);
132
+ }
293
133
  return;
294
134
  }
295
- for (const node_id of this.#events_map.get(event) || []) {
296
- const node = this.#nodes_map.get(node_id);
297
- node?.socket?.write(msg);
298
- }
135
+ // if (node_id == 'rr') {
136
+ // const key = `${event}.${routing_key || 'default'}`
137
+ // const nodes = [... this.#events_map.get(event) || []]
138
+ // const current_index = (this.#round_robin_indexes.get(key) || 0) % nodes.length
139
+ // this.#round_robin_indexes.set(key, current_index + 1)
140
+ // const node_id = nodes[current_index]
141
+ // await this.#nodes_map.get(node_id)?.socket?.write(msg)
142
+ // return
143
+ // }
144
+ // p2p
145
+ node_id && await this.#nodes_map.get(node_id)?.socket?.write(msg);
299
146
  }
300
147
  }
301
148
  //# sourceMappingURL=BuiltinTransporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BuiltinTransporter.js","sourceRoot":"","sources":["../../src/BuiltinTransporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuiltinTransporter.js","sourceRoot":"","sources":["../../src/BuiltinTransporter.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,19 @@
1
+ import { Observable } from "rxjs";
1
2
  import { RPCOptions } from "./RPCOptions";
2
3
  import { SpiderMeshNode } from "./SpiderMeshNode";
3
- import { ServiceNodeMonitor } from "./SpiderMesh";
4
- export type RemoteService<T = {}> = ({
4
+ export type RemoteService<T = {
5
+ [key: string]: any;
6
+ }> = ({
5
7
  [K in keyof T as (T[K] extends (...args: any) => any ? K : '')]: T[K] extends (...args: any) => any ? ((...args: Parameters<T[K]>) => Promise<Awaited<ReturnType<T[K]>>>) : null;
6
8
  } & {
7
9
  [key in keyof RPCOptions as `$set_${key}`]: (value: RPCOptions[key]) => RemoteService<T>;
8
10
  } & {
9
11
  $list_nodes: () => SpiderMeshNode[];
10
- $monitor: (cb: ServiceNodeMonitor) => {
11
- unsubscribe: Function;
12
- };
13
- $wait: <T>(cb: (nodes: SpiderMeshNode[], index: number) => T | Promise<T>, delay?: number) => Promise<T>;
12
+ } & {
13
+ [key in keyof T as (key extends string ? `$batch_${key}` : string)]: T[key] extends ((...args: any) => any) ? ((...args: Parameters<T[key]>) => Observable<{
14
+ node: SpiderMeshNode;
15
+ data: Awaited<ReturnType<T[key]>>;
16
+ }>) : T[key];
17
+ } & {
18
+ $wait_service_online: () => Promise<void>;
14
19
  });
@@ -0,0 +1,9 @@
1
+ import { Subject } from "rxjs";
2
+ import { RxjsTcpSocket } from "./RxjsTcpSocket";
3
+ export declare class RxjsTcpServer {
4
+ static start<T = object>(start_port?: number): Subject<{
5
+ port: number;
6
+ $connection: Subject<RxjsTcpSocket<T>>;
7
+ $error: Promise<Error>;
8
+ }>;
9
+ }
@@ -0,0 +1,31 @@
1
+ import { createServer } from "net";
2
+ import { Subject } from "rxjs";
3
+ import { RxjsTcpSocket } from "./RxjsTcpSocket";
4
+ export class RxjsTcpServer {
5
+ static start(start_port = 10001) {
6
+ const $online = new Subject();
7
+ setTimeout(async () => {
8
+ for (let port = start_port; true; port++) {
9
+ const $connection = new Subject();
10
+ const server = createServer();
11
+ const success = await new Promise(s => {
12
+ server.once('listening', () => s(true));
13
+ server.once('error', () => s(false));
14
+ server.listen(port);
15
+ });
16
+ if (!success)
17
+ continue;
18
+ server.on('connection', async (socket) => {
19
+ const stable_socket = await RxjsTcpSocket.join(socket);
20
+ $connection.next(stable_socket);
21
+ });
22
+ const $error = new Promise(s => server.once('error', s));
23
+ $online.next({ port, $connection, $error });
24
+ await $error;
25
+ server.removeAllListeners();
26
+ }
27
+ });
28
+ return $online;
29
+ }
30
+ }
31
+ //# sourceMappingURL=RxjsTcpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxjsTcpServer.js","sourceRoot":"","sources":["../../src/RxjsTcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,KAAK,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,MAAM,OAAO,aAAa;IAGtB,MAAM,CAAC,KAAK,CAAa,aAAqB,KAAK;QAC/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAIvB,CAAA;QAGJ,UAAU,CAAC,KAAK,IAAI,EAAE;YAClB,KAAK,IAAI,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;gBACtC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAoB,CAAA;gBACnD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;gBAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,CAAC,EAAE;oBAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;oBACvC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;oBACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACvB,CAAC,CAAC,CAAA;gBACF,IAAI,CAAC,OAAO;oBAAE,SAAQ;gBACtB,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;oBACnC,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,IAAI,CAAI,MAAM,CAAC,CAAA;oBACzD,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;gBACnC,CAAC,CAAC,CAAA;gBACF,MAAM,MAAM,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC3C,MAAM,MAAM,CAAA;gBACZ,MAAM,CAAC,kBAAkB,EAAE,CAAA;aAC9B;QACL,CAAC,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAClB,CAAC;CAEJ"}
@@ -0,0 +1,14 @@
1
+ /// <reference types="node" />
2
+ import { TcpNetConnectOpts, Socket } from "net";
3
+ import { BehaviorSubject, Subject } from "rxjs";
4
+ export declare class RxjsTcpSocket<T = any> {
5
+ #private;
6
+ readonly opened_by_remote_side: boolean;
7
+ $incoming_data: Subject<T>;
8
+ $status: BehaviorSubject<"connecting" | "ready" | "closed" | "error">;
9
+ rawSocket: Socket;
10
+ constructor(opened_by_remote_side: boolean);
11
+ static connect<T = any>(options: TcpNetConnectOpts): Promise<RxjsTcpSocket<T> | null>;
12
+ static join<T = any>(socket: Socket): Promise<RxjsTcpSocket<T>>;
13
+ write(data: T): Promise<void>;
14
+ }