joopjs 2.0.0

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 (259) hide show
  1. package/CHANGELOG.md +678 -0
  2. package/README.md +583 -0
  3. package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
  4. package/dist/a11y.service-CauEJrJe.d.ts +143 -0
  5. package/dist/adapters-B6slG6hQ.d.mts +84 -0
  6. package/dist/adapters-B6slG6hQ.d.ts +84 -0
  7. package/dist/aes.service-CkoupAww.d.mts +95 -0
  8. package/dist/aes.service-CkoupAww.d.ts +95 -0
  9. package/dist/ai/index.d.mts +99 -0
  10. package/dist/ai/index.d.ts +99 -0
  11. package/dist/ai/index.js +307 -0
  12. package/dist/ai/index.js.map +1 -0
  13. package/dist/ai/index.mjs +304 -0
  14. package/dist/ai/index.mjs.map +1 -0
  15. package/dist/analytics/index.d.mts +42 -0
  16. package/dist/analytics/index.d.ts +42 -0
  17. package/dist/analytics/index.js +139 -0
  18. package/dist/analytics/index.js.map +1 -0
  19. package/dist/analytics/index.mjs +136 -0
  20. package/dist/analytics/index.mjs.map +1 -0
  21. package/dist/angular/index.d.mts +148 -0
  22. package/dist/angular/index.d.ts +148 -0
  23. package/dist/angular/index.js +122 -0
  24. package/dist/angular/index.js.map +1 -0
  25. package/dist/angular/index.mjs +101 -0
  26. package/dist/angular/index.mjs.map +1 -0
  27. package/dist/api/index.d.mts +128 -0
  28. package/dist/api/index.d.ts +128 -0
  29. package/dist/api/index.js +1358 -0
  30. package/dist/api/index.js.map +1 -0
  31. package/dist/api/index.mjs +1332 -0
  32. package/dist/api/index.mjs.map +1 -0
  33. package/dist/auth/index.d.mts +105 -0
  34. package/dist/auth/index.d.ts +105 -0
  35. package/dist/auth/index.js +989 -0
  36. package/dist/auth/index.js.map +1 -0
  37. package/dist/auth/index.mjs +979 -0
  38. package/dist/auth/index.mjs.map +1 -0
  39. package/dist/auth.service-DNVB-L4U.d.mts +16 -0
  40. package/dist/auth.service-PjUUSUIt.d.ts +16 -0
  41. package/dist/banking/index.d.mts +1530 -0
  42. package/dist/banking/index.d.ts +1530 -0
  43. package/dist/banking/index.js +4739 -0
  44. package/dist/banking/index.js.map +1 -0
  45. package/dist/banking/index.mjs +4661 -0
  46. package/dist/banking/index.mjs.map +1 -0
  47. package/dist/cache/index.d.mts +40 -0
  48. package/dist/cache/index.d.ts +40 -0
  49. package/dist/cache/index.js +174 -0
  50. package/dist/cache/index.js.map +1 -0
  51. package/dist/cache/index.mjs +172 -0
  52. package/dist/cache/index.mjs.map +1 -0
  53. package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
  54. package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
  55. package/dist/config.models-Cqg04fAQ.d.mts +84 -0
  56. package/dist/config.models-Cqg04fAQ.d.ts +84 -0
  57. package/dist/config.service-CrCvI-JS.d.ts +31 -0
  58. package/dist/config.service-Cz4QQLlf.d.mts +31 -0
  59. package/dist/core/index.d.mts +4 -0
  60. package/dist/core/index.d.ts +4 -0
  61. package/dist/core/index.js +631 -0
  62. package/dist/core/index.js.map +1 -0
  63. package/dist/core/index.mjs +619 -0
  64. package/dist/core/index.mjs.map +1 -0
  65. package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
  66. package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
  67. package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
  68. package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
  69. package/dist/deeplink/index.d.mts +39 -0
  70. package/dist/deeplink/index.d.ts +39 -0
  71. package/dist/deeplink/index.js +268 -0
  72. package/dist/deeplink/index.js.map +1 -0
  73. package/dist/deeplink/index.mjs +265 -0
  74. package/dist/deeplink/index.mjs.map +1 -0
  75. package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
  76. package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
  77. package/dist/dev/index.d.mts +20 -0
  78. package/dist/dev/index.d.ts +20 -0
  79. package/dist/dev/index.js +51 -0
  80. package/dist/dev/index.js.map +1 -0
  81. package/dist/dev/index.mjs +49 -0
  82. package/dist/dev/index.mjs.map +1 -0
  83. package/dist/device/index.d.mts +108 -0
  84. package/dist/device/index.d.ts +108 -0
  85. package/dist/device/index.js +960 -0
  86. package/dist/device/index.js.map +1 -0
  87. package/dist/device/index.mjs +951 -0
  88. package/dist/device/index.mjs.map +1 -0
  89. package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
  90. package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
  91. package/dist/encryption/index.d.mts +75 -0
  92. package/dist/encryption/index.d.ts +75 -0
  93. package/dist/encryption/index.js +605 -0
  94. package/dist/encryption/index.js.map +1 -0
  95. package/dist/encryption/index.mjs +598 -0
  96. package/dist/encryption/index.mjs.map +1 -0
  97. package/dist/form-validator-3tkmzr_o.d.mts +72 -0
  98. package/dist/form-validator-3tkmzr_o.d.ts +72 -0
  99. package/dist/forms/index.d.mts +59 -0
  100. package/dist/forms/index.d.ts +59 -0
  101. package/dist/forms/index.js +446 -0
  102. package/dist/forms/index.js.map +1 -0
  103. package/dist/forms/index.mjs +442 -0
  104. package/dist/forms/index.mjs.map +1 -0
  105. package/dist/i18n/index.d.mts +37 -0
  106. package/dist/i18n/index.d.ts +37 -0
  107. package/dist/i18n/index.js +147 -0
  108. package/dist/i18n/index.js.map +1 -0
  109. package/dist/i18n/index.mjs +145 -0
  110. package/dist/i18n/index.mjs.map +1 -0
  111. package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
  112. package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
  113. package/dist/index-B_ksKpS1.d.mts +202 -0
  114. package/dist/index-CqDKWTUP.d.mts +28 -0
  115. package/dist/index-CqDKWTUP.d.ts +28 -0
  116. package/dist/index-DFqEoX_l.d.ts +202 -0
  117. package/dist/index-Dz0gOur2.d.mts +36 -0
  118. package/dist/index-Dz0gOur2.d.ts +36 -0
  119. package/dist/index.d.mts +1336 -0
  120. package/dist/index.d.ts +1336 -0
  121. package/dist/index.js +19464 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/index.mjs +19155 -0
  124. package/dist/index.mjs.map +1 -0
  125. package/dist/india/index.d.mts +75 -0
  126. package/dist/india/index.d.ts +75 -0
  127. package/dist/india/index.js +325 -0
  128. package/dist/india/index.js.map +1 -0
  129. package/dist/india/index.mjs +303 -0
  130. package/dist/india/index.mjs.map +1 -0
  131. package/dist/joop-Bx7Iwj5p.d.mts +155 -0
  132. package/dist/joop-CA3DMeOO.d.ts +155 -0
  133. package/dist/native-bridge/index.d.mts +27 -0
  134. package/dist/native-bridge/index.d.ts +27 -0
  135. package/dist/native-bridge/index.js +98 -0
  136. package/dist/native-bridge/index.js.map +1 -0
  137. package/dist/native-bridge/index.mjs +96 -0
  138. package/dist/native-bridge/index.mjs.map +1 -0
  139. package/dist/network/index.d.mts +85 -0
  140. package/dist/network/index.d.ts +85 -0
  141. package/dist/network/index.js +454 -0
  142. package/dist/network/index.js.map +1 -0
  143. package/dist/network/index.mjs +451 -0
  144. package/dist/network/index.mjs.map +1 -0
  145. package/dist/network-monitor-BIwPSXme.d.mts +179 -0
  146. package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
  147. package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
  148. package/dist/notification.service-tEMKatWJ.d.ts +25 -0
  149. package/dist/observability/index.d.mts +179 -0
  150. package/dist/observability/index.d.ts +179 -0
  151. package/dist/observability/index.js +559 -0
  152. package/dist/observability/index.js.map +1 -0
  153. package/dist/observability/index.mjs +552 -0
  154. package/dist/observability/index.mjs.map +1 -0
  155. package/dist/oidc-client-DIJcClmB.d.mts +190 -0
  156. package/dist/oidc-client-DxhyE59t.d.ts +190 -0
  157. package/dist/platform/index.d.mts +73 -0
  158. package/dist/platform/index.d.ts +73 -0
  159. package/dist/platform/index.js +127 -0
  160. package/dist/platform/index.js.map +1 -0
  161. package/dist/platform/index.mjs +125 -0
  162. package/dist/platform/index.mjs.map +1 -0
  163. package/dist/pwa/index.d.mts +31 -0
  164. package/dist/pwa/index.d.ts +31 -0
  165. package/dist/pwa/index.js +247 -0
  166. package/dist/pwa/index.js.map +1 -0
  167. package/dist/pwa/index.mjs +244 -0
  168. package/dist/pwa/index.mjs.map +1 -0
  169. package/dist/react/index.d.mts +133 -0
  170. package/dist/react/index.d.ts +133 -0
  171. package/dist/react/index.js +632 -0
  172. package/dist/react/index.js.map +1 -0
  173. package/dist/react/index.mjs +630 -0
  174. package/dist/react/index.mjs.map +1 -0
  175. package/dist/router/index.d.mts +39 -0
  176. package/dist/router/index.d.ts +39 -0
  177. package/dist/router/index.js +168 -0
  178. package/dist/router/index.js.map +1 -0
  179. package/dist/router/index.mjs +166 -0
  180. package/dist/router/index.mjs.map +1 -0
  181. package/dist/security/index.d.mts +206 -0
  182. package/dist/security/index.d.ts +206 -0
  183. package/dist/security/index.js +1297 -0
  184. package/dist/security/index.js.map +1 -0
  185. package/dist/security/index.mjs +1285 -0
  186. package/dist/security/index.mjs.map +1 -0
  187. package/dist/session/index.d.mts +115 -0
  188. package/dist/session/index.d.ts +115 -0
  189. package/dist/session/index.js +297 -0
  190. package/dist/session/index.js.map +1 -0
  191. package/dist/session/index.mjs +292 -0
  192. package/dist/session/index.mjs.map +1 -0
  193. package/dist/state/index.d.mts +43 -0
  194. package/dist/state/index.d.ts +43 -0
  195. package/dist/state/index.js +156 -0
  196. package/dist/state/index.js.map +1 -0
  197. package/dist/state/index.mjs +152 -0
  198. package/dist/state/index.mjs.map +1 -0
  199. package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
  200. package/dist/statement-parser-C2qNmb49.d.mts +260 -0
  201. package/dist/storage/index.d.mts +40 -0
  202. package/dist/storage/index.d.ts +40 -0
  203. package/dist/storage/index.js +256 -0
  204. package/dist/storage/index.js.map +1 -0
  205. package/dist/storage/index.mjs +252 -0
  206. package/dist/storage/index.mjs.map +1 -0
  207. package/dist/sync/index.d.mts +69 -0
  208. package/dist/sync/index.d.ts +69 -0
  209. package/dist/sync/index.js +330 -0
  210. package/dist/sync/index.js.map +1 -0
  211. package/dist/sync/index.mjs +323 -0
  212. package/dist/sync/index.mjs.map +1 -0
  213. package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
  214. package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
  215. package/dist/theme/index.d.mts +53 -0
  216. package/dist/theme/index.d.ts +53 -0
  217. package/dist/theme/index.js +169 -0
  218. package/dist/theme/index.js.map +1 -0
  219. package/dist/theme/index.mjs +167 -0
  220. package/dist/theme/index.mjs.map +1 -0
  221. package/dist/ui/index.d.mts +66 -0
  222. package/dist/ui/index.d.ts +66 -0
  223. package/dist/ui/index.js +811 -0
  224. package/dist/ui/index.js.map +1 -0
  225. package/dist/ui/index.mjs +803 -0
  226. package/dist/ui/index.mjs.map +1 -0
  227. package/dist/utilities/index.d.mts +199 -0
  228. package/dist/utilities/index.d.ts +199 -0
  229. package/dist/utilities/index.js +1991 -0
  230. package/dist/utilities/index.js.map +1 -0
  231. package/dist/utilities/index.mjs +1923 -0
  232. package/dist/utilities/index.mjs.map +1 -0
  233. package/dist/validation/index.d.mts +60 -0
  234. package/dist/validation/index.d.ts +60 -0
  235. package/dist/validation/index.js +460 -0
  236. package/dist/validation/index.js.map +1 -0
  237. package/dist/validation/index.mjs +455 -0
  238. package/dist/validation/index.mjs.map +1 -0
  239. package/dist/vue/index.d.mts +135 -0
  240. package/dist/vue/index.d.ts +135 -0
  241. package/dist/vue/index.js +621 -0
  242. package/dist/vue/index.js.map +1 -0
  243. package/dist/vue/index.mjs +619 -0
  244. package/dist/vue/index.mjs.map +1 -0
  245. package/dist/watermark.service-Detur5tq.d.ts +235 -0
  246. package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
  247. package/dist/workers/index.d.mts +42 -0
  248. package/dist/workers/index.d.ts +42 -0
  249. package/dist/workers/index.js +359 -0
  250. package/dist/workers/index.js.map +1 -0
  251. package/dist/workers/index.mjs +356 -0
  252. package/dist/workers/index.mjs.map +1 -0
  253. package/dist/workflow/index.d.mts +99 -0
  254. package/dist/workflow/index.d.ts +99 -0
  255. package/dist/workflow/index.js +282 -0
  256. package/dist/workflow/index.js.map +1 -0
  257. package/dist/workflow/index.mjs +279 -0
  258. package/dist/workflow/index.mjs.map +1 -0
  259. package/package.json +226 -0
@@ -0,0 +1,356 @@
1
+ // src/platform/platform.ts
2
+ var _webStorage = (store) => ({
3
+ getItem: (k) => store.getItem(k),
4
+ setItem: (k, v) => store.setItem(k, v),
5
+ removeItem: (k) => store.removeItem(k),
6
+ clear: () => store.clear()
7
+ });
8
+ var _MemStorageImpl = class {
9
+ _m = /* @__PURE__ */ new Map();
10
+ getItem(k) {
11
+ return this._m.get(k) ?? null;
12
+ }
13
+ setItem(k, v) {
14
+ this._m.set(k, v);
15
+ }
16
+ removeItem(k) {
17
+ this._m.delete(k);
18
+ }
19
+ clear() {
20
+ this._m.clear();
21
+ }
22
+ };
23
+ function _detect() {
24
+ if (typeof navigator !== "undefined" && navigator.product === "ReactNative") return "react-native";
25
+ const _proc = globalThis["process"];
26
+ if (typeof window === "undefined" && _proc?.versions?.node) return "node";
27
+ if (typeof window !== "undefined") return "web";
28
+ return "unknown";
29
+ }
30
+ var JoopPlatform = class {
31
+ static _type = _detect();
32
+ static _adapter = {};
33
+ static _memStorage = null;
34
+ /**
35
+ * Call once at app startup to configure adapters for your platform.
36
+ *
37
+ * Web (default — no call needed):
38
+ * JoopPlatform.init();
39
+ *
40
+ * React Native with react-native-mmkv:
41
+ * import { MMKV } from 'react-native-mmkv';
42
+ * const mmkv = new MMKV();
43
+ * JoopPlatform.init({ adapter: { storage: mmkv } });
44
+ *
45
+ * React Native with custom compression (fflate):
46
+ * import { gzip, ungzip } from 'fflate';
47
+ * JoopPlatform.init({
48
+ * adapter: {
49
+ * compression: {
50
+ * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),
51
+ * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),
52
+ * },
53
+ * },
54
+ * });
55
+ */
56
+ static init(config = {}) {
57
+ if (config.platform) this._type = config.platform;
58
+ this._adapter = { ...this._adapter, ...config.adapter ?? {} };
59
+ }
60
+ /** Current detected or overridden platform type */
61
+ static get type() {
62
+ return this._type;
63
+ }
64
+ static is(type) {
65
+ return this._type === type;
66
+ }
67
+ static isMobile() {
68
+ return this._type === "react-native";
69
+ }
70
+ static isWeb() {
71
+ return this._type === "web";
72
+ }
73
+ static isNode() {
74
+ return this._type === "node";
75
+ }
76
+ /** Raw adapter config registered via init() */
77
+ static getAdapter() {
78
+ return this._adapter;
79
+ }
80
+ /**
81
+ * Returns the best available storage adapter:
82
+ * 1. Custom adapter registered via init()
83
+ * 2. localStorage (web)
84
+ * 3. In-memory fallback (Node / RN without adapter)
85
+ */
86
+ static getStorage() {
87
+ if (this._adapter.storage) return this._adapter.storage;
88
+ if (typeof localStorage !== "undefined") return _webStorage(localStorage);
89
+ if (!this._memStorage) this._memStorage = new _MemStorageImpl();
90
+ return this._memStorage;
91
+ }
92
+ /**
93
+ * Returns the best available session-scoped storage:
94
+ * 1. Custom adapter registered via init()
95
+ * 2. sessionStorage (web)
96
+ * 3. Shared in-memory fallback
97
+ */
98
+ static getSessionStorage() {
99
+ if (this._adapter.storage) return this._adapter.storage;
100
+ if (typeof sessionStorage !== "undefined") return _webStorage(sessionStorage);
101
+ if (!this._memStorage) this._memStorage = new _MemStorageImpl();
102
+ return this._memStorage;
103
+ }
104
+ /** What APIs are available in the current environment */
105
+ static capabilities() {
106
+ return {
107
+ compression: typeof CompressionStream !== "undefined" || !!this._adapter.compression,
108
+ workers: typeof Worker !== "undefined" || !!this._adapter.worker,
109
+ cryptoSubtle: !!(typeof globalThis !== "undefined" && globalThis.crypto?.subtle),
110
+ persistentStorage: typeof localStorage !== "undefined" || !!this._adapter.storage,
111
+ dom: typeof document !== "undefined",
112
+ serviceWorker: typeof navigator !== "undefined" && "serviceWorker" in navigator
113
+ };
114
+ }
115
+ /** Reset to auto-detected defaults — useful between tests */
116
+ static _reset() {
117
+ this._type = _detect();
118
+ this._adapter = {};
119
+ this._memStorage = null;
120
+ }
121
+ };
122
+
123
+ // src/workers/worker-pool.ts
124
+ var JoopWorkerPool = class {
125
+ _slots = [];
126
+ _queue = [];
127
+ _size;
128
+ _timeout;
129
+ _terminated = false;
130
+ /** True when native Web Workers are unavailable (React Native, Node) */
131
+ _fallback;
132
+ constructor(config = {}) {
133
+ const cores = typeof navigator !== "undefined" ? navigator.hardwareConcurrency ?? 4 : 4;
134
+ this._size = config.size ?? Math.max(1, cores - 1);
135
+ this._timeout = config.timeout ?? 3e4;
136
+ this._fallback = !_workersAvailable();
137
+ if (!this._fallback) this._init();
138
+ }
139
+ get size() {
140
+ return this._size;
141
+ }
142
+ get idle() {
143
+ return this._fallback ? this._size : this._slots.filter((s) => !s.busy).length;
144
+ }
145
+ get queueDepth() {
146
+ return this._queue.length;
147
+ }
148
+ /**
149
+ * Run a serializable function in a worker thread (or main-thread fallback on RN/Node).
150
+ * The fn MUST be a pure, self-contained function (no closures over outer scope).
151
+ */
152
+ run(fn, arg) {
153
+ if (this._terminated) return Promise.reject(new Error("WorkerPool terminated"));
154
+ if (this._fallback) return this._runFallback(fn, arg);
155
+ return new Promise((resolve, reject) => {
156
+ const task = {
157
+ fn: fn.toString(),
158
+ args: [arg],
159
+ resolve,
160
+ reject
161
+ };
162
+ const slot = this._slots.find((s) => !s.busy);
163
+ if (slot) this._runTask(slot, task);
164
+ else this._queue.push(task);
165
+ });
166
+ }
167
+ async map(items, fn) {
168
+ return Promise.all(items.map((item) => this.run(fn, item)));
169
+ }
170
+ terminate() {
171
+ this._terminated = true;
172
+ if (!this._fallback) {
173
+ for (const { worker } of this._slots) worker.terminate();
174
+ this._slots = [];
175
+ }
176
+ for (const task of this._queue) task.reject(new Error("WorkerPool terminated"));
177
+ this._queue = [];
178
+ }
179
+ // ---------------------------------------------------------------------------
180
+ // Fallback: main-thread async execution (React Native / Node)
181
+ // ---------------------------------------------------------------------------
182
+ _runFallback(fn, arg) {
183
+ const adapter = JoopPlatform.getAdapter().worker;
184
+ if (adapter) return adapter.run(fn, arg, this._timeout);
185
+ return new Promise((resolve, reject) => {
186
+ const timer = this._timeout > 0 ? setTimeout(() => reject(new Error("JoopWorkerPool: task timed out")), this._timeout) : null;
187
+ setTimeout(() => {
188
+ try {
189
+ const result = fn(arg);
190
+ if (timer !== null) clearTimeout(timer);
191
+ if (result && typeof result.then === "function") {
192
+ result.then((v) => resolve(v)).catch((e) => reject(e));
193
+ } else {
194
+ resolve(result);
195
+ }
196
+ } catch (e) {
197
+ if (timer !== null) clearTimeout(timer);
198
+ reject(e);
199
+ }
200
+ }, 0);
201
+ });
202
+ }
203
+ // ---------------------------------------------------------------------------
204
+ // Native Web Worker implementation
205
+ // ---------------------------------------------------------------------------
206
+ _init() {
207
+ for (let i = 0; i < this._size; i++) {
208
+ this._slots.push({ worker: this._createWorker(), busy: false });
209
+ }
210
+ }
211
+ _createWorker() {
212
+ const script = `
213
+ self.onmessage = function(e) {
214
+ var id = e.data.id;
215
+ try {
216
+ var fn = new Function('return (' + e.data.fn + ')')();
217
+ var result = fn.apply(null, e.data.args);
218
+ if (result && typeof result.then === 'function') {
219
+ result.then(function(v) { self.postMessage({ id: id, result: v }); })
220
+ .catch(function(err) { self.postMessage({ id: id, error: String(err) }); });
221
+ } else {
222
+ self.postMessage({ id: id, result: result });
223
+ }
224
+ } catch(err) {
225
+ self.postMessage({ id: id, error: String(err) });
226
+ }
227
+ };`;
228
+ const blob = new Blob([script], { type: "application/javascript" });
229
+ const url = URL.createObjectURL(blob);
230
+ const worker = new Worker(url);
231
+ URL.revokeObjectURL(url);
232
+ return worker;
233
+ }
234
+ _runTask(slot, task) {
235
+ slot.busy = true;
236
+ const id = `${Date.now()}_${Math.random()}`;
237
+ if (this._timeout > 0) {
238
+ task.timer = setTimeout(() => {
239
+ slot.worker.terminate();
240
+ slot.worker = this._createWorker();
241
+ slot.busy = false;
242
+ task.reject(new Error("JoopWorkerPool: task timed out"));
243
+ this._drain();
244
+ }, this._timeout);
245
+ }
246
+ const onMessage = (e) => {
247
+ if (e.data?.id !== id) return;
248
+ clearTimeout(task.timer);
249
+ slot.worker.removeEventListener("message", onMessage);
250
+ slot.busy = false;
251
+ if (e.data.error) task.reject(new Error(e.data.error));
252
+ else task.resolve(e.data.result);
253
+ this._drain();
254
+ };
255
+ slot.worker.addEventListener("message", onMessage);
256
+ slot.worker.postMessage({ id, fn: task.fn, args: task.args });
257
+ }
258
+ _drain() {
259
+ if (this._queue.length === 0) return;
260
+ const slot = this._slots.find((s) => !s.busy);
261
+ if (slot) this._runTask(slot, this._queue.shift());
262
+ }
263
+ };
264
+ function _workersAvailable() {
265
+ return typeof Worker !== "undefined" && typeof URL !== "undefined" && typeof Blob !== "undefined" && typeof URL.createObjectURL === "function";
266
+ }
267
+
268
+ // src/workers/compression.service.ts
269
+ var JoopCompressionService = class {
270
+ /** True when compression is available (native API or injected adapter) */
271
+ isSupported() {
272
+ return typeof CompressionStream !== "undefined" || !!JoopPlatform.getAdapter().compression;
273
+ }
274
+ async compress(data, format = "gzip") {
275
+ const input = typeof data === "string" ? new TextEncoder().encode(data) : data;
276
+ const adapter = JoopPlatform.getAdapter().compression;
277
+ if (adapter) return adapter.compress(input, format);
278
+ if (typeof CompressionStream === "undefined") {
279
+ throw new Error(
280
+ "CompressionStream is not available in this environment. Provide a JoopCompressionAdapter via JoopPlatform.init() (e.g. wrap fflate for React Native)."
281
+ );
282
+ }
283
+ return _nativeCompress(input, format);
284
+ }
285
+ async decompress(data, format = "gzip") {
286
+ const adapter = JoopPlatform.getAdapter().compression;
287
+ if (adapter) return adapter.decompress(data, format);
288
+ if (typeof DecompressionStream === "undefined") {
289
+ throw new Error(
290
+ "DecompressionStream is not available in this environment. Provide a JoopCompressionAdapter via JoopPlatform.init()."
291
+ );
292
+ }
293
+ return _nativeDecompress(data, format);
294
+ }
295
+ async compressString(text, format = "gzip") {
296
+ const bytes = await this.compress(text, format);
297
+ return _uint8ToBase64(bytes);
298
+ }
299
+ async decompressString(b64, format = "gzip") {
300
+ const bytes = _base64ToUint8(b64);
301
+ const decompressed = await this.decompress(bytes, format);
302
+ return new TextDecoder().decode(decompressed);
303
+ }
304
+ async ratio(data, format = "gzip") {
305
+ const originalLen = typeof data === "string" ? new TextEncoder().encode(data).length : data.length;
306
+ const compressed = await this.compress(data, format);
307
+ return originalLen ? compressed.length / originalLen : 1;
308
+ }
309
+ };
310
+ async function _nativeCompress(input, format) {
311
+ const cs = new CompressionStream(format);
312
+ const writer = cs.writable.getWriter();
313
+ const reader = cs.readable.getReader();
314
+ writer.write(input);
315
+ writer.close();
316
+ return _readAll(reader);
317
+ }
318
+ async function _nativeDecompress(input, format) {
319
+ const ds = new DecompressionStream(format);
320
+ const writer = ds.writable.getWriter();
321
+ const reader = ds.readable.getReader();
322
+ writer.write(input);
323
+ writer.close();
324
+ return _readAll(reader);
325
+ }
326
+ async function _readAll(reader) {
327
+ const chunks = [];
328
+ while (true) {
329
+ const { done, value } = await reader.read();
330
+ if (done) break;
331
+ chunks.push(value);
332
+ }
333
+ const total = chunks.reduce((s, c) => s + c.length, 0);
334
+ const out = new Uint8Array(total);
335
+ let offset = 0;
336
+ for (const c of chunks) {
337
+ out.set(c, offset);
338
+ offset += c.length;
339
+ }
340
+ return out;
341
+ }
342
+ function _uint8ToBase64(buf) {
343
+ let bin = "";
344
+ for (let i = 0; i < buf.length; i++) bin += String.fromCharCode(buf[i]);
345
+ return btoa(bin);
346
+ }
347
+ function _base64ToUint8(b64) {
348
+ const bin = atob(b64);
349
+ const out = new Uint8Array(bin.length);
350
+ for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
351
+ return out;
352
+ }
353
+
354
+ export { JoopCompressionService, JoopWorkerPool };
355
+ //# sourceMappingURL=index.mjs.map
356
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/platform/platform.ts","../../src/workers/worker-pool.ts","../../src/workers/compression.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { JoopPlatformAdapterConfig, JoopStorageAdapter } from './adapters';\n\nexport type JoopPlatformType = 'web' | 'react-native' | 'node' | 'unknown';\n\nexport interface JoopCapabilities {\n compression: boolean;\n workers: boolean;\n cryptoSubtle: boolean;\n persistentStorage: boolean;\n dom: boolean;\n serviceWorker: boolean;\n}\n\nexport interface JoopPlatformConfig {\n adapter?: JoopPlatformAdapterConfig;\n /** Override auto-detection — useful in tests or SSR */\n platform?: JoopPlatformType;\n}\n\n// ---------------------------------------------------------------------------\n// Built-in storage adapters\n// ---------------------------------------------------------------------------\n\nconst _webStorage = (store: Storage): JoopStorageAdapter => ({\n getItem: (k) => store.getItem(k),\n setItem: (k, v) => store.setItem(k, v),\n removeItem: (k) => store.removeItem(k),\n clear: () => store.clear(),\n});\n\nclass _MemStorageImpl implements JoopStorageAdapter {\n private _m = new Map<string, string>();\n getItem(k: string) { return this._m.get(k) ?? null; }\n setItem(k: string, v: string) { this._m.set(k, v); }\n removeItem(k: string) { this._m.delete(k); }\n clear() { this._m.clear(); }\n}\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction _detect(): JoopPlatformType {\n // React Native sets navigator.product = 'ReactNative'\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') return 'react-native';\n // Node.js: no window, has globalThis.process.versions.node\n const _proc = (globalThis as Record<string, unknown>)['process'] as { versions?: { node?: string } } | undefined;\n if (typeof window === 'undefined' && _proc?.versions?.node) return 'node';\n // Browser\n if (typeof window !== 'undefined') return 'web';\n return 'unknown';\n}\n\n// ---------------------------------------------------------------------------\n// JoopPlatform\n// ---------------------------------------------------------------------------\n\nexport class JoopPlatform {\n private static _type: JoopPlatformType = _detect();\n private static _adapter: JoopPlatformAdapterConfig = {};\n private static _memStorage: JoopStorageAdapter | null = null;\n\n /**\n * Call once at app startup to configure adapters for your platform.\n *\n * Web (default — no call needed):\n * JoopPlatform.init();\n *\n * React Native with react-native-mmkv:\n * import { MMKV } from 'react-native-mmkv';\n * const mmkv = new MMKV();\n * JoopPlatform.init({ adapter: { storage: mmkv } });\n *\n * React Native with custom compression (fflate):\n * import { gzip, ungzip } from 'fflate';\n * JoopPlatform.init({\n * adapter: {\n * compression: {\n * compress: (d, fmt) => new Promise((res, rej) => gzip(d, (e, r) => e ? rej(e) : res(r))),\n * decompress: (d, fmt) => new Promise((res, rej) => ungzip(d, (e, r) => e ? rej(e) : res(r))),\n * },\n * },\n * });\n */\n static init(config: JoopPlatformConfig = {}): void {\n if (config.platform) this._type = config.platform;\n this._adapter = { ...this._adapter, ...(config.adapter ?? {}) };\n }\n\n /** Current detected or overridden platform type */\n static get type(): JoopPlatformType { return this._type; }\n\n static is(type: JoopPlatformType): boolean { return this._type === type; }\n static isMobile(): boolean { return this._type === 'react-native'; }\n static isWeb(): boolean { return this._type === 'web'; }\n static isNode(): boolean { return this._type === 'node'; }\n\n /** Raw adapter config registered via init() */\n static getAdapter(): JoopPlatformAdapterConfig { return this._adapter; }\n\n /**\n * Returns the best available storage adapter:\n * 1. Custom adapter registered via init()\n * 2. localStorage (web)\n * 3. In-memory fallback (Node / RN without adapter)\n */\n static getStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof localStorage !== 'undefined') return _webStorage(localStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /**\n * Returns the best available session-scoped storage:\n * 1. Custom adapter registered via init()\n * 2. sessionStorage (web)\n * 3. Shared in-memory fallback\n */\n static getSessionStorage(): JoopStorageAdapter {\n if (this._adapter.storage) return this._adapter.storage;\n if (typeof sessionStorage !== 'undefined') return _webStorage(sessionStorage);\n if (!this._memStorage) this._memStorage = new _MemStorageImpl();\n return this._memStorage;\n }\n\n /** What APIs are available in the current environment */\n static capabilities(): JoopCapabilities {\n return {\n compression: typeof CompressionStream !== 'undefined' || !!this._adapter.compression,\n workers: typeof Worker !== 'undefined' || !!this._adapter.worker,\n cryptoSubtle: !!(typeof globalThis !== 'undefined' && (globalThis as typeof globalThis & { crypto?: Crypto }).crypto?.subtle),\n persistentStorage: typeof localStorage !== 'undefined' || !!this._adapter.storage,\n dom: typeof document !== 'undefined',\n serviceWorker: typeof navigator !== 'undefined' && 'serviceWorker' in navigator,\n };\n }\n\n /** Reset to auto-detected defaults — useful between tests */\n static _reset(): void {\n this._type = _detect();\n this._adapter = {};\n this._memStorage = null;\n }\n}\n","import { JoopPlatform } from '../platform/platform';\n\nexport interface JoopWorkerPoolConfig {\n size?: number;\n timeout?: number; // ms per task before rejecting\n}\n\ninterface _Task {\n fn: string;\n args: unknown[];\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n timer?: ReturnType<typeof setTimeout>;\n}\n\ninterface _WorkerSlot {\n worker: Worker;\n busy: boolean;\n}\n\nexport class JoopWorkerPool {\n private _slots: _WorkerSlot[] = [];\n private _queue: _Task[] = [];\n private _size: number;\n private _timeout: number;\n private _terminated = false;\n /** True when native Web Workers are unavailable (React Native, Node) */\n private _fallback: boolean;\n\n constructor(config: JoopWorkerPoolConfig = {}) {\n const cores = typeof navigator !== 'undefined' ? (navigator.hardwareConcurrency ?? 4) : 4;\n this._size = config.size ?? Math.max(1, cores - 1);\n this._timeout = config.timeout ?? 30000;\n this._fallback = !_workersAvailable();\n if (!this._fallback) this._init();\n }\n\n get size(): number { return this._size; }\n get idle(): number { return this._fallback ? this._size : this._slots.filter(s => !s.busy).length; }\n get queueDepth(): number { return this._queue.length; }\n\n /**\n * Run a serializable function in a worker thread (or main-thread fallback on RN/Node).\n * The fn MUST be a pure, self-contained function (no closures over outer scope).\n */\n run<T, R>(fn: (arg: T) => R, arg: T): Promise<R> {\n if (this._terminated) return Promise.reject(new Error('WorkerPool terminated'));\n\n if (this._fallback) return this._runFallback(fn, arg);\n\n return new Promise<R>((resolve, reject) => {\n const task: _Task = {\n fn: fn.toString(),\n args: [arg],\n resolve: resolve as (v: unknown) => void,\n reject,\n };\n const slot = this._slots.find(s => !s.busy);\n if (slot) this._runTask(slot, task);\n else this._queue.push(task);\n });\n }\n\n async map<T, R>(items: T[], fn: (item: T) => R): Promise<R[]> {\n return Promise.all(items.map(item => this.run(fn, item)));\n }\n\n terminate(): void {\n this._terminated = true;\n if (!this._fallback) {\n for (const { worker } of this._slots) worker.terminate();\n this._slots = [];\n }\n for (const task of this._queue) task.reject(new Error('WorkerPool terminated'));\n this._queue = [];\n }\n\n // ---------------------------------------------------------------------------\n // Fallback: main-thread async execution (React Native / Node)\n // ---------------------------------------------------------------------------\n\n private _runFallback<T, R>(fn: (arg: T) => R, arg: T): Promise<R> {\n // Check for an injected worker adapter (e.g. react-native-threads)\n const adapter = JoopPlatform.getAdapter().worker;\n if (adapter) return adapter.run(fn, arg, this._timeout) as Promise<R>;\n\n // Last resort: run on main thread inside a macrotask (no true parallelism)\n return new Promise<R>((resolve, reject) => {\n const timer = this._timeout > 0\n ? setTimeout(() => reject(new Error('JoopWorkerPool: task timed out')), this._timeout)\n : null;\n setTimeout(() => {\n try {\n const result = fn(arg);\n if (timer !== null) clearTimeout(timer);\n if (result && typeof (result as unknown as Promise<R>).then === 'function') {\n (result as unknown as Promise<R>).then(v => resolve(v)).catch(e => reject(e));\n } else {\n resolve(result);\n }\n } catch (e) {\n if (timer !== null) clearTimeout(timer);\n reject(e);\n }\n }, 0);\n });\n }\n\n // ---------------------------------------------------------------------------\n // Native Web Worker implementation\n // ---------------------------------------------------------------------------\n\n private _init(): void {\n for (let i = 0; i < this._size; i++) {\n this._slots.push({ worker: this._createWorker(), busy: false });\n }\n }\n\n private _createWorker(): Worker {\n const script = `\nself.onmessage = function(e) {\n var id = e.data.id;\n try {\n var fn = new Function('return (' + e.data.fn + ')')();\n var result = fn.apply(null, e.data.args);\n if (result && typeof result.then === 'function') {\n result.then(function(v) { self.postMessage({ id: id, result: v }); })\n .catch(function(err) { self.postMessage({ id: id, error: String(err) }); });\n } else {\n self.postMessage({ id: id, result: result });\n }\n } catch(err) {\n self.postMessage({ id: id, error: String(err) });\n }\n};`;\n const blob = new Blob([script], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n const worker = new Worker(url);\n URL.revokeObjectURL(url);\n return worker;\n }\n\n private _runTask(slot: _WorkerSlot, task: _Task): void {\n slot.busy = true;\n const id = `${Date.now()}_${Math.random()}`;\n\n if (this._timeout > 0) {\n task.timer = setTimeout(() => {\n slot.worker.terminate();\n slot.worker = this._createWorker();\n slot.busy = false;\n task.reject(new Error('JoopWorkerPool: task timed out'));\n this._drain();\n }, this._timeout);\n }\n\n const onMessage = (e: MessageEvent) => {\n if (e.data?.id !== id) return;\n clearTimeout(task.timer);\n slot.worker.removeEventListener('message', onMessage);\n slot.busy = false;\n if (e.data.error) task.reject(new Error(e.data.error));\n else task.resolve(e.data.result);\n this._drain();\n };\n\n slot.worker.addEventListener('message', onMessage);\n slot.worker.postMessage({ id, fn: task.fn, args: task.args });\n }\n\n private _drain(): void {\n if (this._queue.length === 0) return;\n const slot = this._slots.find(s => !s.busy);\n if (slot) this._runTask(slot, this._queue.shift()!);\n }\n}\n\nfunction _workersAvailable(): boolean {\n return (\n typeof Worker !== 'undefined' &&\n typeof URL !== 'undefined' &&\n typeof Blob !== 'undefined' &&\n typeof URL.createObjectURL === 'function'\n );\n}\n","import { JoopPlatform } from '../platform/platform';\n\nexport type JoopCompressionFormat = 'gzip' | 'deflate' | 'deflate-raw';\n\nexport class JoopCompressionService {\n /** True when compression is available (native API or injected adapter) */\n isSupported(): boolean {\n return typeof CompressionStream !== 'undefined' || !!JoopPlatform.getAdapter().compression;\n }\n\n async compress(data: string | Uint8Array, format: JoopCompressionFormat = 'gzip'): Promise<Uint8Array> {\n const input = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n\n const adapter = JoopPlatform.getAdapter().compression;\n if (adapter) return adapter.compress(input, format);\n\n if (typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not available in this environment. ' +\n 'Provide a JoopCompressionAdapter via JoopPlatform.init() ' +\n '(e.g. wrap fflate for React Native).'\n );\n }\n\n return _nativeCompress(input, format);\n }\n\n async decompress(data: Uint8Array, format: JoopCompressionFormat = 'gzip'): Promise<Uint8Array> {\n const adapter = JoopPlatform.getAdapter().compression;\n if (adapter) return adapter.decompress(data, format);\n\n if (typeof DecompressionStream === 'undefined') {\n throw new Error(\n 'DecompressionStream is not available in this environment. ' +\n 'Provide a JoopCompressionAdapter via JoopPlatform.init().'\n );\n }\n\n return _nativeDecompress(data, format);\n }\n\n async compressString(text: string, format: JoopCompressionFormat = 'gzip'): Promise<string> {\n const bytes = await this.compress(text, format);\n return _uint8ToBase64(bytes);\n }\n\n async decompressString(b64: string, format: JoopCompressionFormat = 'gzip'): Promise<string> {\n const bytes = _base64ToUint8(b64);\n const decompressed = await this.decompress(bytes, format);\n return new TextDecoder().decode(decompressed);\n }\n\n async ratio(data: string | Uint8Array, format: JoopCompressionFormat = 'gzip'): Promise<number> {\n const originalLen = typeof data === 'string' ? new TextEncoder().encode(data).length : data.length;\n const compressed = await this.compress(data, format);\n return originalLen ? compressed.length / originalLen : 1;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Native CompressionStream helpers\n// ---------------------------------------------------------------------------\n\nasync function _nativeCompress(input: Uint8Array, format: JoopCompressionFormat): Promise<Uint8Array> {\n const cs = new CompressionStream(format);\n const writer = cs.writable.getWriter();\n const reader = cs.readable.getReader();\n writer.write(input as Uint8Array<ArrayBuffer>);\n writer.close();\n return _readAll(reader);\n}\n\nasync function _nativeDecompress(input: Uint8Array, format: JoopCompressionFormat): Promise<Uint8Array> {\n const ds = new DecompressionStream(format);\n const writer = ds.writable.getWriter();\n const reader = ds.readable.getReader();\n writer.write(input as Uint8Array<ArrayBuffer>);\n writer.close();\n return _readAll(reader);\n}\n\nasync function _readAll(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n const total = chunks.reduce((s, c) => s + c.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const c of chunks) { out.set(c, offset); offset += c.length; }\n return out;\n}\n\nfunction _uint8ToBase64(buf: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < buf.length; i++) bin += String.fromCharCode(buf[i]);\n return btoa(bin);\n}\n\nfunction _base64ToUint8(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n"]}
@@ -0,0 +1,99 @@
1
+ import { J as JoopObservable } from '../index-Dz0gOur2.mjs';
2
+
3
+ interface JoopTransition<S extends string, E extends string> {
4
+ target: S;
5
+ guard?: (context?: unknown) => boolean;
6
+ action?: (context?: unknown) => void;
7
+ }
8
+ interface JoopStateConfig<S extends string, E extends string> {
9
+ on?: Partial<Record<E, JoopTransition<S, E> | S>>;
10
+ onEnter?: (context?: unknown) => void;
11
+ onExit?: (context?: unknown) => void;
12
+ type?: 'final' | 'normal';
13
+ }
14
+ interface JoopMachineConfig<S extends string, E extends string> {
15
+ id?: string;
16
+ initial: S;
17
+ context?: unknown;
18
+ states: Record<S, JoopStateConfig<S, E>>;
19
+ }
20
+ interface JoopStateTransition<S extends string, E extends string> {
21
+ from: S;
22
+ event: E;
23
+ to: S;
24
+ timestamp: number;
25
+ }
26
+ declare class JoopStateMachine<S extends string, E extends string> {
27
+ private _state$;
28
+ private _transition$;
29
+ private _cfg;
30
+ private _history;
31
+ private _context;
32
+ constructor(config: JoopMachineConfig<S, E>);
33
+ getState(): S;
34
+ getContext(): unknown;
35
+ state$(): JoopObservable<S>;
36
+ transition$(): JoopObservable<JoopStateTransition<S, E>>;
37
+ history(): JoopStateTransition<S, E>[];
38
+ matches(state: S): boolean;
39
+ isFinal(): boolean;
40
+ /** Returns true if the event can be sent from current state */
41
+ can(event: E): boolean;
42
+ /** Send an event; returns true if a transition occurred */
43
+ send(event: E, context?: unknown): boolean;
44
+ /** Update context without triggering a transition */
45
+ setContext(ctx: unknown): void;
46
+ reset(): void;
47
+ /** Export as Mermaid state diagram */
48
+ toMermaid(): string;
49
+ private _resolveTransition;
50
+ }
51
+
52
+ interface JoopWorkflowStep {
53
+ id: string;
54
+ name?: string;
55
+ after?: string[];
56
+ execute: (context: unknown) => Promise<unknown>;
57
+ compensate?: (context: unknown) => Promise<void>;
58
+ timeout?: number;
59
+ retries?: number;
60
+ }
61
+ interface JoopWorkflowDefinition {
62
+ id: string;
63
+ steps: JoopWorkflowStep[];
64
+ }
65
+ type JoopWorkflowRunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled' | 'compensating';
66
+ interface JoopWorkflowRun {
67
+ runId: string;
68
+ workflowId: string;
69
+ status: JoopWorkflowRunStatus;
70
+ input: unknown;
71
+ outputs: Record<string, unknown>;
72
+ errors: Record<string, string>;
73
+ startedAt: number;
74
+ completedAt?: number;
75
+ }
76
+ interface JoopWorkflowResult {
77
+ runId: string;
78
+ status: 'completed' | 'failed';
79
+ outputs: Record<string, unknown>;
80
+ errors: Record<string, string>;
81
+ durationMs: number;
82
+ }
83
+ declare class JoopWorkflowEngine {
84
+ private _definitions;
85
+ private _runs;
86
+ private _runStatus$;
87
+ private _cancellations;
88
+ define(workflow: JoopWorkflowDefinition): void;
89
+ undefine(id: string): void;
90
+ run(workflowId: string, input?: unknown): Promise<JoopWorkflowResult>;
91
+ cancel(runId: string): void;
92
+ status(runId: string): JoopWorkflowRun | undefined;
93
+ history(): JoopWorkflowRun[];
94
+ runStatus$(): JoopObservable<JoopWorkflowRun>;
95
+ private _runStep;
96
+ private _emit;
97
+ }
98
+
99
+ export { type JoopMachineConfig, type JoopStateConfig, JoopStateMachine, type JoopStateTransition, type JoopTransition, type JoopWorkflowDefinition, JoopWorkflowEngine, type JoopWorkflowResult, type JoopWorkflowRun, type JoopWorkflowRunStatus, type JoopWorkflowStep };
@@ -0,0 +1,99 @@
1
+ import { J as JoopObservable } from '../index-Dz0gOur2.js';
2
+
3
+ interface JoopTransition<S extends string, E extends string> {
4
+ target: S;
5
+ guard?: (context?: unknown) => boolean;
6
+ action?: (context?: unknown) => void;
7
+ }
8
+ interface JoopStateConfig<S extends string, E extends string> {
9
+ on?: Partial<Record<E, JoopTransition<S, E> | S>>;
10
+ onEnter?: (context?: unknown) => void;
11
+ onExit?: (context?: unknown) => void;
12
+ type?: 'final' | 'normal';
13
+ }
14
+ interface JoopMachineConfig<S extends string, E extends string> {
15
+ id?: string;
16
+ initial: S;
17
+ context?: unknown;
18
+ states: Record<S, JoopStateConfig<S, E>>;
19
+ }
20
+ interface JoopStateTransition<S extends string, E extends string> {
21
+ from: S;
22
+ event: E;
23
+ to: S;
24
+ timestamp: number;
25
+ }
26
+ declare class JoopStateMachine<S extends string, E extends string> {
27
+ private _state$;
28
+ private _transition$;
29
+ private _cfg;
30
+ private _history;
31
+ private _context;
32
+ constructor(config: JoopMachineConfig<S, E>);
33
+ getState(): S;
34
+ getContext(): unknown;
35
+ state$(): JoopObservable<S>;
36
+ transition$(): JoopObservable<JoopStateTransition<S, E>>;
37
+ history(): JoopStateTransition<S, E>[];
38
+ matches(state: S): boolean;
39
+ isFinal(): boolean;
40
+ /** Returns true if the event can be sent from current state */
41
+ can(event: E): boolean;
42
+ /** Send an event; returns true if a transition occurred */
43
+ send(event: E, context?: unknown): boolean;
44
+ /** Update context without triggering a transition */
45
+ setContext(ctx: unknown): void;
46
+ reset(): void;
47
+ /** Export as Mermaid state diagram */
48
+ toMermaid(): string;
49
+ private _resolveTransition;
50
+ }
51
+
52
+ interface JoopWorkflowStep {
53
+ id: string;
54
+ name?: string;
55
+ after?: string[];
56
+ execute: (context: unknown) => Promise<unknown>;
57
+ compensate?: (context: unknown) => Promise<void>;
58
+ timeout?: number;
59
+ retries?: number;
60
+ }
61
+ interface JoopWorkflowDefinition {
62
+ id: string;
63
+ steps: JoopWorkflowStep[];
64
+ }
65
+ type JoopWorkflowRunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled' | 'compensating';
66
+ interface JoopWorkflowRun {
67
+ runId: string;
68
+ workflowId: string;
69
+ status: JoopWorkflowRunStatus;
70
+ input: unknown;
71
+ outputs: Record<string, unknown>;
72
+ errors: Record<string, string>;
73
+ startedAt: number;
74
+ completedAt?: number;
75
+ }
76
+ interface JoopWorkflowResult {
77
+ runId: string;
78
+ status: 'completed' | 'failed';
79
+ outputs: Record<string, unknown>;
80
+ errors: Record<string, string>;
81
+ durationMs: number;
82
+ }
83
+ declare class JoopWorkflowEngine {
84
+ private _definitions;
85
+ private _runs;
86
+ private _runStatus$;
87
+ private _cancellations;
88
+ define(workflow: JoopWorkflowDefinition): void;
89
+ undefine(id: string): void;
90
+ run(workflowId: string, input?: unknown): Promise<JoopWorkflowResult>;
91
+ cancel(runId: string): void;
92
+ status(runId: string): JoopWorkflowRun | undefined;
93
+ history(): JoopWorkflowRun[];
94
+ runStatus$(): JoopObservable<JoopWorkflowRun>;
95
+ private _runStep;
96
+ private _emit;
97
+ }
98
+
99
+ export { type JoopMachineConfig, type JoopStateConfig, JoopStateMachine, type JoopStateTransition, type JoopTransition, type JoopWorkflowDefinition, JoopWorkflowEngine, type JoopWorkflowResult, type JoopWorkflowRun, type JoopWorkflowRunStatus, type JoopWorkflowStep };