@cadenza.io/service 2.3.0 → 2.3.2

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/dist/index.js CHANGED
@@ -318,8 +318,29 @@ var ServiceRegistry = class _ServiceRegistry {
318
318
  "Handle Instance Update",
319
319
  (ctx, emit) => {
320
320
  const { serviceInstance } = ctx;
321
- const { uuid: uuid4, serviceName, address, port, exposed, isFrontend } = serviceInstance;
321
+ const {
322
+ uuid: uuid4,
323
+ serviceName,
324
+ address,
325
+ port,
326
+ exposed,
327
+ isFrontend,
328
+ deleted
329
+ } = serviceInstance;
322
330
  if (uuid4 === this.serviceInstanceId) return;
331
+ if (deleted) {
332
+ this.instances.get(serviceName)?.splice(
333
+ this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid4) ?? -1,
334
+ 1
335
+ );
336
+ if (this.instances.get(serviceName)?.length === 0) {
337
+ this.instances.delete(serviceName);
338
+ } else if (this.instances.get(serviceName)?.filter((i) => i.address === address && i.port === port).length === 0) {
339
+ emit(`meta.socket_shutdown_requested:${address}_${port}`, {});
340
+ emit(`meta.fetch.destroy_requested:${address}_${port}`, {});
341
+ }
342
+ return;
343
+ }
323
344
  if (!this.instances.has(serviceName))
324
345
  this.instances.set(serviceName, []);
325
346
  const instances = this.instances.get(serviceName);
@@ -370,7 +391,11 @@ var ServiceRegistry = class _ServiceRegistry {
370
391
  "meta.service_instance.inserted",
371
392
  "meta.service_instance.updated",
372
393
  "meta.socket_client.status_received"
373
- ).attachSignal("meta.service_registry.dependee_registered");
394
+ ).attachSignal(
395
+ "meta.service_registry.dependee_registered",
396
+ "meta.socket_shutdown_requested",
397
+ "meta.fetch.destroy_requested"
398
+ );
374
399
  CadenzaService.createMetaTask("Split service instances", function* (ctx) {
375
400
  if (!ctx.serviceInstances) {
376
401
  return;
@@ -458,7 +483,7 @@ var ServiceRegistry = class _ServiceRegistry {
458
483
  this.handleServiceHandshakeTask = CadenzaService.createMetaTask(
459
484
  "Handle service handshake",
460
485
  (ctx, emit) => {
461
- const { serviceName, serviceInstanceId } = ctx;
486
+ const { serviceName, serviceInstanceId, serviceAddress, servicePort } = ctx;
462
487
  const serviceInstances = this.instances.get(serviceName);
463
488
  const instance = serviceInstances?.find(
464
489
  (i) => i.uuid === serviceInstanceId
@@ -477,10 +502,29 @@ var ServiceRegistry = class _ServiceRegistry {
477
502
  uuid: instance.uuid
478
503
  }
479
504
  });
505
+ const instancesToDelete = serviceInstances?.filter(
506
+ (i) => i.uuid !== serviceInstanceId && i.address === serviceAddress && i.port === servicePort
507
+ );
508
+ for (const i of instancesToDelete ?? []) {
509
+ this.instances.get(serviceName)?.splice(this.instances.get(serviceName)?.indexOf(i) ?? -1, 1);
510
+ emit("global.meta.service_registry.deleted", {
511
+ data: {
512
+ isActive: false,
513
+ isNonResponsive: false,
514
+ deleted: true
515
+ },
516
+ filter: {
517
+ uuid: i.uuid
518
+ }
519
+ });
520
+ }
480
521
  return true;
481
522
  },
482
523
  "Handles service handshake"
483
- ).doOn("meta.fetch.handshake_complete").attachSignal("global.meta.service_registry.service_handshake");
524
+ ).doOn("meta.fetch.handshake_complete").attachSignal(
525
+ "global.meta.service_registry.service_handshake",
526
+ "global.meta.service_registry.deleted"
527
+ );
484
528
  this.handleSocketStatusUpdateTask = CadenzaService.createMetaTask(
485
529
  "Handle Socket Status Update",
486
530
  (ctx) => {
@@ -1560,7 +1604,7 @@ var RestController = class _RestController {
1560
1604
  transmitTask.destroy();
1561
1605
  statusTask.destroy();
1562
1606
  }).doOn(
1563
- "meta.fetch.destroy_requested",
1607
+ `meta.fetch.destroy_requested:${fetchId}`,
1564
1608
  `meta.socket_client.disconnected:${fetchId}`,
1565
1609
  `meta.fetch.handshake_failed:${fetchId}`
1566
1610
  ).emits("meta.fetch.destroyed");
@@ -1855,12 +1899,23 @@ var SocketController = class _SocketController {
1855
1899
  CadenzaService.createMetaTask(
1856
1900
  "Connect to socket server",
1857
1901
  (ctx) => {
1858
- const { serviceName, serviceAddress, servicePort, protocol } = ctx;
1902
+ const {
1903
+ serviceInstanceId,
1904
+ communicationTypes,
1905
+ serviceName,
1906
+ serviceAddress,
1907
+ servicePort,
1908
+ protocol
1909
+ } = ctx;
1859
1910
  const socketProtocol = protocol === "https" ? "wss" : "ws";
1860
1911
  const port = protocol === "https" ? 443 : servicePort;
1861
1912
  const URL = `${socketProtocol}://${serviceAddress}:${port}`;
1862
1913
  const fetchId = `${serviceAddress}_${port}`;
1863
1914
  let handshake = false;
1915
+ if (CadenzaService.get(`Socket handshake with ${URL}`)) {
1916
+ console.error("Socket client already exists", URL);
1917
+ return;
1918
+ }
1864
1919
  const socket = (0, import_socket2.io)(URL, {
1865
1920
  reconnection: true,
1866
1921
  reconnectionAttempts: 5,
@@ -1948,7 +2003,7 @@ var SocketController = class _SocketController {
1948
2003
  { error: err.message, serviceName, socketId: socket.id, URL },
1949
2004
  "error"
1950
2005
  );
1951
- CadenzaService.emit("meta.socket_client.connect_error", err);
2006
+ CadenzaService.emit(`meta.socket_client.connect_error:${fetchId}`, err);
1952
2007
  });
1953
2008
  socket.on("reconnect_attempt", (attempt) => {
1954
2009
  CadenzaService.log(`Reconnect attempt: ${attempt}`);
@@ -1989,8 +2044,8 @@ var SocketController = class _SocketController {
1989
2044
  handshake = false;
1990
2045
  });
1991
2046
  socket.connect();
1992
- CadenzaService.createEphemeralMetaTask(
1993
- `Handshake with ${URL}`,
2047
+ const handshakeTask = CadenzaService.createMetaTask(
2048
+ `Socket handshake with ${URL}`,
1994
2049
  async () => {
1995
2050
  if (handshake) return;
1996
2051
  handshake = true;
@@ -2024,7 +2079,7 @@ var SocketController = class _SocketController {
2024
2079
  "Handshakes with socket server"
2025
2080
  ).doOn(`meta.socket_client.connected:${fetchId}`);
2026
2081
  const delegateTask = CadenzaService.createMetaTask(
2027
- `Delegate flow to ${URL}`,
2082
+ `Delegate flow to Socket service ${URL}`,
2028
2083
  async (ctx2, emit) => {
2029
2084
  if (ctx2.__remoteRoutineName === void 0) {
2030
2085
  return;
@@ -2057,7 +2112,7 @@ var SocketController = class _SocketController {
2057
2112
  `Delegate flow to service ${serviceName} with address ${URL}`
2058
2113
  ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`).attachSignal("meta.socket_client.delegated");
2059
2114
  const transmitTask = CadenzaService.createMetaTask(
2060
- `Transmit signal to ${URL}`,
2115
+ `Transmit signal to socket server ${URL}`,
2061
2116
  async (ctx2, emit) => {
2062
2117
  if (ctx2.__signalName === void 0) {
2063
2118
  return;
@@ -2079,16 +2134,31 @@ var SocketController = class _SocketController {
2079
2134
  ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`).attachSignal("meta.socket_client.transmitted");
2080
2135
  CadenzaService.createEphemeralMetaTask(
2081
2136
  `Shutdown SocketClient ${URL}`,
2082
- () => {
2137
+ (ctx2, emit) => {
2138
+ CadenzaService.log("Shutting down socket client", { URL, serviceName });
2083
2139
  socket?.close();
2140
+ handshakeTask.destroy();
2084
2141
  delegateTask.destroy();
2085
2142
  transmitTask.destroy();
2143
+ emit(`meta.fetch.handshake_requested:${fetchId}`, {
2144
+ serviceInstanceId,
2145
+ serviceName,
2146
+ communicationTypes,
2147
+ serviceAddress,
2148
+ servicePort,
2149
+ protocol,
2150
+ handshakeData: {
2151
+ instanceId: CadenzaService.serviceRegistry.serviceInstanceId,
2152
+ serviceName: CadenzaService.serviceRegistry.serviceName
2153
+ }
2154
+ });
2086
2155
  },
2087
2156
  "Shuts down the socket client"
2088
2157
  ).doOn(
2089
2158
  `meta.socket_shutdown_requested:${fetchId}`,
2090
2159
  `meta.socket_client.disconnected:${fetchId}`,
2091
- `meta.fetch.handshake_failed:${fetchId}`
2160
+ `meta.fetch.handshake_failed:${fetchId}`,
2161
+ `meta.socket_client.connect_error:${fetchId}`
2092
2162
  ).emits("meta.socket_client_shutdown_complete");
2093
2163
  return true;
2094
2164
  },