abxbus 2.4.1

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 (137) hide show
  1. package/README.md +647 -0
  2. package/dist/cjs/async_context.d.ts +12 -0
  3. package/dist/cjs/async_context.js +70 -0
  4. package/dist/cjs/async_context.js.map +7 -0
  5. package/dist/cjs/base_event.d.ts +207 -0
  6. package/dist/cjs/base_event.js +871 -0
  7. package/dist/cjs/base_event.js.map +7 -0
  8. package/dist/cjs/bridge_jsonl.d.ts +26 -0
  9. package/dist/cjs/bridge_jsonl.js +170 -0
  10. package/dist/cjs/bridge_jsonl.js.map +7 -0
  11. package/dist/cjs/bridge_nats.d.ts +20 -0
  12. package/dist/cjs/bridge_nats.js +108 -0
  13. package/dist/cjs/bridge_nats.js.map +7 -0
  14. package/dist/cjs/bridge_postgres.d.ts +31 -0
  15. package/dist/cjs/bridge_postgres.js +251 -0
  16. package/dist/cjs/bridge_postgres.js.map +7 -0
  17. package/dist/cjs/bridge_redis.d.ts +34 -0
  18. package/dist/cjs/bridge_redis.js +175 -0
  19. package/dist/cjs/bridge_redis.js.map +7 -0
  20. package/dist/cjs/bridge_sqlite.d.ts +30 -0
  21. package/dist/cjs/bridge_sqlite.js +255 -0
  22. package/dist/cjs/bridge_sqlite.js.map +7 -0
  23. package/dist/cjs/bridges.d.ts +49 -0
  24. package/dist/cjs/bridges.js +326 -0
  25. package/dist/cjs/bridges.js.map +7 -0
  26. package/dist/cjs/event_bus.d.ts +127 -0
  27. package/dist/cjs/event_bus.js +1058 -0
  28. package/dist/cjs/event_bus.js.map +7 -0
  29. package/dist/cjs/event_handler.d.ts +139 -0
  30. package/dist/cjs/event_handler.js +299 -0
  31. package/dist/cjs/event_handler.js.map +7 -0
  32. package/dist/cjs/event_history.d.ts +45 -0
  33. package/dist/cjs/event_history.js +192 -0
  34. package/dist/cjs/event_history.js.map +7 -0
  35. package/dist/cjs/event_result.d.ts +86 -0
  36. package/dist/cjs/event_result.js +446 -0
  37. package/dist/cjs/event_result.js.map +7 -0
  38. package/dist/cjs/events_suck.d.ts +40 -0
  39. package/dist/cjs/events_suck.js +59 -0
  40. package/dist/cjs/events_suck.js.map +7 -0
  41. package/dist/cjs/helpers.d.ts +1 -0
  42. package/dist/cjs/helpers.js +84 -0
  43. package/dist/cjs/helpers.js.map +7 -0
  44. package/dist/cjs/index.d.ts +17 -0
  45. package/dist/cjs/index.js +54 -0
  46. package/dist/cjs/index.js.map +7 -0
  47. package/dist/cjs/lock_manager.d.ts +70 -0
  48. package/dist/cjs/lock_manager.js +343 -0
  49. package/dist/cjs/lock_manager.js.map +7 -0
  50. package/dist/cjs/logging.d.ts +16 -0
  51. package/dist/cjs/logging.js +216 -0
  52. package/dist/cjs/logging.js.map +7 -0
  53. package/dist/cjs/middlewares.d.ts +13 -0
  54. package/dist/cjs/middlewares.js +17 -0
  55. package/dist/cjs/middlewares.js.map +7 -0
  56. package/dist/cjs/optional_deps.d.ts +3 -0
  57. package/dist/cjs/optional_deps.js +64 -0
  58. package/dist/cjs/optional_deps.js.map +7 -0
  59. package/dist/cjs/package.json +5 -0
  60. package/dist/cjs/retry.d.ts +52 -0
  61. package/dist/cjs/retry.js +257 -0
  62. package/dist/cjs/retry.js.map +7 -0
  63. package/dist/cjs/timing.d.ts +3 -0
  64. package/dist/cjs/timing.js +76 -0
  65. package/dist/cjs/timing.js.map +7 -0
  66. package/dist/cjs/type_inference.test.d.ts +1 -0
  67. package/dist/cjs/types.d.ts +36 -0
  68. package/dist/cjs/types.js +104 -0
  69. package/dist/cjs/types.js.map +7 -0
  70. package/dist/esm/async_context.js +50 -0
  71. package/dist/esm/async_context.js.map +7 -0
  72. package/dist/esm/base_event.js +857 -0
  73. package/dist/esm/base_event.js.map +7 -0
  74. package/dist/esm/bridge_jsonl.js +150 -0
  75. package/dist/esm/bridge_jsonl.js.map +7 -0
  76. package/dist/esm/bridge_nats.js +88 -0
  77. package/dist/esm/bridge_nats.js.map +7 -0
  78. package/dist/esm/bridge_postgres.js +231 -0
  79. package/dist/esm/bridge_postgres.js.map +7 -0
  80. package/dist/esm/bridge_redis.js +155 -0
  81. package/dist/esm/bridge_redis.js.map +7 -0
  82. package/dist/esm/bridge_sqlite.js +235 -0
  83. package/dist/esm/bridge_sqlite.js.map +7 -0
  84. package/dist/esm/bridges.js +306 -0
  85. package/dist/esm/bridges.js.map +7 -0
  86. package/dist/esm/event_bus.js +1046 -0
  87. package/dist/esm/event_bus.js.map +7 -0
  88. package/dist/esm/event_handler.js +279 -0
  89. package/dist/esm/event_handler.js.map +7 -0
  90. package/dist/esm/event_history.js +172 -0
  91. package/dist/esm/event_history.js.map +7 -0
  92. package/dist/esm/event_result.js +426 -0
  93. package/dist/esm/event_result.js.map +7 -0
  94. package/dist/esm/events_suck.js +39 -0
  95. package/dist/esm/events_suck.js.map +7 -0
  96. package/dist/esm/helpers.js +64 -0
  97. package/dist/esm/helpers.js.map +7 -0
  98. package/dist/esm/index.js +47 -0
  99. package/dist/esm/index.js.map +7 -0
  100. package/dist/esm/lock_manager.js +323 -0
  101. package/dist/esm/lock_manager.js.map +7 -0
  102. package/dist/esm/logging.js +196 -0
  103. package/dist/esm/logging.js.map +7 -0
  104. package/dist/esm/middlewares.js +1 -0
  105. package/dist/esm/middlewares.js.map +7 -0
  106. package/dist/esm/optional_deps.js +44 -0
  107. package/dist/esm/optional_deps.js.map +7 -0
  108. package/dist/esm/retry.js +237 -0
  109. package/dist/esm/retry.js.map +7 -0
  110. package/dist/esm/timing.js +56 -0
  111. package/dist/esm/timing.js.map +7 -0
  112. package/dist/esm/types.js +84 -0
  113. package/dist/esm/types.js.map +7 -0
  114. package/dist/types/async_context.d.ts +12 -0
  115. package/dist/types/base_event.d.ts +207 -0
  116. package/dist/types/bridge_jsonl.d.ts +26 -0
  117. package/dist/types/bridge_nats.d.ts +20 -0
  118. package/dist/types/bridge_postgres.d.ts +31 -0
  119. package/dist/types/bridge_redis.d.ts +34 -0
  120. package/dist/types/bridge_sqlite.d.ts +30 -0
  121. package/dist/types/bridges.d.ts +49 -0
  122. package/dist/types/event_bus.d.ts +127 -0
  123. package/dist/types/event_handler.d.ts +139 -0
  124. package/dist/types/event_history.d.ts +45 -0
  125. package/dist/types/event_result.d.ts +86 -0
  126. package/dist/types/events_suck.d.ts +40 -0
  127. package/dist/types/helpers.d.ts +1 -0
  128. package/dist/types/index.d.ts +17 -0
  129. package/dist/types/lock_manager.d.ts +70 -0
  130. package/dist/types/logging.d.ts +16 -0
  131. package/dist/types/middlewares.d.ts +13 -0
  132. package/dist/types/optional_deps.d.ts +3 -0
  133. package/dist/types/retry.d.ts +52 -0
  134. package/dist/types/timing.d.ts +3 -0
  135. package/dist/types/type_inference.test.d.ts +1 -0
  136. package/dist/types/types.d.ts +36 -0
  137. package/package.json +87 -0
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var helpers_exports = {};
20
+ __export(helpers_exports, {
21
+ monotonicDatetime: () => monotonicDatetime
22
+ });
23
+ module.exports = __toCommonJS(helpers_exports);
24
+ const MONOTONIC_DATETIME_REGEX = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})$/;
25
+ const MONOTONIC_DATETIME_LENGTH = 30;
26
+ const NS_PER_MS = 1000000n;
27
+ const NS_PER_SECOND = 1000000000n;
28
+ const has_performance_now = typeof performance !== "undefined" && typeof performance.now === "function";
29
+ const monotonic_clock_anchor_ms = has_performance_now ? performance.now() : 0;
30
+ const monotonic_epoch_anchor_ns = BigInt(Date.now()) * NS_PER_MS;
31
+ let last_monotonic_datetime_ns = monotonic_epoch_anchor_ns;
32
+ function assertYearRange(date, context) {
33
+ const year = date.getUTCFullYear();
34
+ if (year <= 1990 || year >= 2500) {
35
+ throw new Error(`${context} year must be >1990 and <2500, got ${year}`);
36
+ }
37
+ }
38
+ function formatEpochNs(epoch_ns) {
39
+ const epoch_ms = Number(epoch_ns / NS_PER_MS);
40
+ const date = new Date(epoch_ms);
41
+ if (Number.isNaN(date.getTime())) {
42
+ throw new Error(`Failed to format datetime from epoch ns: ${epoch_ns.toString()}`);
43
+ }
44
+ assertYearRange(date, "monotonicDatetime()");
45
+ const base = date.toISOString().slice(0, 19);
46
+ const fraction = (epoch_ns % NS_PER_SECOND).toString().padStart(9, "0");
47
+ const normalized = `${base}.${fraction}Z`;
48
+ if (normalized.length !== MONOTONIC_DATETIME_LENGTH) {
49
+ throw new Error(`Expected canonical datetime length ${MONOTONIC_DATETIME_LENGTH}, got ${normalized.length}: ${normalized}`);
50
+ }
51
+ return normalized;
52
+ }
53
+ function monotonicDatetime(isostring) {
54
+ if (isostring !== void 0) {
55
+ if (typeof isostring !== "string") {
56
+ throw new Error(`monotonicDatetime(isostring?) requires string | undefined, got ${typeof isostring}`);
57
+ }
58
+ const match = MONOTONIC_DATETIME_REGEX.exec(isostring);
59
+ if (!match) {
60
+ throw new Error(`Invalid ISO datetime: ${isostring}`);
61
+ }
62
+ const parsed = new Date(isostring);
63
+ if (Number.isNaN(parsed.getTime())) {
64
+ throw new Error(`Invalid ISO datetime: ${isostring}`);
65
+ }
66
+ assertYearRange(parsed, "monotonicDatetime(isostring)");
67
+ const base = parsed.toISOString().slice(0, 19);
68
+ const fraction = (match[7] ?? "").padEnd(9, "0");
69
+ const normalized = `${base}.${fraction}Z`;
70
+ if (normalized.length !== MONOTONIC_DATETIME_LENGTH) {
71
+ throw new Error(`Expected canonical datetime length ${MONOTONIC_DATETIME_LENGTH}, got ${normalized.length}: ${normalized}`);
72
+ }
73
+ return normalized;
74
+ }
75
+ const elapsed_ms = has_performance_now ? performance.now() - monotonic_clock_anchor_ms : 0;
76
+ const elapsed_ns = BigInt(Math.max(0, Math.floor(elapsed_ms * 1e6)));
77
+ let epoch_ns = monotonic_epoch_anchor_ns + elapsed_ns;
78
+ if (epoch_ns <= last_monotonic_datetime_ns) {
79
+ epoch_ns = last_monotonic_datetime_ns + 1n;
80
+ }
81
+ last_monotonic_datetime_ns = epoch_ns;
82
+ return formatEpochNs(epoch_ns);
83
+ }
84
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/helpers.ts"],
4
+ "sourcesContent": ["const MONOTONIC_DATETIME_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,9}))?(Z|[+-]\\d{2}:\\d{2})$/\nconst MONOTONIC_DATETIME_LENGTH = 30 // YYYY-MM-DDTHH:MM:SS.fffffffffZ\nconst NS_PER_MS = 1_000_000n\nconst NS_PER_SECOND = 1_000_000_000n\n\nconst has_performance_now = typeof performance !== 'undefined' && typeof performance.now === 'function'\nconst monotonic_clock_anchor_ms = has_performance_now ? performance.now() : 0\nconst monotonic_epoch_anchor_ns = BigInt(Date.now()) * NS_PER_MS\nlet last_monotonic_datetime_ns = monotonic_epoch_anchor_ns\n\nfunction assertYearRange(date: Date, context: string): void {\n const year = date.getUTCFullYear()\n if (year <= 1990 || year >= 2500) {\n throw new Error(`${context} year must be >1990 and <2500, got ${year}`)\n }\n}\n\nfunction formatEpochNs(epoch_ns: bigint): string {\n const epoch_ms = Number(epoch_ns / NS_PER_MS)\n const date = new Date(epoch_ms)\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Failed to format datetime from epoch ns: ${epoch_ns.toString()}`)\n }\n assertYearRange(date, 'monotonicDatetime()')\n const base = date.toISOString().slice(0, 19)\n const fraction = (epoch_ns % NS_PER_SECOND).toString().padStart(9, '0')\n const normalized = `${base}.${fraction}Z`\n if (normalized.length !== MONOTONIC_DATETIME_LENGTH) {\n throw new Error(`Expected canonical datetime length ${MONOTONIC_DATETIME_LENGTH}, got ${normalized.length}: ${normalized}`)\n }\n return normalized\n}\n\nexport function monotonicDatetime(isostring?: string): string {\n if (isostring !== undefined) {\n if (typeof isostring !== 'string') {\n throw new Error(`monotonicDatetime(isostring?) requires string | undefined, got ${typeof isostring}`)\n }\n const match = MONOTONIC_DATETIME_REGEX.exec(isostring)\n if (!match) {\n throw new Error(`Invalid ISO datetime: ${isostring}`)\n }\n const parsed = new Date(isostring)\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid ISO datetime: ${isostring}`)\n }\n assertYearRange(parsed, 'monotonicDatetime(isostring)')\n const base = parsed.toISOString().slice(0, 19)\n const fraction = (match[7] ?? '').padEnd(9, '0')\n const normalized = `${base}.${fraction}Z`\n if (normalized.length !== MONOTONIC_DATETIME_LENGTH) {\n throw new Error(`Expected canonical datetime length ${MONOTONIC_DATETIME_LENGTH}, got ${normalized.length}: ${normalized}`)\n }\n return normalized\n }\n\n const elapsed_ms = has_performance_now ? performance.now() - monotonic_clock_anchor_ms : 0\n const elapsed_ns = BigInt(Math.max(0, Math.floor(elapsed_ms * 1_000_000)))\n let epoch_ns = monotonic_epoch_anchor_ns + elapsed_ns\n if (epoch_ns <= last_monotonic_datetime_ns) {\n epoch_ns = last_monotonic_datetime_ns + 1n\n }\n last_monotonic_datetime_ns = epoch_ns\n return formatEpochNs(epoch_ns)\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,2BAA2B;AACjC,MAAM,4BAA4B;AAClC,MAAM,YAAY;AAClB,MAAM,gBAAgB;AAEtB,MAAM,sBAAsB,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ;AAC7F,MAAM,4BAA4B,sBAAsB,YAAY,IAAI,IAAI;AAC5E,MAAM,4BAA4B,OAAO,KAAK,IAAI,CAAC,IAAI;AACvD,IAAI,6BAA6B;AAEjC,SAAS,gBAAgB,MAAY,SAAuB;AAC1D,QAAM,OAAO,KAAK,eAAe;AACjC,MAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,UAAM,IAAI,MAAM,GAAG,OAAO,sCAAsC,IAAI,EAAE;AAAA,EACxE;AACF;AAEA,SAAS,cAAc,UAA0B;AAC/C,QAAM,WAAW,OAAO,WAAW,SAAS;AAC5C,QAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAChC,UAAM,IAAI,MAAM,4CAA4C,SAAS,SAAS,CAAC,EAAE;AAAA,EACnF;AACA,kBAAgB,MAAM,qBAAqB;AAC3C,QAAM,OAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAC3C,QAAM,YAAY,WAAW,eAAe,SAAS,EAAE,SAAS,GAAG,GAAG;AACtE,QAAM,aAAa,GAAG,IAAI,IAAI,QAAQ;AACtC,MAAI,WAAW,WAAW,2BAA2B;AACnD,UAAM,IAAI,MAAM,sCAAsC,yBAAyB,SAAS,WAAW,MAAM,KAAK,UAAU,EAAE;AAAA,EAC5H;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,WAA4B;AAC5D,MAAI,cAAc,QAAW;AAC3B,QAAI,OAAO,cAAc,UAAU;AACjC,YAAM,IAAI,MAAM,kEAAkE,OAAO,SAAS,EAAE;AAAA,IACtG;AACA,UAAM,QAAQ,yBAAyB,KAAK,SAAS;AACrD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,yBAAyB,SAAS,EAAE;AAAA,IACtD;AACA,UAAM,SAAS,IAAI,KAAK,SAAS;AACjC,QAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,YAAM,IAAI,MAAM,yBAAyB,SAAS,EAAE;AAAA,IACtD;AACA,oBAAgB,QAAQ,8BAA8B;AACtD,UAAM,OAAO,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C,UAAM,YAAY,MAAM,CAAC,KAAK,IAAI,OAAO,GAAG,GAAG;AAC/C,UAAM,aAAa,GAAG,IAAI,IAAI,QAAQ;AACtC,QAAI,WAAW,WAAW,2BAA2B;AACnD,YAAM,IAAI,MAAM,sCAAsC,yBAAyB,SAAS,WAAW,MAAM,KAAK,UAAU,EAAE;AAAA,IAC5H;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,sBAAsB,YAAY,IAAI,IAAI,4BAA4B;AACzF,QAAM,aAAa,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,GAAS,CAAC,CAAC;AACzE,MAAI,WAAW,4BAA4B;AAC3C,MAAI,YAAY,4BAA4B;AAC1C,eAAW,6BAA6B;AAAA,EAC1C;AACA,+BAA6B;AAC7B,SAAO,cAAc,QAAQ;AAC/B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ export { BaseEvent, BaseEventSchema } from './base_event.js';
2
+ export { EventHistory } from './event_history.js';
3
+ export type { EventHistoryFindOptions, EventHistoryTrimOptions } from './event_history.js';
4
+ export { EventResult } from './event_result.js';
5
+ export { EventBus } from './event_bus.js';
6
+ export type { EventBusJSON, EventBusOptions } from './event_bus.js';
7
+ export { monotonicDatetime } from './helpers.js';
8
+ export type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './middlewares.js';
9
+ export { EventHandlerTimeoutError, EventHandlerCancelledError, EventHandlerAbortedError, EventHandlerResultSchemaError, } from './event_handler.js';
10
+ export type { EventConcurrencyMode, EventHandlerConcurrencyMode, EventHandlerCompletionMode, EventBusInterfaceForLockManager, } from './lock_manager.js';
11
+ export type { EventClass, EventHandlerCallable as EventHandler, EventPattern, EventStatus, FindOptions, FindWindow } from './types.js';
12
+ export { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from './retry.js';
13
+ export type { RetryOptions } from './retry.js';
14
+ export { HTTPEventBridge, SocketEventBridge, NATSEventBridge, RedisEventBridge, PostgresEventBridge, JSONLEventBridge, SQLiteEventBridge, } from './bridges.js';
15
+ export type { HTTPEventBridgeOptions } from './bridges.js';
16
+ export { events_suck } from './events_suck.js';
17
+ export type { EventsSuckClient, EventsSuckClientClass, GeneratedEvents } from './events_suck.js';
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var index_exports = {};
20
+ __export(index_exports, {
21
+ BaseEvent: () => import_base_event.BaseEvent,
22
+ BaseEventSchema: () => import_base_event.BaseEventSchema,
23
+ EventBus: () => import_event_bus.EventBus,
24
+ EventHandlerAbortedError: () => import_event_handler.EventHandlerAbortedError,
25
+ EventHandlerCancelledError: () => import_event_handler.EventHandlerCancelledError,
26
+ EventHandlerResultSchemaError: () => import_event_handler.EventHandlerResultSchemaError,
27
+ EventHandlerTimeoutError: () => import_event_handler.EventHandlerTimeoutError,
28
+ EventHistory: () => import_event_history.EventHistory,
29
+ EventResult: () => import_event_result.EventResult,
30
+ HTTPEventBridge: () => import_bridges.HTTPEventBridge,
31
+ JSONLEventBridge: () => import_bridges.JSONLEventBridge,
32
+ NATSEventBridge: () => import_bridges.NATSEventBridge,
33
+ PostgresEventBridge: () => import_bridges.PostgresEventBridge,
34
+ RedisEventBridge: () => import_bridges.RedisEventBridge,
35
+ RetryTimeoutError: () => import_retry.RetryTimeoutError,
36
+ SQLiteEventBridge: () => import_bridges.SQLiteEventBridge,
37
+ SemaphoreTimeoutError: () => import_retry.SemaphoreTimeoutError,
38
+ SocketEventBridge: () => import_bridges.SocketEventBridge,
39
+ clearSemaphoreRegistry: () => import_retry.clearSemaphoreRegistry,
40
+ events_suck: () => import_events_suck.events_suck,
41
+ monotonicDatetime: () => import_helpers.monotonicDatetime,
42
+ retry: () => import_retry.retry
43
+ });
44
+ module.exports = __toCommonJS(index_exports);
45
+ var import_base_event = require("./base_event.js");
46
+ var import_event_history = require("./event_history.js");
47
+ var import_event_result = require("./event_result.js");
48
+ var import_event_bus = require("./event_bus.js");
49
+ var import_helpers = require("./helpers.js");
50
+ var import_event_handler = require("./event_handler.js");
51
+ var import_retry = require("./retry.js");
52
+ var import_bridges = require("./bridges.js");
53
+ var import_events_suck = require("./events_suck.js");
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": ["export { BaseEvent, BaseEventSchema } from './base_event.js'\nexport { EventHistory } from './event_history.js'\nexport type { EventHistoryFindOptions, EventHistoryTrimOptions } from './event_history.js'\nexport { EventResult } from './event_result.js'\nexport { EventBus } from './event_bus.js'\nexport type { EventBusJSON, EventBusOptions } from './event_bus.js'\nexport { monotonicDatetime } from './helpers.js'\nexport type { EventBusMiddleware, EventBusMiddlewareCtor, EventBusMiddlewareInput } from './middlewares.js'\nexport {\n EventHandlerTimeoutError,\n EventHandlerCancelledError,\n EventHandlerAbortedError,\n EventHandlerResultSchemaError,\n} from './event_handler.js'\nexport type {\n EventConcurrencyMode,\n EventHandlerConcurrencyMode,\n EventHandlerCompletionMode,\n EventBusInterfaceForLockManager,\n} from './lock_manager.js'\nexport type { EventClass, EventHandlerCallable as EventHandler, EventPattern, EventStatus, FindOptions, FindWindow } from './types.js'\nexport { retry, clearSemaphoreRegistry, RetryTimeoutError, SemaphoreTimeoutError } from './retry.js'\nexport type { RetryOptions } from './retry.js'\nexport {\n HTTPEventBridge,\n SocketEventBridge,\n NATSEventBridge,\n RedisEventBridge,\n PostgresEventBridge,\n JSONLEventBridge,\n SQLiteEventBridge,\n} from './bridges.js'\nexport type { HTTPEventBridgeOptions } from './bridges.js'\nexport { events_suck } from './events_suck.js'\nexport type { EventsSuckClient, EventsSuckClientClass, GeneratedEvents } from './events_suck.js'\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAA2C;AAC3C,2BAA6B;AAE7B,0BAA4B;AAC5B,uBAAyB;AAEzB,qBAAkC;AAElC,2BAKO;AAQP,mBAAwF;AAExF,qBAQO;AAEP,yBAA4B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,70 @@
1
+ import type { BaseEvent } from './base_event.js';
2
+ import type { EventResult } from './event_result.js';
3
+ export type Deferred<T> = {
4
+ promise: Promise<T>;
5
+ resolve: (value: T | PromiseLike<T>) => void;
6
+ reject: (reason?: unknown) => void;
7
+ };
8
+ export declare const withResolvers: <T>() => Deferred<T>;
9
+ export declare const EVENT_CONCURRENCY_MODES: readonly ["global-serial", "bus-serial", "parallel"];
10
+ export type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number];
11
+ export declare const EVENT_HANDLER_CONCURRENCY_MODES: readonly ["serial", "parallel"];
12
+ export type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number];
13
+ export declare const EVENT_HANDLER_COMPLETION_MODES: readonly ["all", "first"];
14
+ export type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number];
15
+ export declare class AsyncLock {
16
+ size: number;
17
+ in_use: number;
18
+ waiters: Array<() => void>;
19
+ constructor(size: number);
20
+ acquire(): Promise<void>;
21
+ release(): void;
22
+ }
23
+ export declare const runWithLock: <T>(lock: AsyncLock | null, fn: () => Promise<T>) => Promise<T>;
24
+ export type HandlerExecutionState = 'held' | 'yielded' | 'closed';
25
+ export declare class HandlerLock {
26
+ private lock;
27
+ private state;
28
+ constructor(lock: AsyncLock | null);
29
+ yieldHandlerLockForChildRun(): boolean;
30
+ reclaimHandlerLockIfRunning(): Promise<boolean>;
31
+ exitHandlerRun(): void;
32
+ runQueueJump<T>(fn: () => Promise<T>): Promise<T>;
33
+ }
34
+ export type EventBusInterfaceForLockManager = {
35
+ isIdleAndQueueEmpty: () => boolean;
36
+ event_concurrency: EventConcurrencyMode;
37
+ _lock_for_event_global_serial: AsyncLock;
38
+ };
39
+ export type LockManagerOptions = {
40
+ auto_schedule_idle_checks?: boolean;
41
+ };
42
+ export declare class LockManager {
43
+ private bus;
44
+ private auto_schedule_idle_checks;
45
+ readonly bus_event_lock: AsyncLock;
46
+ private pause_depth;
47
+ private pause_waiters;
48
+ private active_handler_results;
49
+ private idle_waiters;
50
+ private idle_check_pending;
51
+ private idle_check_streak;
52
+ constructor(bus: EventBusInterfaceForLockManager, options?: LockManagerOptions);
53
+ _requestRunloopPause(): () => void;
54
+ _waitUntilRunloopResumed(): Promise<void>;
55
+ _isPaused(): boolean;
56
+ _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T>;
57
+ _getActiveHandlerResult(): EventResult | undefined;
58
+ _getActiveHandlerResults(): EventResult[];
59
+ _isAnyHandlerActive(): boolean;
60
+ waitForIdle(timeout_seconds?: number | null): Promise<boolean>;
61
+ _notifyIdleListeners(): void;
62
+ getLockForEvent(event: BaseEvent): AsyncLock | null;
63
+ _runWithEventLock<T>(event: BaseEvent, fn: () => Promise<T>, options?: {
64
+ bypass_event_locks?: boolean;
65
+ pre_acquired_lock?: AsyncLock | null;
66
+ }): Promise<T>;
67
+ _runWithHandlerLock<T>(event: BaseEvent, default_handler_concurrency: EventHandlerConcurrencyMode | undefined, fn: (lock: HandlerLock | null) => Promise<T>): Promise<T>;
68
+ private scheduleIdleCheck;
69
+ clear(): void;
70
+ }
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var lock_manager_exports = {};
20
+ __export(lock_manager_exports, {
21
+ AsyncLock: () => AsyncLock,
22
+ EVENT_CONCURRENCY_MODES: () => EVENT_CONCURRENCY_MODES,
23
+ EVENT_HANDLER_COMPLETION_MODES: () => EVENT_HANDLER_COMPLETION_MODES,
24
+ EVENT_HANDLER_CONCURRENCY_MODES: () => EVENT_HANDLER_CONCURRENCY_MODES,
25
+ HandlerLock: () => HandlerLock,
26
+ LockManager: () => LockManager,
27
+ runWithLock: () => runWithLock,
28
+ withResolvers: () => withResolvers
29
+ });
30
+ module.exports = __toCommonJS(lock_manager_exports);
31
+ const withResolvers = () => {
32
+ if (typeof Promise.withResolvers === "function") {
33
+ return Promise.withResolvers();
34
+ }
35
+ let resolve;
36
+ let reject;
37
+ const promise = new Promise((resolve_fn, reject_fn) => {
38
+ resolve = resolve_fn;
39
+ reject = reject_fn;
40
+ });
41
+ return { promise, resolve, reject };
42
+ };
43
+ const EVENT_CONCURRENCY_MODES = ["global-serial", "bus-serial", "parallel"];
44
+ const EVENT_HANDLER_CONCURRENCY_MODES = ["serial", "parallel"];
45
+ const EVENT_HANDLER_COMPLETION_MODES = ["all", "first"];
46
+ class AsyncLock {
47
+ size;
48
+ in_use;
49
+ waiters;
50
+ constructor(size) {
51
+ this.size = size;
52
+ this.in_use = 0;
53
+ this.waiters = [];
54
+ }
55
+ async acquire() {
56
+ if (this.size === Infinity) {
57
+ return;
58
+ }
59
+ if (this.in_use < this.size) {
60
+ this.in_use += 1;
61
+ return;
62
+ }
63
+ await new Promise((resolve) => {
64
+ this.waiters.push(resolve);
65
+ });
66
+ }
67
+ release() {
68
+ if (this.size === Infinity) {
69
+ return;
70
+ }
71
+ const next = this.waiters.shift();
72
+ if (next) {
73
+ next();
74
+ return;
75
+ }
76
+ this.in_use = Math.max(0, this.in_use - 1);
77
+ }
78
+ }
79
+ const runWithLock = async (lock, fn) => {
80
+ if (!lock) {
81
+ return await fn();
82
+ }
83
+ await lock.acquire();
84
+ try {
85
+ return await fn();
86
+ } finally {
87
+ lock.release();
88
+ }
89
+ };
90
+ class HandlerLock {
91
+ lock;
92
+ state;
93
+ constructor(lock) {
94
+ this.lock = lock;
95
+ this.state = "held";
96
+ }
97
+ // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately
98
+ yieldHandlerLockForChildRun() {
99
+ if (!this.lock || this.state !== "held") {
100
+ return false;
101
+ }
102
+ this.state = "yielded";
103
+ this.lock.release();
104
+ return true;
105
+ }
106
+ // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed
107
+ async reclaimHandlerLockIfRunning() {
108
+ if (!this.lock || this.state !== "yielded") {
109
+ return false;
110
+ }
111
+ await this.lock.acquire();
112
+ if (this.state !== "yielded") {
113
+ this.lock.release();
114
+ return false;
115
+ }
116
+ this.state = "held";
117
+ return true;
118
+ }
119
+ // used by EventResult.runHandler to exit the handler lock after the handler has finished executing
120
+ exitHandlerRun() {
121
+ if (this.state === "closed") {
122
+ return;
123
+ }
124
+ const should_release = !!this.lock && this.state === "held";
125
+ this.state = "closed";
126
+ if (should_release) {
127
+ this.lock.release();
128
+ }
129
+ }
130
+ // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed
131
+ async runQueueJump(fn) {
132
+ const yielded = this.yieldHandlerLockForChildRun();
133
+ try {
134
+ return await fn();
135
+ } finally {
136
+ if (yielded) {
137
+ await this.reclaimHandlerLockIfRunning();
138
+ }
139
+ }
140
+ }
141
+ }
142
+ class LockManager {
143
+ bus;
144
+ // Live bus reference; used to read defaults and idle state.
145
+ auto_schedule_idle_checks;
146
+ bus_event_lock;
147
+ // Per-bus event lock; created with LockManager and never swapped.
148
+ pause_depth;
149
+ // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.
150
+ pause_waiters;
151
+ // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.
152
+ active_handler_results;
153
+ // Stack of active handler results for "inside handler" detection.
154
+ idle_waiters;
155
+ // Resolvers waiting for stable idle; cleared when idle confirmed.
156
+ idle_check_pending;
157
+ // Debounce flag to avoid scheduling redundant idle checks.
158
+ idle_check_streak;
159
+ // Counts consecutive idle checks; used to require two ticks of idle.
160
+ constructor(bus, options = {}) {
161
+ this.bus = bus;
162
+ this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true;
163
+ this.bus_event_lock = new AsyncLock(1);
164
+ this.pause_depth = 0;
165
+ this.pause_waiters = [];
166
+ this.active_handler_results = [];
167
+ this.idle_waiters = [];
168
+ this.idle_check_pending = false;
169
+ this.idle_check_streak = 0;
170
+ }
171
+ // Low-level runloop pause: increments a re-entrant counter and returns a release
172
+ // function. Used for broad, bus-scoped pauses during queue-jump across buses.
173
+ _requestRunloopPause() {
174
+ this.pause_depth += 1;
175
+ let released = false;
176
+ return () => {
177
+ if (released) {
178
+ return;
179
+ }
180
+ released = true;
181
+ this.pause_depth = Math.max(0, this.pause_depth - 1);
182
+ if (this.pause_depth !== 0) {
183
+ return;
184
+ }
185
+ const waiters = this.pause_waiters;
186
+ this.pause_waiters = [];
187
+ for (const resolve of waiters) {
188
+ resolve();
189
+ }
190
+ };
191
+ }
192
+ _waitUntilRunloopResumed() {
193
+ if (this.pause_depth === 0) {
194
+ return Promise.resolve();
195
+ }
196
+ return new Promise((resolve) => {
197
+ this.pause_waiters.push(resolve);
198
+ });
199
+ }
200
+ _isPaused() {
201
+ return this.pause_depth > 0;
202
+ }
203
+ async _runWithHandlerDispatchContext(result, fn) {
204
+ this.active_handler_results.push(result);
205
+ try {
206
+ return await fn();
207
+ } finally {
208
+ const idx = this.active_handler_results.indexOf(result);
209
+ if (idx >= 0) {
210
+ this.active_handler_results.splice(idx, 1);
211
+ }
212
+ }
213
+ }
214
+ _getActiveHandlerResult() {
215
+ return this.active_handler_results[this.active_handler_results.length - 1];
216
+ }
217
+ _getActiveHandlerResults() {
218
+ return [...this.active_handler_results];
219
+ }
220
+ // Per-bus check: true only if this specific bus has a handler on its stack.
221
+ // For cross-bus queue-jumping, EventBus._processEventImmediately uses getParentEventResultAcrossAllBuses()
222
+ // to walk up the parent event tree, and the bus proxy passes handler_result
223
+ // to _processEventImmediately so it can yield/reacquire the correct lock.
224
+ _isAnyHandlerActive() {
225
+ return this.active_handler_results.length > 0;
226
+ }
227
+ waitForIdle(timeout_seconds = null) {
228
+ return new Promise((resolve) => {
229
+ let done = false;
230
+ let timeout_id = null;
231
+ const finish = (became_idle) => {
232
+ if (done) {
233
+ return;
234
+ }
235
+ done = true;
236
+ if (timeout_id !== null) {
237
+ clearTimeout(timeout_id);
238
+ timeout_id = null;
239
+ }
240
+ resolve(became_idle);
241
+ };
242
+ this.idle_waiters.push(finish);
243
+ this.scheduleIdleCheck();
244
+ if (timeout_seconds === null || timeout_seconds === void 0) {
245
+ return;
246
+ }
247
+ const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1e3;
248
+ if (!Number.isFinite(timeout_ms)) {
249
+ return;
250
+ }
251
+ timeout_id = setTimeout(() => {
252
+ const index = this.idle_waiters.indexOf(finish);
253
+ if (index >= 0) {
254
+ this.idle_waiters.splice(index, 1);
255
+ }
256
+ finish(false);
257
+ }, timeout_ms);
258
+ });
259
+ }
260
+ // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify
261
+ // waitUntilIdle() callers that the bus may now be idle.
262
+ _notifyIdleListeners() {
263
+ if (this.idle_waiters.length === 0) {
264
+ this.idle_check_streak = 0;
265
+ return;
266
+ }
267
+ if (!this.bus.isIdleAndQueueEmpty()) {
268
+ this.idle_check_streak = 0;
269
+ if (this.idle_waiters.length > 0) {
270
+ this.scheduleIdleCheck();
271
+ }
272
+ return;
273
+ }
274
+ this.idle_check_streak += 1;
275
+ if (this.idle_check_streak < 2) {
276
+ if (this.idle_waiters.length > 0) {
277
+ this.scheduleIdleCheck();
278
+ }
279
+ return;
280
+ }
281
+ this.idle_check_streak = 0;
282
+ const waiters = this.idle_waiters;
283
+ this.idle_waiters = [];
284
+ for (const resolve of waiters) {
285
+ resolve(true);
286
+ }
287
+ }
288
+ // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus
289
+ getLockForEvent(event) {
290
+ const resolved = event.event_concurrency ?? this.bus.event_concurrency;
291
+ if (resolved === "parallel") {
292
+ return null;
293
+ }
294
+ if (resolved === "global-serial") {
295
+ return this.bus._lock_for_event_global_serial;
296
+ }
297
+ return this.bus_event_lock;
298
+ }
299
+ async _runWithEventLock(event, fn, options = {}) {
300
+ const pre_acquired = options.pre_acquired_lock ?? null;
301
+ if (options.bypass_event_locks || pre_acquired) {
302
+ return await fn();
303
+ }
304
+ return await runWithLock(this.getLockForEvent(event), fn);
305
+ }
306
+ async _runWithHandlerLock(event, default_handler_concurrency, fn) {
307
+ const lock = event._getHandlerLock(default_handler_concurrency);
308
+ if (lock) {
309
+ await lock.acquire();
310
+ }
311
+ const handler_lock = lock ? new HandlerLock(lock) : null;
312
+ try {
313
+ return await fn(handler_lock);
314
+ } finally {
315
+ handler_lock?.exitHandlerRun();
316
+ }
317
+ }
318
+ // Schedules a debounced idle check to run after a short delay. Used to gate
319
+ // waitUntilIdle() calls during handler execution and after event completion.
320
+ scheduleIdleCheck() {
321
+ if (!this.auto_schedule_idle_checks) {
322
+ return;
323
+ }
324
+ if (this.idle_check_pending) {
325
+ return;
326
+ }
327
+ this.idle_check_pending = true;
328
+ setTimeout(() => {
329
+ this.idle_check_pending = false;
330
+ this._notifyIdleListeners();
331
+ }, 0);
332
+ }
333
+ // Reset all state to initial values
334
+ clear() {
335
+ this.pause_depth = 0;
336
+ this.pause_waiters = [];
337
+ this.active_handler_results = [];
338
+ this.idle_waiters = [];
339
+ this.idle_check_pending = false;
340
+ this.idle_check_streak = 0;
341
+ }
342
+ }
343
+ //# sourceMappingURL=lock_manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lock_manager.ts"],
4
+ "sourcesContent": ["import type { BaseEvent } from './base_event.js'\nimport type { EventResult } from './event_result.js'\n\n// \u2500\u2500\u2500 Deferred / withResolvers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type Deferred<T> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (reason?: unknown) => void\n}\n\nexport const withResolvers = <T>(): Deferred<T> => {\n if (typeof Promise.withResolvers === 'function') {\n return Promise.withResolvers<T>()\n }\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (reason?: unknown) => void\n const promise = new Promise<T>((resolve_fn, reject_fn) => {\n resolve = resolve_fn\n reject = reject_fn\n })\n return { promise, resolve, reject }\n}\n\n// \u2500\u2500\u2500 Concurrency modes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const EVENT_CONCURRENCY_MODES = ['global-serial', 'bus-serial', 'parallel'] as const\nexport type EventConcurrencyMode = (typeof EVENT_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_CONCURRENCY_MODES = ['serial', 'parallel'] as const\nexport type EventHandlerConcurrencyMode = (typeof EVENT_HANDLER_CONCURRENCY_MODES)[number]\n\nexport const EVENT_HANDLER_COMPLETION_MODES = ['all', 'first'] as const\nexport type EventHandlerCompletionMode = (typeof EVENT_HANDLER_COMPLETION_MODES)[number]\n\n// \u2500\u2500\u2500 AsyncLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class AsyncLock {\n size: number\n in_use: number\n waiters: Array<() => void>\n\n constructor(size: number) {\n this.size = size\n this.in_use = 0\n this.waiters = []\n }\n\n async acquire(): Promise<void> {\n if (this.size === Infinity) {\n return\n }\n if (this.in_use < this.size) {\n this.in_use += 1\n return\n }\n await new Promise<void>((resolve) => {\n this.waiters.push(resolve)\n })\n }\n\n release(): void {\n if (this.size === Infinity) {\n return\n }\n const next = this.waiters.shift()\n if (next) {\n // Handoff: keep permit accounted for and transfer directly to next waiter.\n next()\n return\n }\n this.in_use = Math.max(0, this.in_use - 1)\n }\n}\n\nexport const runWithLock = async <T>(lock: AsyncLock | null, fn: () => Promise<T>): Promise<T> => {\n if (!lock) {\n return await fn()\n }\n await lock.acquire()\n try {\n return await fn()\n } finally {\n lock.release()\n }\n}\n\n// \u2500\u2500\u2500 HandlerLock \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type HandlerExecutionState = 'held' | 'yielded' | 'closed'\n\n// Tracks a single handler execution's ownership of a handler lock.\n// Reacquire is race-safe: if the handler exits while waiting to reclaim,\n// the reclaimed lock is immediately released to avoid leaks.\nexport class HandlerLock {\n private lock: AsyncLock | null\n private state: HandlerExecutionState\n\n constructor(lock: AsyncLock | null) {\n this.lock = lock\n this.state = 'held'\n }\n\n // used by EventBus._processEventImmediately to yield the parent handler's lock to the child event so it can be processed immediately\n yieldHandlerLockForChildRun(): boolean {\n if (!this.lock || this.state !== 'held') {\n return false\n }\n this.state = 'yielded'\n this.lock.release()\n return true\n }\n\n // used by EventBus._processEventImmediately to reacquire the handler lock after the child event has been processed\n async reclaimHandlerLockIfRunning(): Promise<boolean> {\n if (!this.lock || this.state !== 'yielded') {\n return false\n }\n await this.lock.acquire()\n if (this.state !== 'yielded') {\n // Handler exited while this reacquire was pending.\n this.lock.release()\n return false\n }\n this.state = 'held'\n return true\n }\n\n // used by EventResult.runHandler to exit the handler lock after the handler has finished executing\n exitHandlerRun(): void {\n if (this.state === 'closed') {\n return\n }\n const should_release = !!this.lock && this.state === 'held'\n this.state = 'closed'\n if (should_release) {\n this.lock!.release()\n }\n }\n\n // used by EventBus._processEventImmediately to yield the handler lock and reacquire it after the child event has been processed\n async runQueueJump<T>(fn: () => Promise<T>): Promise<T> {\n const yielded = this.yieldHandlerLockForChildRun()\n try {\n return await fn()\n } finally {\n if (yielded) {\n await this.reclaimHandlerLockIfRunning()\n }\n }\n }\n}\n\n// \u2500\u2500\u2500 LockManager \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// Interface that must be implemented by the EventBus class to be used by the LockManager\nexport type EventBusInterfaceForLockManager = {\n isIdleAndQueueEmpty: () => boolean\n event_concurrency: EventConcurrencyMode\n _lock_for_event_global_serial: AsyncLock\n}\n\nexport type LockManagerOptions = {\n auto_schedule_idle_checks?: boolean\n}\n\n// The LockManager is responsible for managing the concurrency of events and handlers\nexport class LockManager {\n private bus: EventBusInterfaceForLockManager // Live bus reference; used to read defaults and idle state.\n private auto_schedule_idle_checks: boolean\n\n readonly bus_event_lock: AsyncLock // Per-bus event lock; created with LockManager and never swapped.\n private pause_depth: number // Re-entrant pause counter; increments on _requestRunloopPause, decrements on release.\n private pause_waiters: Array<() => void> // Resolvers for _waitUntilRunloopResumed; drained when pause_depth hits 0.\n private active_handler_results: EventResult[] // Stack of active handler results for \"inside handler\" detection.\n\n private idle_waiters: Array<(became_idle: boolean) => void> // Resolvers waiting for stable idle; cleared when idle confirmed.\n private idle_check_pending: boolean // Debounce flag to avoid scheduling redundant idle checks.\n private idle_check_streak: number // Counts consecutive idle checks; used to require two ticks of idle.\n\n constructor(bus: EventBusInterfaceForLockManager, options: LockManagerOptions = {}) {\n this.bus = bus\n this.auto_schedule_idle_checks = options.auto_schedule_idle_checks ?? true\n this.bus_event_lock = new AsyncLock(1) // used for the bus-serial concurrency mode\n\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n\n // Low-level runloop pause: increments a re-entrant counter and returns a release\n // function. Used for broad, bus-scoped pauses during queue-jump across buses.\n _requestRunloopPause(): () => void {\n this.pause_depth += 1\n let released = false\n return () => {\n if (released) {\n return\n }\n released = true\n this.pause_depth = Math.max(0, this.pause_depth - 1)\n if (this.pause_depth !== 0) {\n return\n }\n const waiters = this.pause_waiters\n this.pause_waiters = []\n for (const resolve of waiters) {\n resolve()\n }\n }\n }\n\n _waitUntilRunloopResumed(): Promise<void> {\n if (this.pause_depth === 0) {\n return Promise.resolve()\n }\n return new Promise((resolve) => {\n this.pause_waiters.push(resolve)\n })\n }\n\n _isPaused(): boolean {\n return this.pause_depth > 0\n }\n\n async _runWithHandlerDispatchContext<T>(result: EventResult, fn: () => Promise<T>): Promise<T> {\n this.active_handler_results.push(result)\n try {\n return await fn()\n } finally {\n const idx = this.active_handler_results.indexOf(result)\n if (idx >= 0) {\n this.active_handler_results.splice(idx, 1)\n }\n }\n }\n\n _getActiveHandlerResult(): EventResult | undefined {\n return this.active_handler_results[this.active_handler_results.length - 1]\n }\n\n _getActiveHandlerResults(): EventResult[] {\n return [...this.active_handler_results]\n }\n\n // Per-bus check: true only if this specific bus has a handler on its stack.\n // For cross-bus queue-jumping, EventBus._processEventImmediately uses getParentEventResultAcrossAllBuses()\n // to walk up the parent event tree, and the bus proxy passes handler_result\n // to _processEventImmediately so it can yield/reacquire the correct lock.\n _isAnyHandlerActive(): boolean {\n return this.active_handler_results.length > 0\n }\n\n waitForIdle(timeout_seconds: number | null = null): Promise<boolean> {\n return new Promise((resolve) => {\n let done = false\n let timeout_id: ReturnType<typeof setTimeout> | null = null\n\n const finish = (became_idle: boolean): void => {\n if (done) {\n return\n }\n done = true\n if (timeout_id !== null) {\n clearTimeout(timeout_id)\n timeout_id = null\n }\n resolve(became_idle)\n }\n\n this.idle_waiters.push(finish)\n this.scheduleIdleCheck()\n\n if (timeout_seconds === null || timeout_seconds === undefined) {\n return\n }\n\n const timeout_ms = Math.max(0, Number(timeout_seconds)) * 1000\n if (!Number.isFinite(timeout_ms)) {\n return\n }\n\n timeout_id = setTimeout(() => {\n const index = this.idle_waiters.indexOf(finish)\n if (index >= 0) {\n this.idle_waiters.splice(index, 1)\n }\n finish(false)\n }, timeout_ms)\n })\n }\n\n // Called by EventBus.markEventCompleted and EventBus.markHandlerCompleted to notify\n // waitUntilIdle() callers that the bus may now be idle.\n _notifyIdleListeners(): void {\n // Fast-path: most completions have no waitUntilIdle() callers waiting,\n // so skip expensive idle snapshot scans in that common case.\n if (this.idle_waiters.length === 0) {\n this.idle_check_streak = 0\n return\n }\n\n if (!this.bus.isIdleAndQueueEmpty()) {\n this.idle_check_streak = 0\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak += 1\n if (this.idle_check_streak < 2) {\n if (this.idle_waiters.length > 0) {\n this.scheduleIdleCheck()\n }\n return\n }\n\n this.idle_check_streak = 0\n const waiters = this.idle_waiters\n this.idle_waiters = []\n for (const resolve of waiters) {\n resolve(true)\n }\n }\n\n // get the bus-level lock that prevents/allows multiple events to be processed concurrently on the same bus\n getLockForEvent(event: BaseEvent): AsyncLock | null {\n const resolved = event.event_concurrency ?? this.bus.event_concurrency\n if (resolved === 'parallel') {\n return null\n }\n if (resolved === 'global-serial') {\n return this.bus._lock_for_event_global_serial\n }\n return this.bus_event_lock\n }\n\n async _runWithEventLock<T>(\n event: BaseEvent,\n fn: () => Promise<T>,\n options: { bypass_event_locks?: boolean; pre_acquired_lock?: AsyncLock | null } = {}\n ): Promise<T> {\n const pre_acquired = options.pre_acquired_lock ?? null\n if (options.bypass_event_locks || pre_acquired) {\n return await fn()\n }\n return await runWithLock(this.getLockForEvent(event), fn)\n }\n\n async _runWithHandlerLock<T>(\n event: BaseEvent,\n default_handler_concurrency: EventHandlerConcurrencyMode | undefined,\n fn: (lock: HandlerLock | null) => Promise<T>\n ): Promise<T> {\n const lock = event._getHandlerLock(default_handler_concurrency)\n if (lock) {\n await lock.acquire()\n }\n const handler_lock = lock ? new HandlerLock(lock) : null\n try {\n return await fn(handler_lock)\n } finally {\n handler_lock?.exitHandlerRun()\n }\n }\n\n // Schedules a debounced idle check to run after a short delay. Used to gate\n // waitUntilIdle() calls during handler execution and after event completion.\n private scheduleIdleCheck(): void {\n if (!this.auto_schedule_idle_checks) {\n return\n }\n if (this.idle_check_pending) {\n return\n }\n this.idle_check_pending = true\n setTimeout(() => {\n this.idle_check_pending = false\n this._notifyIdleListeners()\n }, 0)\n }\n\n // Reset all state to initial values\n clear(): void {\n this.pause_depth = 0\n this.pause_waiters = []\n this.active_handler_results = []\n this.idle_waiters = []\n this.idle_check_pending = false\n this.idle_check_streak = 0\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ import { BaseEvent } from './base_event.js';
2
+ import { EventResult } from './event_result.js';
3
+ type LogTreeBus = {
4
+ name: string;
5
+ event_history: {
6
+ values(): IterableIterator<BaseEvent>;
7
+ has(event_id: string): boolean;
8
+ };
9
+ toString?: () => string;
10
+ };
11
+ export declare const logTree: (bus: LogTreeBus) => string;
12
+ export declare const buildTreeLine: (event: BaseEvent, indent: string, is_last: boolean, parent_to_children: Map<string, BaseEvent[]>, visited: Set<string>) => string;
13
+ export declare const buildResultLine: (result: EventResult, indent: string, is_last: boolean, parent_to_children: Map<string, BaseEvent[]>, visited: Set<string>) => string;
14
+ export declare const formatTimestamp: (value?: string) => string;
15
+ export declare const formatResultValue: (value: unknown) => string;
16
+ export {};