@zukhruf/single-flight 0.3.17 → 0.3.19

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 (76) hide show
  1. package/README.md +13 -11
  2. package/dist/client/flight-client.d.ts +2 -2
  3. package/dist/client/flight-client.d.ts.map +1 -1
  4. package/dist/client/flight-client.js +6 -1
  5. package/dist/client/flight-client.js.map +1 -1
  6. package/dist/connection/connection-supervisor.d.ts +4 -4
  7. package/dist/connection/connection-supervisor.d.ts.map +1 -1
  8. package/dist/connection/connection-supervisor.js.map +1 -1
  9. package/dist/connection/connection.d.ts +4 -3
  10. package/dist/connection/connection.d.ts.map +1 -1
  11. package/dist/connection/connector.d.ts +5 -5
  12. package/dist/connection/connector.d.ts.map +1 -1
  13. package/dist/connection/electing-connector.d.ts +4 -5
  14. package/dist/connection/electing-connector.d.ts.map +1 -1
  15. package/dist/connection/electing-connector.js +38 -42
  16. package/dist/connection/electing-connector.js.map +1 -1
  17. package/dist/connection/flight-election.d.ts +11 -0
  18. package/dist/connection/flight-election.d.ts.map +1 -0
  19. package/dist/connection/flight-election.js +18 -0
  20. package/dist/connection/flight-election.js.map +1 -0
  21. package/dist/connection/handshake.d.ts.map +1 -1
  22. package/dist/connection/handshake.js +6 -5
  23. package/dist/connection/handshake.js.map +1 -1
  24. package/dist/connection/json-line.d.ts +6 -0
  25. package/dist/connection/json-line.d.ts.map +1 -0
  26. package/dist/connection/json-line.js +8 -0
  27. package/dist/connection/json-line.js.map +1 -0
  28. package/dist/connection/leave-errors-to-close.d.ts +9 -0
  29. package/dist/connection/leave-errors-to-close.d.ts.map +1 -0
  30. package/dist/connection/leave-errors-to-close.js +10 -0
  31. package/dist/connection/leave-errors-to-close.js.map +1 -0
  32. package/dist/connection/socket-connection.d.ts +5 -5
  33. package/dist/connection/socket-connection.d.ts.map +1 -1
  34. package/dist/connection/socket-connection.js +21 -23
  35. package/dist/connection/socket-connection.js.map +1 -1
  36. package/dist/coordinator/flight-coordinator.d.ts +9 -4
  37. package/dist/coordinator/flight-coordinator.d.ts.map +1 -1
  38. package/dist/coordinator/flight-coordinator.js +26 -18
  39. package/dist/coordinator/flight-coordinator.js.map +1 -1
  40. package/dist/coordinator/flight-server.d.ts +9 -3
  41. package/dist/coordinator/flight-server.d.ts.map +1 -1
  42. package/dist/coordinator/flight-server.js +38 -24
  43. package/dist/coordinator/flight-server.js.map +1 -1
  44. package/dist/coordinator/flight.d.ts +3 -1
  45. package/dist/coordinator/flight.d.ts.map +1 -1
  46. package/dist/coordinator/flight.js +9 -5
  47. package/dist/coordinator/flight.js.map +1 -1
  48. package/dist/coordinator/party.d.ts +11 -2
  49. package/dist/coordinator/party.d.ts.map +1 -1
  50. package/dist/coordinator/party.js +15 -15
  51. package/dist/coordinator/party.js.map +1 -1
  52. package/dist/coordinator/session.d.ts +2 -2
  53. package/dist/coordinator/session.d.ts.map +1 -1
  54. package/dist/coordinator/session.js +7 -2
  55. package/dist/coordinator/session.js.map +1 -1
  56. package/dist/protocol/flight-protocol.d.ts +6 -2
  57. package/dist/protocol/flight-protocol.d.ts.map +1 -1
  58. package/dist/protocol/flight-protocol.js +15 -9
  59. package/dist/protocol/flight-protocol.js.map +1 -1
  60. package/dist/single-flight.d.ts +4 -2
  61. package/dist/single-flight.d.ts.map +1 -1
  62. package/dist/single-flight.js +10 -8
  63. package/dist/single-flight.js.map +1 -1
  64. package/package.json +2 -1
  65. package/dist/election/leader-election.d.ts +0 -24
  66. package/dist/election/leader-election.d.ts.map +0 -1
  67. package/dist/election/leader-election.js +0 -78
  68. package/dist/election/leader-election.js.map +0 -1
  69. package/dist/election/leadership.d.ts +0 -14
  70. package/dist/election/leadership.d.ts.map +0 -1
  71. package/dist/election/leadership.js +0 -23
  72. package/dist/election/leadership.js.map +0 -1
  73. package/dist/shared/sqlite/is-busy.d.ts +0 -3
  74. package/dist/shared/sqlite/is-busy.d.ts.map +0 -1
  75. package/dist/shared/sqlite/is-busy.js +0 -10
  76. package/dist/shared/sqlite/is-busy.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"party.js","sourceRoot":"","sources":["../../src/coordinator/party.ts"],"names":[],"mappings":"AAmBA,sHAAsH;AACtH,MAAM,OAAO,KAAK;IACP,EAAE,CAAS;IACX,MAAM,CAAQ;IACvB,KAAK,GAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAElC,YAAY,EAAU,EAAE,KAAY;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChB,EAAE,EAAE,MAAM;YACV,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChB,EAAE,EAAE,QAAQ;YACZ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAED,mHAAmH;IACnH,GAAG,CAAC,QAAyB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACvC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF"}
1
+ {"version":3,"file":"party.js","sourceRoot":"","sources":["../../src/coordinator/party.ts"],"names":[],"mappings":"AAwBA,sHAAsH;AACtH,MAAM,OAAO,KAAK;IACP,EAAE,CAAS;IACX,MAAM,CAAQ;IACvB,KAAK,GAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAElC,YAAY,EAAU,EAAE,KAAY;QAClC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,iHAAiH;IACjH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,gGAAgG;IAChG,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,MAAc;QACjB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,iHAAiH;IACjH,GAAG,CAAC,MAAe;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACvC,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,mGAAmG;QACnG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { Connection } from '../connection/connection.ts';
2
- import { type FlightResponse, type RequestEnvelope } from '../protocol/flight-protocol.ts';
2
+ import { type FlightResponse } from '../protocol/flight-protocol.ts';
3
3
  import type { FlightCoordinator } from './flight-coordinator.ts';
4
4
  import { type Inbox } from './party.ts';
5
5
  /**
@@ -9,7 +9,7 @@ import { type Inbox } from './party.ts';
9
9
  */
10
10
  export declare class Session implements Inbox {
11
11
  #private;
12
- constructor(coordinator: FlightCoordinator, connection: Connection<FlightResponse, RequestEnvelope>);
12
+ constructor(coordinator: FlightCoordinator, connection: Connection<FlightResponse>);
13
13
  reply(response: FlightResponse): void;
14
14
  forget(id: string): void;
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/coordinator/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,OAAQ,YAAW,KAAK;;gBAMjC,WAAW,EAAE,iBAAiB,EAC9B,UAAU,EAAE,UAAU,CAAC,cAAc,EAAE,eAAe,CAAC;IAQzD,KAAK,CAAC,QAAQ,EAAE,cAAc;IAI9B,MAAM,CAAC,EAAE,EAAE,MAAM;CAgElB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/coordinator/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,OAAQ,YAAW,KAAK;;gBAMjC,WAAW,EAAE,iBAAiB,EAC9B,UAAU,EAAE,UAAU,CAAC,cAAc,CAAC;IAYxC,KAAK,CAAC,QAAQ,EAAE,cAAc;IAI9B,MAAM,CAAC,EAAE,EAAE,MAAM;CAgElB"}
@@ -1,5 +1,5 @@
1
1
  import { FencingToken } from '@zukhruf/fencing';
2
- import { isFlightRequest, } from "../protocol/flight-protocol.js";
2
+ import { isFlightRequest, isRequestEnvelope, } from "../protocol/flight-protocol.js";
3
3
  import { Party } from "./party.js";
4
4
  /**
5
5
  * One client connection. It turns each request into a party of the
@@ -13,7 +13,12 @@ export class Session {
13
13
  constructor(coordinator, connection) {
14
14
  this.#coordinator = coordinator;
15
15
  this.#phase = new Serving(connection);
16
- connection.on('message', (request) => this.#handle(request));
16
+ connection.on('message', (message) => {
17
+ // A message with no op or no id cannot be answered, so it is ignored, and the peer keeps its flights (ADR 0008).
18
+ if (!isRequestEnvelope(message))
19
+ return;
20
+ this.#handle(message);
21
+ });
17
22
  connection.once('close', () => this.#end());
18
23
  }
19
24
  reply(response) {
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/coordinator/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAGL,eAAe,GAChB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAc,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;GAIG;AACH,MAAM,OAAO,OAAO;IACT,YAAY,CAAoB;IAChC,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC7C,MAAM,CAAe;IAErB,YACE,WAA8B,EAC9B,UAAuD;QAEvD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAwB;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,OAAwB;QAC9B,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;YACnB,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,KAAK,CACH,OAAO,CAAC,MAAM,KAAK,SAAS;oBAC1B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;oBAC3C,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CACjE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;gBACjD,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxD,CAAC;gBACD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpC,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrC,IAAI,CAAC,KAAK;oBAAE,OAAO;gBACnB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAC/B,KAAK,EACL,OAAO,CAAC,GAAG,EACX,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAE,CACnC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,KAAK,CAAC,EAAU;QACd,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IAED,+EAA+E;IAC/E,IAAI;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AAOD,uDAAuD;AACvD,MAAM,OAAO;IACF,WAAW,CAA8C;IAElE,YAAY,UAAuD;QACjE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAwB;QAC5B,8EAA8E;QAC9E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,KAAK;IACT,KAAK,KAAI,CAAC;IAEV,KAAK,KAAI,CAAC;CACX"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/coordinator/session.ts"],"names":[],"mappings":"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"}
@@ -88,7 +88,11 @@ export interface RequestEnvelope {
88
88
  id: string;
89
89
  }
90
90
  export declare function isRequestEnvelope(message: unknown): message is RequestEnvelope;
91
- /** Messages arrive from another process, so their shape is checked before use. */
92
- export declare function isFlightRequest(message: unknown): message is FlightRequest;
91
+ /**
92
+ * Messages arrive from another process, so their shape is checked before
93
+ * use. `isRequestEnvelope` already checked the `op` and the `id`, so only the
94
+ * fields of each request are left.
95
+ */
96
+ export declare function isFlightRequest(request: RequestEnvelope): request is FlightRequest;
93
97
  export declare function isFlightResponse(message: unknown): message is FlightResponse;
94
98
  //# sourceMappingURL=flight-protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flight-protocol.d.ts","sourceRoot":"","sources":["../../src/protocol/flight-protocol.ts"],"names":[],"mappings":"AAIA,yFAAyF;AACzF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAED,uFAAuF;AACvF,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/D,+EAA+E;AAC/E,MAAM,MAAM,aAAa;AACvB;;;;;;;GAOG;AACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACzD,mHAAmH;GACjH;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AAC9C,6EAA6E;GAC3E;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC9B,0GAA0G;GACxG;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,cAAc;AACxB,wEAAwE;AACtE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAC3C,oFAAoF;GAClF;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AAChD,qGAAqG;GACnG;IAAE,EAAE,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AACnC,uDAAuD;GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC3B,8FAA8F;GAC5F;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAChC,2EAA2E;GACzE;IAAE,EAAE,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,qHAAqH;AACrH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAKD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,GACf,OAAO,IAAI,eAAe,CAM5B;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,aAAa,CAiB1E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,cAAc,CAiB5E"}
1
+ {"version":3,"file":"flight-protocol.d.ts","sourceRoot":"","sources":["../../src/protocol/flight-protocol.ts"],"names":[],"mappings":"AAIA,yFAAyF;AACzF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAED,uFAAuF;AACvF,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/D,+EAA+E;AAC/E,MAAM,MAAM,aAAa;AACvB;;;;;;;GAOG;AACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACzD,mHAAmH;GACjH;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AAC9C,6EAA6E;GAC3E;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC9B,0GAA0G;GACxG;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,cAAc;AACxB,wEAAwE;AACtE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAC3C,oFAAoF;GAClF;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AAChD,qGAAqG;GACnG;IAAE,EAAE,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AACnC,uDAAuD;GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC3B,8FAA8F;GAC5F;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAChC,2EAA2E;GACzE;IAAE,EAAE,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,qHAAqH;AACrH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAKD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,GACf,OAAO,IAAI,eAAe,CAM5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,GACvB,OAAO,IAAI,aAAa,CAsB1B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,cAAc,CAiB5E"}
@@ -6,20 +6,26 @@ export function isRequestEnvelope(message) {
6
6
  typeof message.op === 'string' &&
7
7
  typeof message.id === 'string');
8
8
  }
9
- /** Messages arrive from another process, so their shape is checked before use. */
10
- export function isFlightRequest(message) {
11
- if (!isRecord(message) || typeof message.id !== 'string')
12
- return false;
13
- switch (message.op) {
9
+ /**
10
+ * Messages arrive from another process, so their shape is checked before
11
+ * use. `isRequestEnvelope` already checked the `op` and the `id`, so only the
12
+ * fields of each request are left.
13
+ */
14
+ export function isFlightRequest(request) {
15
+ switch (request.op) {
14
16
  case 'run':
15
- return (typeof message.key === 'string' &&
16
- (message.flight === undefined || isToken(message.flight)));
17
+ return ('key' in request &&
18
+ typeof request.key === 'string' &&
19
+ (!('flight' in request) || isToken(request.flight)));
17
20
  case 'land':
18
- return isOutcome(message.outcome);
21
+ return 'outcome' in request && isOutcome(request.outcome);
19
22
  case 'cancel':
20
23
  return true;
21
24
  case 'reassert':
22
- return typeof message.key === 'string' && isToken(message.token);
25
+ return ('key' in request &&
26
+ typeof request.key === 'string' &&
27
+ 'token' in request &&
28
+ isToken(request.token));
23
29
  default:
24
30
  return false;
25
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flight-protocol.js","sourceRoot":"","sources":["../../src/protocol/flight-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAoDlD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAmB,EAAE,CAClD,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,OAAgB;IAEhB,OAAO,CACL,QAAQ,CAAC,OAAO,CAAC;QACjB,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC9B,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvE,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,CACL,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;gBAC/B,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAC1D,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;QACd,KAAK,UAAU;YACb,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnE;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvE,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,aAAa,CAAC;QACnB,KAAK,KAAK,CAAC;QACX,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK;QAAE,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;IAC7D,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACvB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAClC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"flight-protocol.js","sourceRoot":"","sources":["../../src/protocol/flight-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAoDlD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAmB,EAAE,CAClD,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,OAAgB;IAEhB,OAAO,CACL,QAAQ,CAAC,OAAO,CAAC;QACjB,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC9B,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAwB;IAExB,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,KAAK;YACR,OAAO,CACL,KAAK,IAAI,OAAO;gBAChB,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;gBAC/B,CAAC,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CACpD,CAAC;QACJ,KAAK,MAAM;YACT,OAAO,SAAS,IAAI,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;QACd,KAAK,UAAU;YACb,OAAO,CACL,KAAK,IAAI,OAAO;gBAChB,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;gBAC/B,OAAO,IAAI,OAAO;gBAClB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CACvB,CAAC;QACJ;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvE,QAAQ,OAAO,CAAC,EAAE,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,aAAa,CAAC;QACnB,KAAK,KAAK,CAAC;QACX,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK;QAAE,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;IAC7D,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACvB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAClC,CAAC;AACJ,CAAC"}
@@ -3,7 +3,8 @@ import type { Codec } from './codec.ts';
3
3
  export interface SingleFlightOptions<T> {
4
4
  /**
5
5
  * The local folder where the processes that share flights meet. They keep
6
- * `flight.lock`, `flight.epoch` and `flight.sock` there, so every process
6
+ * `flight.lock`, `flight.epoch`, `flight.lock.clean` and `flight.sock`
7
+ * there, so every process
7
8
  * that names the same folder is in one group, and callers of one key share
8
9
  * a flight across that group. There is no default: one shared default would
9
10
  * put every application on the host into one group, and unrelated
@@ -16,7 +17,8 @@ export interface SingleFlightOptions<T> {
16
17
  /**
17
18
  * Milliseconds that a new coordinator starts no flight after the previous
18
19
  * one stopped, so the leaders of flights in progress can claim them again.
19
- * Must exceed how long a process takes to reconnect. Defaults to 500.
20
+ * A coordinator after a clean shutdown of the one before has none. Must
21
+ * exceed how long a process takes to reconnect. Defaults to 500.
20
22
  */
21
23
  graceWindow?: number;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"single-flight.d.ts","sourceRoot":"","sources":["../src/single-flight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAiBxC,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC;;;;;;;;OAQG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,uGAAuG;IACvG,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,mHAAmH;AACnH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAKD;;;;;;GAMG;AACH,qBAAa,YAAY,CAAC,CAAC,CAAE,YAAW,eAAe;;gBAMzC,EAAE,SAAS,EAAE,KAAK,EAAE,WAAiB,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IA+B3E;;;;;;;;OAQG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAE,UAAe,GAClC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAmB1B,gGAAgG;IAC1F,CAAC,MAAM,CAAC,YAAY,CAAC;CAmC5B"}
1
+ {"version":3,"file":"single-flight.d.ts","sourceRoot":"","sources":["../src/single-flight.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAiBxC,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC;;;;;;;;;OASG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,uGAAuG;IACvG,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,mHAAmH;AACnH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAKD;;;;;;GAMG;AACH,qBAAa,YAAY,CAAC,CAAC,CAAE,YAAW,eAAe;;gBAMzC,EAAE,SAAS,EAAE,KAAK,EAAE,WAAiB,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAkC3E;;;;;;;;OAQG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAE,UAAe,GAClC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAmB1B,gGAAgG;IAC1F,CAAC,MAAM,CAAC,YAAY,CAAC;CAmC5B"}
@@ -3,10 +3,10 @@ import { LeaseLostError } from '@zukhruf/lease';
3
3
  import { FlightClient } from "./client/flight-client.js";
4
4
  import { ConnectionSupervisor } from "./connection/connection-supervisor.js";
5
5
  import { ElectingConnector } from "./connection/electing-connector.js";
6
+ import { flightElection } from "./connection/flight-election.js";
6
7
  import { LocalDirectoryConnector } from "./connection/local-directory-connector.js";
7
8
  import { socketPathFor } from "./connection/socket-path.js";
8
9
  import { FlightServer } from "./coordinator/flight-server.js";
9
- import { LeaderElection } from "./election/leader-election.js";
10
10
  import { FlightFailedError, FlightInterruptedError, failureOf, } from "./errors.js";
11
11
  /** Milliseconds between two attempts to reach the coordinator or to win its term. */
12
12
  const POLL_INTERVAL = 10;
@@ -27,16 +27,18 @@ export class SingleFlight {
27
27
  const socketPath = socketPathFor(directory);
28
28
  this.#client = new FlightClient(new ConnectionSupervisor(new LocalDirectoryConnector(directory, new ElectingConnector({
29
29
  socketPath,
30
- election: new LeaderElection(directory, {
31
- pollInterval: POLL_INTERVAL,
32
- }),
30
+ election: flightElection(directory, POLL_INTERVAL),
33
31
  pollInterval: POLL_INTERVAL,
34
- serve: async (leadership) => {
32
+ serve: async (term) => {
35
33
  // Until serving has fully started, a failure closes the new server, so no server outlives its term.
36
34
  await using starting = new AsyncDisposableStack();
37
- starting.adopt(await FlightServer.start(socketPath, leadership, {
38
- // The first term of a directory has no flights to wait for.
39
- graceWindow: leadership.epoch > 1n ? graceWindow : 0,
35
+ starting.adopt(await FlightServer.start(socketPath, term, {
36
+ // The first term of a directory has no flights to wait for,
37
+ // and neither has a term after a clean shutdown: the
38
+ // coordinator before it left no flight in progress.
39
+ graceWindow: term.epoch > 1n && !term.afterCleanShutdown
40
+ ? graceWindow
41
+ : 0,
40
42
  }), (started) => started.close());
41
43
  this.#servers.use(starting.move());
42
44
  },
@@ -1 +1 @@
1
- {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../src/single-flight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"single-flight.js","sourceRoot":"","sources":["../src/single-flight.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zukhruf/single-flight",
3
- "version": "0.3.17",
3
+ "version": "0.3.19",
4
4
  "description": "Callers of one key share the run already in flight, in one process or across the processes that use one directory, and get its outcome instead of a busy error.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,6 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@zukhruf/async": "^0.3.13",
45
+ "@zukhruf/election": "^0.3.17",
45
46
  "@zukhruf/fencing": "^0.3.16",
46
47
  "@zukhruf/fs": "^0.3.16",
47
48
  "@zukhruf/lease": "^0.3.16"
@@ -1,24 +0,0 @@
1
- import { Leadership } from './leadership.ts';
2
- export interface LeaderElectionOptions {
3
- /** Milliseconds between attempts while another process coordinates. */
4
- pollInterval?: number;
5
- }
6
- export interface CampaignOptions {
7
- /** Milliseconds to keep trying before conceding to the current coordinator. */
8
- timeout?: number;
9
- }
10
- /**
11
- * Elects the coordinator among the processes sharing `directory`. The claim is
12
- * an exclusive SQLite transaction on `flight.lock`, held for the whole term, so
13
- * the kernel ends the term if the coordinator dies. Each term gets a higher
14
- * epoch than every term before it, recorded in `flight.epoch`. Never delete
15
- * `flight.lock` while campaigners run: a new file would let a second
16
- * coordinator win.
17
- */
18
- export declare class LeaderElection {
19
- #private;
20
- constructor(directory: string, { pollInterval }?: LeaderElectionOptions);
21
- /** Resolves with the new term, or `undefined` if another process still coordinates after `timeout`. */
22
- campaign({ timeout }?: CampaignOptions): Promise<Leadership | undefined>;
23
- }
24
- //# sourceMappingURL=leader-election.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"leader-election.d.ts","sourceRoot":"","sources":["../../src/election/leader-election.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc;;gBAKvB,SAAS,EAAE,MAAM,EACjB,EAAE,YAAiB,EAAE,GAAE,qBAA0B;IAMnD,uGAAuG;IACjG,QAAQ,CAAC,EAAE,OAAW,EAAE,GAAE,eAAoB,GAAG,OAAO,CAC5D,UAAU,GAAG,SAAS,CACvB;CAyCF"}
@@ -1,78 +0,0 @@
1
- import { mkdir, readFile } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import { DatabaseSync } from 'node:sqlite';
4
- import { setTimeout as delay } from 'node:timers/promises';
5
- import { assertLocalDirectory, durableWrite, isErrno } from '@zukhruf/fs';
6
- import { isBusy } from "../shared/sqlite/is-busy.js";
7
- import { Leadership } from "./leadership.js";
8
- /**
9
- * Elects the coordinator among the processes sharing `directory`. The claim is
10
- * an exclusive SQLite transaction on `flight.lock`, held for the whole term, so
11
- * the kernel ends the term if the coordinator dies. Each term gets a higher
12
- * epoch than every term before it, recorded in `flight.epoch`. Never delete
13
- * `flight.lock` while campaigners run: a new file would let a second
14
- * coordinator win.
15
- */
16
- export class LeaderElection {
17
- #directory;
18
- #pollInterval;
19
- constructor(directory, { pollInterval = 10 } = {}) {
20
- this.#directory = directory;
21
- this.#pollInterval = pollInterval;
22
- }
23
- /** Resolves with the new term, or `undefined` if another process still coordinates after `timeout`. */
24
- async campaign({ timeout = 0 } = {}) {
25
- await assertLocalDirectory(this.#directory);
26
- await mkdir(this.#directory, { recursive: true });
27
- // A busy timeout above zero would block this process's event loop while it
28
- // waits, so the claim is retried here instead.
29
- const claim = new DatabaseSync(join(this.#directory, 'flight.lock'), {
30
- timeout: 0,
31
- });
32
- const deadline = performance.now() + timeout;
33
- try {
34
- for (;;) {
35
- if (this.#tryClaim(claim))
36
- return new Leadership(await this.#nextEpoch(), claim);
37
- if (performance.now() >= deadline)
38
- break;
39
- await delay(this.#pollInterval);
40
- }
41
- }
42
- catch (error) {
43
- claim.close();
44
- throw error;
45
- }
46
- claim.close();
47
- return undefined;
48
- }
49
- #tryClaim(claim) {
50
- try {
51
- claim.exec('BEGIN EXCLUSIVE');
52
- return true;
53
- }
54
- catch (error) {
55
- if (isBusy(error))
56
- return false;
57
- throw error;
58
- }
59
- }
60
- /** Safe without further locking: only the claim holder gets here. */
61
- async #nextEpoch() {
62
- const path = join(this.#directory, 'flight.epoch');
63
- const epoch = (await readEpoch(path)) + 1n;
64
- await durableWrite(path, epoch.toString());
65
- return epoch;
66
- }
67
- }
68
- async function readEpoch(path) {
69
- try {
70
- return BigInt(await readFile(path, 'utf8'));
71
- }
72
- catch (error) {
73
- if (isErrno(error, 'ENOENT'))
74
- return 0n;
75
- throw error;
76
- }
77
- }
78
- //# sourceMappingURL=leader-election.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"leader-election.js","sourceRoot":"","sources":["../../src/election/leader-election.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { DatabaseSync } from 'node:sqlite';
2
- /**
3
- * One term as the elected coordinator. It lasts until `resign` or until the
4
- * process dies, when the kernel releases the claim and another campaigner can win.
5
- */
6
- export declare class Leadership implements AsyncDisposable {
7
- #private;
8
- /** Grows with every term, so a newer coordinator's tokens always outrank an older one's. */
9
- readonly epoch: bigint;
10
- constructor(epoch: bigint, claim: DatabaseSync);
11
- resign(): Promise<void>;
12
- [Symbol.asyncDispose](): Promise<void>;
13
- }
14
- //# sourceMappingURL=leadership.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"leadership.d.ts","sourceRoot":"","sources":["../../src/election/leadership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,qBAAa,UAAW,YAAW,eAAe;;IAChD,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAGX,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY;IAKxC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC"}
@@ -1,23 +0,0 @@
1
- /**
2
- * One term as the elected coordinator. It lasts until `resign` or until the
3
- * process dies, when the kernel releases the claim and another campaigner can win.
4
- */
5
- export class Leadership {
6
- /** Grows with every term, so a newer coordinator's tokens always outrank an older one's. */
7
- epoch;
8
- #claim;
9
- constructor(epoch, claim) {
10
- this.epoch = epoch;
11
- this.#claim = claim;
12
- }
13
- async resign() {
14
- if (!this.#claim.isOpen)
15
- return;
16
- this.#claim.exec('ROLLBACK');
17
- this.#claim.close();
18
- }
19
- [Symbol.asyncDispose]() {
20
- return this.resign();
21
- }
22
- }
23
- //# sourceMappingURL=leadership.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"leadership.js","sourceRoot":"","sources":["../../src/election/leadership.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,UAAU;IACrB,4FAA4F;IACnF,KAAK,CAAS;IACd,MAAM,CAAe;IAE9B,YAAY,KAAa,EAAE,KAAmB;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,CAAC,MAAM,CAAC,YAAY,CAAC;QACnB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -1,3 +0,0 @@
1
- /** Whether `error` means another connection holds a conflicting lock right now. */
2
- export declare function isBusy(error: unknown): boolean;
3
- //# sourceMappingURL=is-busy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-busy.d.ts","sourceRoot":"","sources":["../../../src/shared/sqlite/is-busy.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQ9C"}
@@ -1,10 +0,0 @@
1
- const SQLITE_BUSY = 5;
2
- /** Whether `error` means another connection holds a conflicting lock right now. */
3
- export function isBusy(error) {
4
- return (error instanceof Error &&
5
- 'errcode' in error &&
6
- typeof error.errcode === 'number' &&
7
- // The low byte is the primary result code, covering SQLITE_BUSY_* variants.
8
- (error.errcode & 0xff) === SQLITE_BUSY);
9
- }
10
- //# sourceMappingURL=is-busy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-busy.js","sourceRoot":"","sources":["../../../src/shared/sqlite/is-busy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,mFAAmF;AACnF,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,SAAS,IAAI,KAAK;QAClB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,4EAA4E;QAC5E,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,WAAW,CACvC,CAAC;AACJ,CAAC"}