@workflow/world-local 5.0.0-beta.22 → 5.0.0-beta.24

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.
@@ -2,6 +2,43 @@
2
2
  * Hash a hook token to produce a filesystem-safe constraint filename.
3
3
  */
4
4
  export declare function hashToken(token: string): string;
5
+ /**
6
+ * Path of the exclusive-create lock file that commits a hook's disposal.
7
+ * The `hook_disposed` handler writes this lock BEFORE deleting the token
8
+ * claim and hook entity (and before appending the event to the log), so
9
+ * its existence is the earliest durable evidence that the hook can never
10
+ * be live again.
11
+ */
12
+ export declare function hookDisposeLockPath(basedir: string, hookId: string, tag?: string): string;
13
+ /**
14
+ * Whether a hook's disposal has been committed (its dispose lock exists).
15
+ * Mirrors event visibility for tagged worlds: an untagged lock is visible
16
+ * to every tag, a tagged lock only to its own tag.
17
+ */
18
+ export declare function isHookDisposalCommitted(basedir: string, hookId: string, tag?: string): Promise<boolean>;
19
+ /**
20
+ * Path of the exclusive-create claim file that reserves a hook token.
21
+ */
22
+ export declare function hookTokenClaimPath(basedir: string, token: string): string;
23
+ /**
24
+ * Release (delete) a token claim only if it still points at the releasing
25
+ * hook's own `(runId, hookId)`.
26
+ *
27
+ * Both in-flight releasers — the `hook_disposed` handler and the
28
+ * terminal-run `deleteAllHooksForRun` cleanup — read the hook entity and
29
+ * then delete the claim file. Deleting unconditionally is unsafe across
30
+ * processes: a releaser that stalls between those two operations can
31
+ * outlive a force-release of its stale claim (see
32
+ * `isHookTokenClaimReleasable`) and then delete the NEXT claimant's live
33
+ * claim, transiently breaking token uniqueness. Re-reading the claim and
34
+ * matching its identity here shrinks that window from "a stall of any
35
+ * length" to the adjacent read/delete file ops.
36
+ *
37
+ * A claim that is missing, unreadable, or owned by someone else is left
38
+ * alone — if it is genuinely stale debris, the claimant-side force-release
39
+ * path reaps it.
40
+ */
41
+ export declare function releaseHookTokenClaimIfOwnedBy(basedir: string, token: string, runId: string, hookId: string): Promise<void>;
5
42
  /**
6
43
  * Compute the path of the recovery-marker sidecar for a specific
7
44
  * `(token, runId, hookId)` triple. Identity is encoded in the
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/storage/helpers.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAAwC,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC5B,UAAU,MAAM,MAChB,UAAU,MAAM,KAAG,IAAI,GAAG,IAyB1B,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/storage/helpers.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAGR;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAAwC,CAAC;AAEnE;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC5B,UAAU,MAAM,MAChB,UAAU,MAAM,KAAG,IAAI,GAAG,IAyB1B,CAAC"}
@@ -1,13 +1,84 @@
1
1
  import { createHash } from 'node:crypto';
2
+ import fs from 'node:fs/promises';
2
3
  import path from 'node:path';
3
4
  import { monotonicFactory } from 'ulid';
4
- import { stripTag, ulidToDate } from '../fs.js';
5
+ import { resolveWithinBase, stripTag, ulidToDate } from '../fs.js';
5
6
  /**
6
7
  * Hash a hook token to produce a filesystem-safe constraint filename.
7
8
  */
8
9
  export function hashToken(token) {
9
10
  return createHash('sha256').update(token).digest('hex');
10
11
  }
12
+ /**
13
+ * Path of the exclusive-create lock file that commits a hook's disposal.
14
+ * The `hook_disposed` handler writes this lock BEFORE deleting the token
15
+ * claim and hook entity (and before appending the event to the log), so
16
+ * its existence is the earliest durable evidence that the hook can never
17
+ * be live again.
18
+ */
19
+ export function hookDisposeLockPath(basedir, hookId, tag) {
20
+ const name = tag ? `${hookId}.disposed.${tag}` : `${hookId}.disposed`;
21
+ return resolveWithinBase(basedir, '.locks', 'hooks', name);
22
+ }
23
+ /**
24
+ * Whether a hook's disposal has been committed (its dispose lock exists).
25
+ * Mirrors event visibility for tagged worlds: an untagged lock is visible
26
+ * to every tag, a tagged lock only to its own tag.
27
+ */
28
+ export async function isHookDisposalCommitted(basedir, hookId, tag) {
29
+ const candidates = [hookDisposeLockPath(basedir, hookId)];
30
+ if (tag) {
31
+ candidates.push(hookDisposeLockPath(basedir, hookId, tag));
32
+ }
33
+ for (const lockPath of candidates) {
34
+ try {
35
+ await fs.access(lockPath);
36
+ return true;
37
+ }
38
+ catch {
39
+ // lock not present at this path
40
+ }
41
+ }
42
+ return false;
43
+ }
44
+ /**
45
+ * Path of the exclusive-create claim file that reserves a hook token.
46
+ */
47
+ export function hookTokenClaimPath(basedir, token) {
48
+ return path.join(basedir, 'hooks', 'tokens', `${hashToken(token)}.json`);
49
+ }
50
+ /**
51
+ * Release (delete) a token claim only if it still points at the releasing
52
+ * hook's own `(runId, hookId)`.
53
+ *
54
+ * Both in-flight releasers — the `hook_disposed` handler and the
55
+ * terminal-run `deleteAllHooksForRun` cleanup — read the hook entity and
56
+ * then delete the claim file. Deleting unconditionally is unsafe across
57
+ * processes: a releaser that stalls between those two operations can
58
+ * outlive a force-release of its stale claim (see
59
+ * `isHookTokenClaimReleasable`) and then delete the NEXT claimant's live
60
+ * claim, transiently breaking token uniqueness. Re-reading the claim and
61
+ * matching its identity here shrinks that window from "a stall of any
62
+ * length" to the adjacent read/delete file ops.
63
+ *
64
+ * A claim that is missing, unreadable, or owned by someone else is left
65
+ * alone — if it is genuinely stale debris, the claimant-side force-release
66
+ * path reaps it.
67
+ */
68
+ export async function releaseHookTokenClaimIfOwnedBy(basedir, token, runId, hookId) {
69
+ const claimPath = hookTokenClaimPath(basedir, token);
70
+ let claim;
71
+ try {
72
+ claim = JSON.parse(await fs.readFile(claimPath, 'utf8'));
73
+ }
74
+ catch {
75
+ return;
76
+ }
77
+ if (claim.runId !== runId || claim.hookId !== hookId) {
78
+ return;
79
+ }
80
+ await fs.unlink(claimPath).catch(() => { });
81
+ }
11
82
  /**
12
83
  * Compute the path of the recovery-marker sidecar for a specific
13
84
  * `(token, runId, hookId)` triple. Identity is encoded in the
@@ -63,4 +134,4 @@ export const getObjectCreatedAt = (idPrefix) => (filename) => {
63
134
  const ulid = id.replace(replaceRegex, '');
64
135
  return ulidToDate(ulid);
65
136
  };
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWhEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxPQUFlLEVBQ2YsS0FBYSxFQUNiLEtBQWEsRUFDYixNQUFjO0lBRWQsK0RBQStEO0lBQy9ELDhEQUE4RDtJQUM5RCwyREFBMkQ7SUFDM0QsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUM3QixNQUFNLENBQUMsR0FBRyxLQUFLLE9BQU8sS0FBSyxPQUFPLE1BQU0sRUFBRSxDQUFDO1NBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLGdCQUFnQixDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUVuRTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FDN0IsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FDckIsQ0FBQyxRQUFnQixFQUFlLEVBQUU7SUFDaEMsMENBQTBDO0lBQzFDLG1EQUFtRDtJQUNuRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7SUFFdEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0RCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXpDLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckIsa0ZBQWtGO1FBQ2xGLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEUsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN4Qiw4RUFBOEU7UUFDOUUscUZBQXFGO1FBQ3JGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgc3RyaXBUYWcsIHVsaWRUb0RhdGUgfSBmcm9tICcuLi9mcy5qcyc7XG5cbi8qKlxuICogSGFzaCBhIGhvb2sgdG9rZW4gdG8gcHJvZHVjZSBhIGZpbGVzeXN0ZW0tc2FmZSBjb25zdHJhaW50IGZpbGVuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRva2VuKS5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIHBhdGggb2YgdGhlIHJlY292ZXJ5LW1hcmtlciBzaWRlY2FyIGZvciBhIHNwZWNpZmljXG4gKiBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgdHJpcGxlLiBJZGVudGl0eSBpcyBlbmNvZGVkIGluIHRoZVxuICogZmlsZW5hbWUgaGFzaCBzbyBkaWZmZXJlbnQgdG9rZW4gbGlmZXRpbWVzIChlLmcuIHRoZSBzYW1lIHRva2VuXG4gKiByZXVzZWQgYnkgYSBsYXRlciBydW4gYWZ0ZXIgdGhlIGZpcnN0IHJ1biB3YXMgZGVsZXRlZCkgbmV2ZXJcbiAqIGNvbnRlbmQgb24gYSBzaW5nbGUgc2lkZWNhciDigJQgd2l0aG91dCBwZXItbGlmZXRpbWUgaWRlbnRpdHksIGFcbiAqIHN0YWxlIG1hcmtlciBzdXJ2aXZpbmcgcHJpb3ItcnVuIGNsZWFudXAgY291bGQgXCJsZWFrXCIgaXRzXG4gKiBldmVudElkIGludG8gdGhlIG5ldyBsaWZldGltZSdzIHJlY292ZXJ5IGFuZCBjYXVzZSBkaXZlcmdlbnRcbiAqIHB1YmxpY2F0aW9uLlxuICpcbiAqIFNlZSBgZXZlbnRzLXN0b3JhZ2UudHNgIGZvciB0aGUgZnVsbCByZWNvdmVyeS1tYXJrZXIgcmF0aW9uYWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va1JlY292ZXJ5TWFya2VyUGF0aChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgLy8gRGlzdGluY3QgZnJvbSBgaGFzaFRva2VuKHRva2VuKWAgc28gYSB0b2tlbidzIGNsYWltIGZpbGUgYW5kXG4gIC8vIGl0cyByZWNvdmVyeSBtYXJrZXIgbGl2ZSBhdCBkaWZmZXJlbnQgcGF0aHMgQU5EIGEgZGlmZmVyZW50XG4gIC8vIGxpZmV0aW1lJ3MgcmVjb3ZlcnkgbWFya2VyIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhpcyBvbmUuXG4gIGNvbnN0IGtleSA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgLnVwZGF0ZShgJHt0b2tlbn1cXHgwMCR7cnVuSWR9XFx4MDAke2hvb2tJZH1gKVxuICAgIC5kaWdlc3QoJ2hleCcpO1xuICByZXR1cm4gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycsICd0b2tlbnMnLCBgJHtrZXl9LnJlY292ZXJ5Lmpzb25gKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtb25vdG9uaWMgVUxJRCBmYWN0b3J5IHRoYXQgZW5zdXJlcyBVTElEcyBhcmUgYWx3YXlzIGluY3JlYXNpbmdcbiAqIGV2ZW4gd2hlbiBnZW5lcmF0ZWQgd2l0aGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kLlxuICovXG5leHBvcnQgY29uc3QgbW9ub3RvbmljVWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gTWF0aC5yYW5kb20oKSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRvIGV4dHJhY3QgY3JlYXRlZEF0IGRhdGUgZnJvbSBhIGZpbGVuYW1lIGJhc2VkIG9uIFVMSUQuXG4gKiBVc2VkIGZvciBlZmZpY2llbnQgcGFnaW5hdGlvbiB3aXRob3V0IHJlYWRpbmcgZmlsZSBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0gaWRQcmVmaXggLSBUaGUgcHJlZml4IHRvIHN0cmlwIGZyb20gZmlsZW5hbWVzIChlLmcuLCAnd3J1bicsICdldm50JywgJ3N0ZXAnKVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIERhdGUgZnJvbSBmaWxlbmFtZSwgb3IgbnVsbCBpZiBub3QgZXh0cmFjdGFibGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9iamVjdENyZWF0ZWRBdCA9XG4gIChpZFByZWZpeDogc3RyaW5nKSA9PlxuICAoZmlsZW5hbWU6IHN0cmluZyk6IERhdGUgfCBudWxsID0+IHtcbiAgICAvLyBTdHJpcCB0YWcgc3VmZml4IGJlZm9yZSBVTElEIGV4dHJhY3Rpb25cbiAgICAvLyBlLmcuLCBcIndydW5fQUJDLnZpdGVzdC0wLmpzb25cIiDihpIgXCJ3cnVuX0FCQy5qc29uXCJcbiAgICBjb25zdCBjbGVhbk5hbWUgPSBzdHJpcFRhZyhmaWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sICcnKSkgKyAnLmpzb24nO1xuXG4gICAgY29uc3QgcmVwbGFjZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7aWRQcmVmaXh9X2AsICdnJyk7XG4gICAgY29uc3QgZGFzaEluZGV4ID0gY2xlYW5OYW1lLmluZGV4T2YoJy0nKTtcblxuICAgIGlmIChkYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAvLyBObyBkYXNoIC0gZXh0cmFjdCBVTElEIGZyb20gdGhlIGZpbGVuYW1lIChlLmcuLCB3cnVuX1VMSUQuanNvbiwgZXZudF9VTElELmpzb24pXG4gICAgICBjb25zdCB1bGlkID0gY2xlYW5OYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgJycpLnJlcGxhY2UocmVwbGFjZVJlZ2V4LCAnJyk7XG4gICAgICByZXR1cm4gdWxpZFRvRGF0ZSh1bGlkKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgY29tcG9zaXRlIGtleXMgbGlrZSB7cnVuSWR9LXtzdGVwSWR9LCBleHRyYWN0IGZyb20gdGhlIGFwcHJvcHJpYXRlIHBhcnRcbiAgICBpZiAoaWRQcmVmaXggPT09ICdzdGVwJykge1xuICAgICAgLy8gU3RlcHMgdXNlIHNlcXVlbnRpYWwgSURzIChzdGVwXzAsIHN0ZXBfMSwgZXRjLikgLSBubyB0aW1lc3RhbXAgaW4gZmlsZW5hbWUuXG4gICAgICAvLyBSZXR1cm4gbnVsbCB0byBza2lwIGZpbGVuYW1lLWJhc2VkIG9wdGltaXphdGlvbiBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZCBmaWx0ZXJpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgZXZlbnRzOiB3cnVuX1VMSUQtZXZudF9VTElELmpzb24gLSBleHRyYWN0IGZyb20gdGhlIGV2ZW50SWQgcGFydFxuICAgIGNvbnN0IGlkID0gY2xlYW5OYW1lLnN1YnN0cmluZyhkYXNoSW5kZXggKyAxKS5yZXBsYWNlKC9cXC5qc29uJC8sICcnKTtcbiAgICBjb25zdCB1bGlkID0gaWQucmVwbGFjZShyZXBsYWNlUmVnZXgsICcnKTtcbiAgICByZXR1cm4gdWxpZFRvRGF0ZSh1bGlkKTtcbiAgfTtcbiJdfQ==
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRW5FOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBZSxFQUNmLE1BQWMsRUFDZCxHQUFZO0lBRVosTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLFdBQVcsQ0FBQztJQUN0RSxPQUFPLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsT0FBZSxFQUNmLE1BQWMsRUFDZCxHQUFZO0lBRVosTUFBTSxVQUFVLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxRCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsVUFBVSxDQUFDLElBQUks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LGtGQUFrRjtRQUNsRixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDeEIsOEVBQThFO1FBQzlFLHFGQUFxRjtRQUNyRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHJlc29sdmVXaXRoaW5CYXNlLCBzdHJpcFRhZywgdWxpZFRvRGF0ZSB9IGZyb20gJy4uL2ZzLmpzJztcblxuLyoqXG4gKiBIYXNoIGEgaG9vayB0b2tlbiB0byBwcm9kdWNlIGEgZmlsZXN5c3RlbS1zYWZlIGNvbnN0cmFpbnQgZmlsZW5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoVG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodG9rZW4pLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbi8qKlxuICogUGF0aCBvZiB0aGUgZXhjbHVzaXZlLWNyZWF0ZSBsb2NrIGZpbGUgdGhhdCBjb21taXRzIGEgaG9vaydzIGRpc3Bvc2FsLlxuICogVGhlIGBob29rX2Rpc3Bvc2VkYCBoYW5kbGVyIHdyaXRlcyB0aGlzIGxvY2sgQkVGT1JFIGRlbGV0aW5nIHRoZSB0b2tlblxuICogY2xhaW0gYW5kIGhvb2sgZW50aXR5IChhbmQgYmVmb3JlIGFwcGVuZGluZyB0aGUgZXZlbnQgdG8gdGhlIGxvZyksIHNvXG4gKiBpdHMgZXhpc3RlbmNlIGlzIHRoZSBlYXJsaWVzdCBkdXJhYmxlIGV2aWRlbmNlIHRoYXQgdGhlIGhvb2sgY2FuIG5ldmVyXG4gKiBiZSBsaXZlIGFnYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va0Rpc3Bvc2VMb2NrUGF0aChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gdGFnID8gYCR7aG9va0lkfS5kaXNwb3NlZC4ke3RhZ31gIDogYCR7aG9va0lkfS5kaXNwb3NlZGA7XG4gIHJldHVybiByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCAnLmxvY2tzJywgJ2hvb2tzJywgbmFtZSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGhvb2sncyBkaXNwb3NhbCBoYXMgYmVlbiBjb21taXR0ZWQgKGl0cyBkaXNwb3NlIGxvY2sgZXhpc3RzKS5cbiAqIE1pcnJvcnMgZXZlbnQgdmlzaWJpbGl0eSBmb3IgdGFnZ2VkIHdvcmxkczogYW4gdW50YWdnZWQgbG9jayBpcyB2aXNpYmxlXG4gKiB0byBldmVyeSB0YWcsIGEgdGFnZ2VkIGxvY2sgb25seSB0byBpdHMgb3duIHRhZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzSG9va0Rpc3Bvc2FsQ29tbWl0dGVkKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gW2hvb2tEaXNwb3NlTG9ja1BhdGgoYmFzZWRpciwgaG9va0lkKV07XG4gIGlmICh0YWcpIHtcbiAgICBjYW5kaWRhdGVzLnB1c2goaG9va0Rpc3Bvc2VMb2NrUGF0aChiYXNlZGlyLCBob29rSWQsIHRhZykpO1xuICB9XG4gIGZvciAoY29uc3QgbG9ja1BhdGggb2YgY2FuZGlkYXRlcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MobG9ja1BhdGgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBsb2NrIG5vdCBwcmVzZW50IGF0IHRoaXMgcGF0aFxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUGF0aCBvZiB0aGUgZXhjbHVzaXZlLWNyZWF0ZSBjbGFpbSBmaWxlIHRoYXQgcmVzZXJ2ZXMgYSBob29rIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va1Rva2VuQ2xhaW1QYXRoKGJhc2VkaXI6IHN0cmluZywgdG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oYmFzZWRpciwgJ2hvb2tzJywgJ3Rva2VucycsIGAke2hhc2hUb2tlbih0b2tlbil9Lmpzb25gKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlIChkZWxldGUpIGEgdG9rZW4gY2xhaW0gb25seSBpZiBpdCBzdGlsbCBwb2ludHMgYXQgdGhlIHJlbGVhc2luZ1xuICogaG9vaydzIG93biBgKHJ1bklkLCBob29rSWQpYC5cbiAqXG4gKiBCb3RoIGluLWZsaWdodCByZWxlYXNlcnMg4oCUIHRoZSBgaG9va19kaXNwb3NlZGAgaGFuZGxlciBhbmQgdGhlXG4gKiB0ZXJtaW5hbC1ydW4gYGRlbGV0ZUFsbEhvb2tzRm9yUnVuYCBjbGVhbnVwIOKAlCByZWFkIHRoZSBob29rIGVudGl0eSBhbmRcbiAqIHRoZW4gZGVsZXRlIHRoZSBjbGFpbSBmaWxlLiBEZWxldGluZyB1bmNvbmRpdGlvbmFsbHkgaXMgdW5zYWZlIGFjcm9zc1xuICogcHJvY2Vzc2VzOiBhIHJlbGVhc2VyIHRoYXQgc3RhbGxzIGJldHdlZW4gdGhvc2UgdHdvIG9wZXJhdGlvbnMgY2FuXG4gKiBvdXRsaXZlIGEgZm9yY2UtcmVsZWFzZSBvZiBpdHMgc3RhbGUgY2xhaW0gKHNlZVxuICogYGlzSG9va1Rva2VuQ2xhaW1SZWxlYXNhYmxlYCkgYW5kIHRoZW4gZGVsZXRlIHRoZSBORVhUIGNsYWltYW50J3MgbGl2ZVxuICogY2xhaW0sIHRyYW5zaWVudGx5IGJyZWFraW5nIHRva2VuIHVuaXF1ZW5lc3MuIFJlLXJlYWRpbmcgdGhlIGNsYWltIGFuZFxuICogbWF0Y2hpbmcgaXRzIGlkZW50aXR5IGhlcmUgc2hyaW5rcyB0aGF0IHdpbmRvdyBmcm9tIFwiYSBzdGFsbCBvZiBhbnlcbiAqIGxlbmd0aFwiIHRvIHRoZSBhZGphY2VudCByZWFkL2RlbGV0ZSBmaWxlIG9wcy5cbiAqXG4gKiBBIGNsYWltIHRoYXQgaXMgbWlzc2luZywgdW5yZWFkYWJsZSwgb3Igb3duZWQgYnkgc29tZW9uZSBlbHNlIGlzIGxlZnRcbiAqIGFsb25lIOKAlCBpZiBpdCBpcyBnZW51aW5lbHkgc3RhbGUgZGVicmlzLCB0aGUgY2xhaW1hbnQtc2lkZSBmb3JjZS1yZWxlYXNlXG4gKiBwYXRoIHJlYXBzIGl0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsZWFzZUhvb2tUb2tlbkNsYWltSWZPd25lZEJ5KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2xhaW1QYXRoID0gaG9va1Rva2VuQ2xhaW1QYXRoKGJhc2VkaXIsIHRva2VuKTtcbiAgbGV0IGNsYWltOiB7IHJ1bklkPzogdW5rbm93bjsgaG9va0lkPzogdW5rbm93biB9O1xuICB0cnkge1xuICAgIGNsYWltID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShjbGFpbVBhdGgsICd1dGY4JykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGNsYWltLnJ1bklkICE9PSBydW5JZCB8fCBjbGFpbS5ob29rSWQgIT09IGhvb2tJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy51bmxpbmsoY2xhaW1QYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgcGF0aCBvZiB0aGUgcmVjb3ZlcnktbWFya2VyIHNpZGVjYXIgZm9yIGEgc3BlY2lmaWNcbiAqIGAodG9rZW4sIHJ1bklkLCBob29rSWQpYCB0cmlwbGUuIElkZW50aXR5IGlzIGVuY29kZWQgaW4gdGhlXG4gKiBmaWxlbmFtZSBoYXNoIHNvIGRpZmZlcmVudCB0b2tlbiBsaWZldGltZXMgKGUuZy4gdGhlIHNhbWUgdG9rZW5cbiAqIHJldXNlZCBieSBhIGxhdGVyIHJ1biBhZnRlciB0aGUgZmlyc3QgcnVuIHdhcyBkZWxldGVkKSBuZXZlclxuICogY29udGVuZCBvbiBhIHNpbmdsZSBzaWRlY2FyIOKAlCB3aXRob3V0IHBlci1saWZldGltZSBpZGVudGl0eSwgYVxuICogc3RhbGUgbWFya2VyIHN1cnZpdmluZyBwcmlvci1ydW4gY2xlYW51cCBjb3VsZCBcImxlYWtcIiBpdHNcbiAqIGV2ZW50SWQgaW50byB0aGUgbmV3IGxpZmV0aW1lJ3MgcmVjb3ZlcnkgYW5kIGNhdXNlIGRpdmVyZ2VudFxuICogcHVibGljYXRpb24uXG4gKlxuICogU2VlIGBldmVudHMtc3RvcmFnZS50c2AgZm9yIHRoZSBmdWxsIHJlY292ZXJ5LW1hcmtlciByYXRpb25hbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICAvLyBEaXN0aW5jdCBmcm9tIGBoYXNoVG9rZW4odG9rZW4pYCBzbyBhIHRva2VuJ3MgY2xhaW0gZmlsZSBhbmRcbiAgLy8gaXRzIHJlY292ZXJ5IG1hcmtlciBsaXZlIGF0IGRpZmZlcmVudCBwYXRocyBBTkQgYSBkaWZmZXJlbnRcbiAgLy8gbGlmZXRpbWUncyByZWNvdmVyeSBtYXJrZXIgbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGlzIG9uZS5cbiAgY29uc3Qga2V5ID0gY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAudXBkYXRlKGAke3Rva2VufVxceDAwJHtydW5JZH1cXHgwMCR7aG9va0lkfWApXG4gICAgLmRpZ2VzdCgnaGV4Jyk7XG4gIHJldHVybiBwYXRoLmpvaW4oYmFzZWRpciwgJ2hvb2tzJywgJ3Rva2VucycsIGAke2tleX0ucmVjb3ZlcnkuanNvbmApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG1vbm90b25pYyBVTElEIGZhY3RvcnkgdGhhdCBlbnN1cmVzIFVMSURzIGFyZSBhbHdheXMgaW5jcmVhc2luZ1xuICogZXZlbiB3aGVuIGdlbmVyYXRlZCB3aXRoaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQuXG4gKi9cbmV4cG9ydCBjb25zdCBtb25vdG9uaWNVbGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdG8gZXh0cmFjdCBjcmVhdGVkQXQgZGF0ZSBmcm9tIGEgZmlsZW5hbWUgYmFzZWQgb24gVUxJRC5cbiAqIFVzZWQgZm9yIGVmZmljaWVudCBwYWdpbmF0aW9uIHdpdGhvdXQgcmVhZGluZyBmaWxlIGNvbnRlbnRzLlxuICpcbiAqIEBwYXJhbSBpZFByZWZpeCAtIFRoZSBwcmVmaXggdG8gc3RyaXAgZnJvbSBmaWxlbmFtZXMgKGUuZy4sICd3cnVuJywgJ2V2bnQnLCAnc3RlcCcpXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZXh0cmFjdHMgRGF0ZSBmcm9tIGZpbGVuYW1lLCBvciBudWxsIGlmIG5vdCBleHRyYWN0YWJsZVxuICovXG5leHBvcnQgY29uc3QgZ2V0T2JqZWN0Q3JlYXRlZEF0ID1cbiAgKGlkUHJlZml4OiBzdHJpbmcpID0+XG4gIChmaWxlbmFtZTogc3RyaW5nKTogRGF0ZSB8IG51bGwgPT4ge1xuICAgIC8vIFN0cmlwIHRhZyBzdWZmaXggYmVmb3JlIFVMSUQgZXh0cmFjdGlvblxuICAgIC8vIGUuZy4sIFwid3J1bl9BQkMudml0ZXN0LTAuanNvblwiIOKGkiBcIndydW5fQUJDLmpzb25cIlxuICAgIGNvbnN0IGNsZWFuTmFtZSA9IHN0cmlwVGFnKGZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgJycpKSArICcuanNvbic7XG5cbiAgICBjb25zdCByZXBsYWNlUmVnZXggPSBuZXcgUmVnRXhwKGBeJHtpZFByZWZpeH1fYCwgJ2cnKTtcbiAgICBjb25zdCBkYXNoSW5kZXggPSBjbGVhbk5hbWUuaW5kZXhPZignLScpO1xuXG4gICAgaWYgKGRhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIE5vIGRhc2ggLSBleHRyYWN0IFVMSUQgZnJvbSB0aGUgZmlsZW5hbWUgKGUuZy4sIHdydW5fVUxJRC5qc29uLCBldm50X1VMSUQuanNvbilcbiAgICAgIGNvbnN0IHVsaWQgPSBjbGVhbk5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCAnJykucmVwbGFjZShyZXBsYWNlUmVnZXgsICcnKTtcbiAgICAgIHJldHVybiB1bGlkVG9EYXRlKHVsaWQpO1xuICAgIH1cblxuICAgIC8vIEZvciBjb21wb3NpdGUga2V5cyBsaWtlIHtydW5JZH0te3N0ZXBJZH0sIGV4dHJhY3QgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcGFydFxuICAgIGlmIChpZFByZWZpeCA9PT0gJ3N0ZXAnKSB7XG4gICAgICAvLyBTdGVwcyB1c2Ugc2VxdWVudGlhbCBJRHMgKHN0ZXBfMCwgc3RlcF8xLCBldGMuKSAtIG5vIHRpbWVzdGFtcCBpbiBmaWxlbmFtZS5cbiAgICAgIC8vIFJldHVybiBudWxsIHRvIHNraXAgZmlsZW5hbWUtYmFzZWQgb3B0aW1pemF0aW9uIGFuZCBkZWZlciB0byBKU09OLWJhc2VkIGZpbHRlcmluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZvciBldmVudHM6IHdydW5fVUxJRC1ldm50X1VMSUQuanNvbiAtIGV4dHJhY3QgZnJvbSB0aGUgZXZlbnRJZCBwYXJ0XG4gICAgY29uc3QgaWQgPSBjbGVhbk5hbWUuc3Vic3RyaW5nKGRhc2hJbmRleCArIDEpLnJlcGxhY2UoL1xcLmpzb24kLywgJycpO1xuICAgIGNvbnN0IHVsaWQgPSBpZC5yZXBsYWNlKHJlcGxhY2VSZWdleCwgJycpO1xuICAgIHJldHVybiB1bGlkVG9EYXRlKHVsaWQpO1xuICB9O1xuIl19
@@ -1,4 +1,5 @@
1
- import type { Storage } from '@workflow/world';
1
+ import type { Hook, Storage } from '@workflow/world';
2
+ export declare function rebuildLiveHookByTokenFromEventLog(basedir: string, token: string, tag?: string): Promise<Hook | null>;
2
3
  /**
3
4
  * Creates a hooks storage implementation using the filesystem.
4
5
  * Implements the Storage['hooks'] interface with hook CRUD operations.
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-storage.d.ts","sourceRoot":"","sources":["../../src/storage/hooks-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAKV,OAAO,EACR,MAAM,iBAAiB,CAAC;AAczB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAiFlB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
1
+ {"version":3,"file":"hooks-storage.d.ts","sourceRoot":"","sources":["../../src/storage/hooks-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,IAAI,EAIJ,OAAO,EACR,MAAM,iBAAiB,CAAC;AA6LzB,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAOtB;AAeD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CA+FlB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -1,10 +1,121 @@
1
1
  import path from 'node:path';
2
2
  import { HookNotFoundError } from '@workflow/errors';
3
- import { HookSchema } from '@workflow/world';
3
+ import { EventSchema, HookSchema, isTerminalRunEventType, isTerminalWorkflowRunStatus, WorkflowRunSchema, } from '@workflow/world';
4
+ import { z } from 'zod';
4
5
  import { DEFAULT_RESOLVE_DATA_OPTION } from '../config.js';
5
- import { assertSafeEntityId, deleteJSON, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, } from '../fs.js';
6
+ import { assertSafeEntityId, deleteJSON, hasTag, isUntagged, jsonReplacer, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, taggedPath, writeExclusive, } from '../fs.js';
6
7
  import { filterHookData } from './filters.js';
7
- import { hashToken, hookRecoveryMarkerPath } from './helpers.js';
8
+ import { hashToken, hookRecoveryMarkerPath, isHookDisposalCommitted, releaseHookTokenClaimIfOwnedBy, } from './helpers.js';
9
+ function isVisibleToTag(fileId, tag) {
10
+ return tag ? isUntagged(fileId) || hasTag(fileId, tag) : isUntagged(fileId);
11
+ }
12
+ function getHookCreatedToken(event) {
13
+ if (event.eventType !== 'hook_created')
14
+ return undefined;
15
+ const token = event.eventData.token;
16
+ return typeof token === 'string' ? token : undefined;
17
+ }
18
+ function hookFromCreatedEvent(event) {
19
+ const { token, metadata, isWebhook, isSystem } = event.eventData;
20
+ return {
21
+ runId: event.runId,
22
+ hookId: event.correlationId,
23
+ token,
24
+ metadata,
25
+ ownerId: 'local-owner',
26
+ projectId: 'local-project',
27
+ environment: 'local',
28
+ createdAt: event.createdAt,
29
+ specVersion: event.specVersion,
30
+ isWebhook: isWebhook ?? true,
31
+ isSystem: isSystem ?? false,
32
+ };
33
+ }
34
+ function isMatchingHookCreatedEvent(event, matches) {
35
+ return (event.eventType === 'hook_created' &&
36
+ typeof event.correlationId === 'string' &&
37
+ matches(event));
38
+ }
39
+ function closesLiveHook(event, liveEvent) {
40
+ if (event.runId !== liveEvent.runId)
41
+ return false;
42
+ return ((event.eventType === 'hook_disposed' &&
43
+ event.correlationId === liveEvent.correlationId) ||
44
+ isTerminalRunEventType(event.eventType));
45
+ }
46
+ async function readEventForHookScan(filePath) {
47
+ try {
48
+ return await readJSON(filePath, EventSchema);
49
+ }
50
+ catch (error) {
51
+ if (error instanceof SyntaxError || error instanceof z.ZodError) {
52
+ return null;
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ async function isTerminalRunCache(basedir, runId, tag) {
58
+ const run = await readJSONWithFallback(basedir, 'runs', runId, WorkflowRunSchema, tag);
59
+ return run ? isTerminalWorkflowRunStatus(run.status) : false;
60
+ }
61
+ async function findLiveHookCreatedEvent(basedir, matches, tag) {
62
+ const eventsDir = path.join(basedir, 'events');
63
+ const events = [];
64
+ for (const fileId of await listJSONFiles(eventsDir)) {
65
+ if (!isVisibleToTag(fileId, tag))
66
+ continue;
67
+ const event = await readEventForHookScan(path.join(eventsDir, `${fileId}.json`));
68
+ if (event)
69
+ events.push(event);
70
+ }
71
+ events.sort((a, b) => {
72
+ const byTime = a.createdAt.getTime() - b.createdAt.getTime();
73
+ return byTime === 0 ? a.eventId.localeCompare(b.eventId) : byTime;
74
+ });
75
+ let liveEvent = null;
76
+ for (const event of events) {
77
+ if (isMatchingHookCreatedEvent(event, matches)) {
78
+ liveEvent = event;
79
+ continue;
80
+ }
81
+ if (liveEvent && closesLiveHook(event, liveEvent)) {
82
+ liveEvent = null;
83
+ }
84
+ }
85
+ if (liveEvent && (await isTerminalRunCache(basedir, liveEvent.runId, tag))) {
86
+ return null;
87
+ }
88
+ // A committed disposal (dispose lock on disk) closes the hook even when
89
+ // its `hook_disposed` event has not landed in the log yet — the disposer
90
+ // writes the lock, releases the token claim and hook entity, and only
91
+ // then appends the event. Rebuilding the caches from the log in that
92
+ // window would resurrect a claim for a hook that is being torn down.
93
+ if (liveEvent &&
94
+ (await isHookDisposalCommitted(basedir, liveEvent.correlationId, tag))) {
95
+ return null;
96
+ }
97
+ return liveEvent;
98
+ }
99
+ async function restoreHookCachesFromEvent(basedir, event, tag) {
100
+ const hook = hookFromCreatedEvent(event);
101
+ const claimPath = path.join(basedir, 'hooks', 'tokens', `${hashToken(hook.token)}.json`);
102
+ await writeExclusive(claimPath, JSON.stringify({
103
+ token: hook.token,
104
+ hookId: hook.hookId,
105
+ runId: hook.runId,
106
+ eventId: event.eventId,
107
+ }));
108
+ await writeExclusive(taggedPath(basedir, 'hooks', hook.hookId, tag), JSON.stringify(hook, jsonReplacer, 2));
109
+ return hook;
110
+ }
111
+ export async function rebuildLiveHookByTokenFromEventLog(basedir, token, tag) {
112
+ const event = await findLiveHookCreatedEvent(basedir, (candidate) => getHookCreatedToken(candidate) === token, tag);
113
+ return event ? restoreHookCachesFromEvent(basedir, event, tag) : null;
114
+ }
115
+ async function rebuildLiveHookByIdFromEventLog(basedir, hookId, tag) {
116
+ const event = await findLiveHookCreatedEvent(basedir, (candidate) => candidate.correlationId === hookId, tag);
117
+ return event ? restoreHookCachesFromEvent(basedir, event, tag) : null;
118
+ }
8
119
  /**
9
120
  * Creates a hooks storage implementation using the filesystem.
10
121
  * Implements the Storage['hooks'] interface with hook CRUD operations.
@@ -27,13 +138,19 @@ export function createHooksStorage(basedir, tag) {
27
138
  assertSafeEntityId('hookId', hookId);
28
139
  const hook = await readJSONWithFallback(basedir, 'hooks', hookId, HookSchema, tag);
29
140
  if (!hook) {
30
- throw new HookNotFoundError(hookId);
141
+ const rebuilt = await rebuildLiveHookByIdFromEventLog(basedir, hookId, tag);
142
+ if (!rebuilt) {
143
+ throw new HookNotFoundError(hookId);
144
+ }
145
+ const resolveData = params?.resolveData || DEFAULT_RESOLVE_DATA_OPTION;
146
+ return filterHookData({ ...rebuilt, isWebhook: rebuilt.isWebhook ?? true }, resolveData);
31
147
  }
32
148
  const resolveData = params?.resolveData || DEFAULT_RESOLVE_DATA_OPTION;
33
149
  return filterHookData({ ...hook, isWebhook: hook.isWebhook ?? true }, resolveData);
34
150
  }
35
151
  async function getByToken(token) {
36
- const hook = await findHookByToken(token);
152
+ const hook = (await findHookByToken(token)) ??
153
+ (await rebuildLiveHookByTokenFromEventLog(basedir, token, tag));
37
154
  if (!hook) {
38
155
  throw new HookNotFoundError(token);
39
156
  }
@@ -83,17 +200,20 @@ export async function deleteAllHooksForRun(basedir, runId) {
83
200
  const hookPath = path.join(hooksDir, `${file}.json`);
84
201
  const hook = await readJSON(hookPath, HookSchema);
85
202
  if (hook && hook.runId === runId) {
86
- // Delete the token constraint file to free up the token, and
87
- // delete the recovery marker (if any) for disk hygiene. The
203
+ // Release the token claim to free up the token — but only if it
204
+ // still points at this hook: a claimant may have force-released
205
+ // the terminal run's stale claim already (see
206
+ // `isHookTokenClaimReleasable`) and hold a fresh claim of its
207
+ // own, which an unconditional delete would destroy. Also delete
208
+ // the recovery marker (if any) for disk hygiene. The
88
209
  // marker's filename hash includes `(token, runId, hookId)` so
89
210
  // a leaked marker can never corrupt a different lifetime — but
90
211
  // cleaning it up here keeps the tokens/ directory from
91
212
  // accumulating recovered-hook sidecars over time.
92
- const constraintPath = path.join(hooksDir, 'tokens', `${hashToken(hook.token)}.json`);
93
- await deleteJSON(constraintPath);
213
+ await releaseHookTokenClaimIfOwnedBy(basedir, hook.token, hook.runId, hook.hookId);
94
214
  await deleteJSON(hookRecoveryMarkerPath(basedir, hook.token, hook.runId, hook.hookId));
95
215
  await deleteJSON(hookPath);
96
216
  }
97
217
  }
98
218
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3Mtc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL2hvb2tzLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBUXJELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsYUFBYSxFQUNiLHdCQUF3QixFQUN4QixRQUFRLEVBQ1Isb0JBQW9CLEdBQ3JCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQWUsRUFDZixHQUFZO0lBRVosc0VBQXNFO0lBQ3RFLEtBQUssVUFBVSxlQUFlLENBQUMsS0FBYTtRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQztZQUNyRCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBSSxJQUFJLElBQUksSUFB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b0JBQW9CLENBQ3hDLE9BQWUsRUFDZixLQUFhO0lBRWIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDakMsNkRBQTZEO1lBQzdELDREQUE0RDtZQUM1RCw4REFBOEQ7WUFDOUQsK0RBQStEO1lBQy9ELHVEQUF1RDtZQUN2RCxrREFBa0Q7WUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDOUIsUUFBUSxFQUNSLFFBQVEsRUFDUixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDaEMsQ0FBQztZQUNGLE1BQU0sVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sVUFBVSxDQUNkLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUNyRSxDQUFDO1lBQ0YsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEhvb2tOb3RGb3VuZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdldEhvb2tQYXJhbXMsXG4gIEhvb2ssXG4gIExpc3RIb29rc1BhcmFtcyxcbiAgUGFnaW5hdGVkUmVzcG9uc2UsXG4gIFN0b3JhZ2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBIb29rU2NoZW1hIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTiB9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBhc3NlcnRTYWZlRW50aXR5SWQsXG4gIGRlbGV0ZUpTT04sXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxufSBmcm9tICcuLi9mcy5qcyc7XG5pbXBvcnQgeyBmaWx0ZXJIb29rRGF0YSB9IGZyb20gJy4vZmlsdGVycy5qcyc7XG5pbXBvcnQgeyBoYXNoVG9rZW4sIGhvb2tSZWNvdmVyeU1hcmtlclBhdGggfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBob29rcyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnaG9va3MnXSBpbnRlcmZhY2Ugd2l0aCBob29rIENSVUQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2tzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFN0b3JhZ2VbJ2hvb2tzJ10ge1xuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBhIGhvb2sgYnkgdG9rZW4gKHNoYXJlZCBiZXR3ZWVuIGdldEJ5VG9rZW4pXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmRIb29rQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxIb29rIHwgbnVsbD4ge1xuICAgIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyhob29rc0Rpcik7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGhvb2tQYXRoID0gcGF0aC5qb2luKGhvb2tzRGlyLCBgJHtmaWxlfS5qc29uYCk7XG4gICAgICBjb25zdCBob29rID0gYXdhaXQgcmVhZEpTT04oaG9va1BhdGgsIEhvb2tTY2hlbWEpO1xuICAgICAgaWYgKGhvb2sgJiYgaG9vay50b2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uaG9vaywgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayA/PyB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXQoaG9va0lkOiBzdHJpbmcsIHBhcmFtcz86IEdldEhvb2tQYXJhbXMpOiBQcm9taXNlPEhvb2s+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2hvb2tJZCcsIGhvb2tJZCk7XG4gICAgY29uc3QgaG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgYmFzZWRpcixcbiAgICAgICdob29rcycsXG4gICAgICBob29rSWQsXG4gICAgICBIb29rU2NoZW1hLFxuICAgICAgdGFnXG4gICAgKTtcbiAgICBpZiAoIWhvb2spIHtcbiAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihob29rSWQpO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgfHwgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgIHJldHVybiBmaWx0ZXJIb29rRGF0YShcbiAgICAgIHsgLi4uaG9vaywgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayA/PyB0cnVlIH0sXG4gICAgICByZXNvbHZlRGF0YVxuICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgICBjb25zdCBob29rID0gYXdhaXQgZmluZEhvb2tCeVRva2VuKHRva2VuKTtcbiAgICBpZiAoIWhvb2spIHtcbiAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcih0b2tlbik7XG4gICAgfVxuICAgIHJldHVybiBob29rO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbGlzdChcbiAgICBwYXJhbXM6IExpc3RIb29rc1BhcmFtc1xuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPEhvb2s+PiB7XG4gICAgY29uc3QgaG9va3NEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ2hvb2tzJyk7XG4gICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgfHwgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgIGRpcmVjdG9yeTogaG9va3NEaXIsXG4gICAgICBzY2hlbWE6IEhvb2tTY2hlbWEsXG4gICAgICBzb3J0T3JkZXI6IHBhcmFtcy5wYWdpbmF0aW9uPy5zb3J0T3JkZXIgPz8gJ2FzYycsXG4gICAgICBsaW1pdDogcGFyYW1zLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgZmlsZVByZWZpeDogdW5kZWZpbmVkLCAvLyBIb29rcyBkb24ndCBoYXZlIFVMSURzLCBzbyB3ZSBjYW4ndCBvcHRpbWl6ZSBieSBmaWxlbmFtZVxuICAgICAgZmlsdGVyOiAoaG9vaykgPT4ge1xuICAgICAgICAvLyBGaWx0ZXIgYnkgcnVuSWQgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHBhcmFtcy5ydW5JZCAmJiBob29rLnJ1bklkICE9PSBwYXJhbXMucnVuSWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgZ2V0Q3JlYXRlZEF0OiAoKSA9PiB7XG4gICAgICAgIC8vIEhvb2sgZmlsZXMgZG9uJ3QgaGF2ZSBVTElEIHRpbWVzdGFtcHMgaW4gZmlsZW5hbWUsIHNvIHJldHVybiBudWxsXG4gICAgICAgIC8vIHRvIHNraXAgdGhlIGZpbGVuYW1lLWJhc2VkIG9wdGltaXphdGlvbiBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZFxuICAgICAgICAvLyBjdXJzb3IgZmlsdGVyaW5nIHdoaWNoIHVzZXMgdGhlIGFjdHVhbCBjcmVhdGVkQXQgZnJvbSB0aGUgZmlsZS5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICAgZ2V0SWQ6IChob29rKSA9PiBob29rLmhvb2tJZCxcbiAgICB9KTtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgZGF0YSBhZnRlciBwYWdpbmF0aW9uXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoaG9vaykgPT4gZmlsdGVySG9va0RhdGEoaG9vaywgcmVzb2x2ZURhdGEpKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZ2V0LCBnZXRCeVRva2VuLCBsaXN0IH07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgaG9va3MgYXNzb2NpYXRlZCB3aXRoIGEgd29ya2Zsb3cgcnVuLlxuICogQ2FsbGVkIHdoZW4gYSBydW4gcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsSG9va3NGb3JSdW4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMoaG9va3NEaXIpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGhvb2tQYXRoID0gcGF0aC5qb2luKGhvb2tzRGlyLCBgJHtmaWxlfS5qc29uYCk7XG4gICAgY29uc3QgaG9vayA9IGF3YWl0IHJlYWRKU09OKGhvb2tQYXRoLCBIb29rU2NoZW1hKTtcbiAgICBpZiAoaG9vayAmJiBob29rLnJ1bklkID09PSBydW5JZCkge1xuICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbiBjb25zdHJhaW50IGZpbGUgdG8gZnJlZSB1cCB0aGUgdG9rZW4sIGFuZFxuICAgICAgLy8gZGVsZXRlIHRoZSByZWNvdmVyeSBtYXJrZXIgKGlmIGFueSkgZm9yIGRpc2sgaHlnaWVuZS4gVGhlXG4gICAgICAvLyBtYXJrZXIncyBmaWxlbmFtZSBoYXNoIGluY2x1ZGVzIGAodG9rZW4sIHJ1bklkLCBob29rSWQpYCBzb1xuICAgICAgLy8gYSBsZWFrZWQgbWFya2VyIGNhbiBuZXZlciBjb3JydXB0IGEgZGlmZmVyZW50IGxpZmV0aW1lIOKAlCBidXRcbiAgICAgIC8vIGNsZWFuaW5nIGl0IHVwIGhlcmUga2VlcHMgdGhlIHRva2Vucy8gZGlyZWN0b3J5IGZyb21cbiAgICAgIC8vIGFjY3VtdWxhdGluZyByZWNvdmVyZWQtaG9vayBzaWRlY2FycyBvdmVyIHRpbWUuXG4gICAgICBjb25zdCBjb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaG9va3NEaXIsXG4gICAgICAgICd0b2tlbnMnLFxuICAgICAgICBgJHtoYXNoVG9rZW4oaG9vay50b2tlbil9Lmpzb25gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGVsZXRlSlNPTihjb25zdHJhaW50UGF0aCk7XG4gICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKGJhc2VkaXIsIGhvb2sudG9rZW4sIGhvb2sucnVuSWQsIGhvb2suaG9va0lkKVxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgIH1cbiAgfVxufVxuIl19
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9va3Mtc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL2hvb2tzLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBVXJELE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxFQUNWLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLHdCQUF3QixFQUN4QixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixjQUFjLEdBQ2YsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsU0FBUyxFQUNULHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsOEJBQThCLEdBQy9CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLFNBQVMsY0FBYyxDQUFDLE1BQWMsRUFBRSxHQUF1QjtJQUM3RCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFZO0lBQ3ZDLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxjQUFjO1FBQUUsT0FBTyxTQUFT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QXNCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQ3JFLENBQUM7WUFDRixNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgSG9va05vdEZvdW5kRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIEdldEhvb2tQYXJhbXMsXG4gIEhvb2ssXG4gIEhvb2tDcmVhdGVkRXZlbnQsXG4gIExpc3RIb29rc1BhcmFtcyxcbiAgUGFnaW5hdGVkUmVzcG9uc2UsXG4gIFN0b3JhZ2UsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBFdmVudFNjaGVtYSxcbiAgSG9va1NjaGVtYSxcbiAgaXNUZXJtaW5hbFJ1bkV2ZW50VHlwZSxcbiAgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzLFxuICBXb3JrZmxvd1J1blNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgZGVsZXRlSlNPTixcbiAgaGFzVGFnLFxuICBpc1VudGFnZ2VkLFxuICBqc29uUmVwbGFjZXIsXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxuICB0YWdnZWRQYXRoLFxuICB3cml0ZUV4Y2x1c2l2ZSxcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgZmlsdGVySG9va0RhdGEgfSBmcm9tICcuL2ZpbHRlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFzaFRva2VuLFxuICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoLFxuICBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZCxcbiAgcmVsZWFzZUhvb2tUb2tlbkNsYWltSWZPd25lZEJ5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuXG5mdW5jdGlvbiBpc1Zpc2libGVUb1RhZyhmaWxlSWQ6IHN0cmluZywgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhZyA/IGlzVW50YWdnZWQoZmlsZUlkKSB8fCBoYXNUYWcoZmlsZUlkLCB0YWcpIDogaXNVbnRhZ2dlZChmaWxlSWQpO1xufVxuXG5mdW5jdGlvbiBnZXRIb29rQ3JlYXRlZFRva2VuKGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChldmVudC5ldmVudFR5cGUgIT09ICdob29rX2NyZWF0ZWQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB0b2tlbiA9IChldmVudC5ldmVudERhdGEgYXMgeyB0b2tlbj86IHVua25vd24gfSkudG9rZW47XG4gIHJldHVybiB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnID8gdG9rZW4gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhvb2tGcm9tQ3JlYXRlZEV2ZW50KGV2ZW50OiBFdmVudCAmIEhvb2tDcmVhdGVkRXZlbnQpOiBIb29rIHtcbiAgY29uc3QgeyB0b2tlbiwgbWV0YWRhdGEsIGlzV2ViaG9vaywgaXNTeXN0ZW0gfSA9IGV2ZW50LmV2ZW50RGF0YTtcbiAgcmV0dXJuIHtcbiAgICBydW5JZDogZXZlbnQucnVuSWQsXG4gICAgaG9va0lkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgIHRva2VuLFxuICAgIG1ldGFkYXRhLFxuICAgIG93bmVySWQ6ICdsb2NhbC1vd25lcicsXG4gICAgcHJvamVjdElkOiAnbG9jYWwtcHJvamVjdCcsXG4gICAgZW52aXJvbm1lbnQ6ICdsb2NhbCcsXG4gICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgc3BlY1ZlcnNpb246IGV2ZW50LnNwZWNWZXJzaW9uLFxuICAgIGlzV2ViaG9vazogaXNXZWJob29rID8/IHRydWUsXG4gICAgaXNTeXN0ZW06IGlzU3lzdGVtID8/IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc01hdGNoaW5nSG9va0NyZWF0ZWRFdmVudChcbiAgZXZlbnQ6IEV2ZW50LFxuICBtYXRjaGVzOiAoZXZlbnQ6IEV2ZW50KSA9PiBib29sZWFuXG4pOiBldmVudCBpcyBFdmVudCAmIEhvb2tDcmVhdGVkRXZlbnQge1xuICByZXR1cm4gKFxuICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICB0eXBlb2YgZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycgJiZcbiAgICBtYXRjaGVzKGV2ZW50KVxuICApO1xufVxuXG5mdW5jdGlvbiBjbG9zZXNMaXZlSG9vayhcbiAgZXZlbnQ6IEV2ZW50LFxuICBsaXZlRXZlbnQ6IEV2ZW50ICYgSG9va0NyZWF0ZWRFdmVudFxuKTogYm9vbGVhbiB7XG4gIGlmIChldmVudC5ydW5JZCAhPT0gbGl2ZUV2ZW50LnJ1bklkKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoXG4gICAgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnICYmXG4gICAgICBldmVudC5jb3JyZWxhdGlvbklkID09PSBsaXZlRXZlbnQuY29ycmVsYXRpb25JZCkgfHxcbiAgICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEV2ZW50Rm9ySG9va1NjYW4oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8RXZlbnQgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKGZpbGVQYXRoLCBFdmVudFNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNUZXJtaW5hbFJ1bkNhY2hlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ3J1bnMnLFxuICAgIHJ1bklkLFxuICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICByZXR1cm4gcnVuID8gaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKHJ1bi5zdGF0dXMpIDogZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRMaXZlSG9va0NyZWF0ZWRFdmVudChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBtYXRjaGVzOiAoZXZlbnQ6IEV2ZW50KSA9PiBib29sZWFuLFxuICB0YWc/OiBzdHJpbmdcbik6IFByb21pc2U8KEV2ZW50ICYgSG9va0NyZWF0ZWRFdmVudCkgfCBudWxsPiB7XG4gIGNvbnN0IGV2ZW50c0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyk7XG4gIGNvbnN0IGV2ZW50czogRXZlbnRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZmlsZUlkIG9mIGF3YWl0IGxpc3RKU09ORmlsZXMoZXZlbnRzRGlyKSkge1xuICAgIGlmICghaXNWaXNpYmxlVG9UYWcoZmlsZUlkLCB0YWcpKSBjb250aW51ZTtcbiAgICBjb25zdCBldmVudCA9IGF3YWl0IHJlYWRFdmVudEZvckhvb2tTY2FuKFxuICAgICAgcGF0aC5qb2luKGV2ZW50c0RpciwgYCR7ZmlsZUlkfS5qc29uYClcbiAgICApO1xuICAgIGlmIChldmVudCkgZXZlbnRzLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgZXZlbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBieVRpbWUgPSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCkgLSBiLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIGJ5VGltZSA9PT0gMCA/IGEuZXZlbnRJZC5sb2NhbGVDb21wYXJlKGIuZXZlbnRJZCkgOiBieVRpbWU7XG4gIH0pO1xuXG4gIGxldCBsaXZlRXZlbnQ6IChFdmVudCAmIEhvb2tDcmVhdGVkRXZlbnQpIHwgbnVsbCA9IG51bGw7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGlzTWF0Y2hpbmdIb29rQ3JlYXRlZEV2ZW50KGV2ZW50LCBtYXRjaGVzKSkge1xuICAgICAgbGl2ZUV2ZW50ID0gZXZlbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobGl2ZUV2ZW50ICYmIGNsb3Nlc0xpdmVIb29rKGV2ZW50LCBsaXZlRXZlbnQpKSB7XG4gICAgICBsaXZlRXZlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsaXZlRXZlbnQgJiYgKGF3YWl0IGlzVGVybWluYWxSdW5DYWNoZShiYXNlZGlyLCBsaXZlRXZlbnQucnVuSWQsIHRhZykpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIGNvbW1pdHRlZCBkaXNwb3NhbCAoZGlzcG9zZSBsb2NrIG9uIGRpc2spIGNsb3NlcyB0aGUgaG9vayBldmVuIHdoZW5cbiAgLy8gaXRzIGBob29rX2Rpc3Bvc2VkYCBldmVudCBoYXMgbm90IGxhbmRlZCBpbiB0aGUgbG9nIHlldCDigJQgdGhlIGRpc3Bvc2VyXG4gIC8vIHdyaXRlcyB0aGUgbG9jaywgcmVsZWFzZXMgdGhlIHRva2VuIGNsYWltIGFuZCBob29rIGVudGl0eSwgYW5kIG9ubHlcbiAgLy8gdGhlbiBhcHBlbmRzIHRoZSBldmVudC4gUmVidWlsZGluZyB0aGUgY2FjaGVzIGZyb20gdGhlIGxvZyBpbiB0aGF0XG4gIC8vIHdpbmRvdyB3b3VsZCByZXN1cnJlY3QgYSBjbGFpbSBmb3IgYSBob29rIHRoYXQgaXMgYmVpbmcgdG9ybiBkb3duLlxuICBpZiAoXG4gICAgbGl2ZUV2ZW50ICYmXG4gICAgKGF3YWl0IGlzSG9va0Rpc3Bvc2FsQ29tbWl0dGVkKGJhc2VkaXIsIGxpdmVFdmVudC5jb3JyZWxhdGlvbklkLCB0YWcpKVxuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBsaXZlRXZlbnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVIb29rQ2FjaGVzRnJvbUV2ZW50KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGV2ZW50OiBFdmVudCAmIEhvb2tDcmVhdGVkRXZlbnQsXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxIb29rPiB7XG4gIGNvbnN0IGhvb2sgPSBob29rRnJvbUNyZWF0ZWRFdmVudChldmVudCk7XG5cbiAgY29uc3QgY2xhaW1QYXRoID0gcGF0aC5qb2luKFxuICAgIGJhc2VkaXIsXG4gICAgJ2hvb2tzJyxcbiAgICAndG9rZW5zJyxcbiAgICBgJHtoYXNoVG9rZW4oaG9vay50b2tlbil9Lmpzb25gXG4gICk7XG4gIGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgIGNsYWltUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0b2tlbjogaG9vay50b2tlbixcbiAgICAgIGhvb2tJZDogaG9vay5ob29rSWQsXG4gICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICBKU09OLnN0cmluZ2lmeShob29rLCBqc29uUmVwbGFjZXIsIDIpXG4gICk7XG5cbiAgcmV0dXJuIGhvb2s7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkTGl2ZUhvb2tCeVRva2VuRnJvbUV2ZW50TG9nKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxIb29rIHwgbnVsbD4ge1xuICBjb25zdCBldmVudCA9IGF3YWl0IGZpbmRMaXZlSG9va0NyZWF0ZWRFdmVudChcbiAgICBiYXNlZGlyLFxuICAgIChjYW5kaWRhdGUpID0+IGdldEhvb2tDcmVhdGVkVG9rZW4oY2FuZGlkYXRlKSA9PT0gdG9rZW4sXG4gICAgdGFnXG4gICk7XG4gIHJldHVybiBldmVudCA/IHJlc3RvcmVIb29rQ2FjaGVzRnJvbUV2ZW50KGJhc2VkaXIsIGV2ZW50LCB0YWcpIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVidWlsZExpdmVIb29rQnlJZEZyb21FdmVudExvZyhcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPEhvb2sgfCBudWxsPiB7XG4gIGNvbnN0IGV2ZW50ID0gYXdhaXQgZmluZExpdmVIb29rQ3JlYXRlZEV2ZW50KFxuICAgIGJhc2VkaXIsXG4gICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmNvcnJlbGF0aW9uSWQgPT09IGhvb2tJZCxcbiAgICB0YWdcbiAgKTtcbiAgcmV0dXJuIGV2ZW50ID8gcmVzdG9yZUhvb2tDYWNoZXNGcm9tRXZlbnQoYmFzZWRpciwgZXZlbnQsIHRhZykgOiBudWxsO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBob29rcyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnaG9va3MnXSBpbnRlcmZhY2Ugd2l0aCBob29rIENSVUQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2tzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFN0b3JhZ2VbJ2hvb2tzJ10ge1xuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBhIGhvb2sgYnkgdG9rZW4gKHNoYXJlZCBiZXR3ZWVuIGdldEJ5VG9rZW4pXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmRIb29rQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxIb29rIHwgbnVsbD4ge1xuICAgIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycpO1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyhob29rc0Rpcik7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGhvb2tQYXRoID0gcGF0aC5qb2luKGhvb2tzRGlyLCBgJHtmaWxlfS5qc29uYCk7XG4gICAgICBjb25zdCBob29rID0gYXdhaXQgcmVhZEpTT04oaG9va1BhdGgsIEhvb2tTY2hlbWEpO1xuICAgICAgaWYgKGhvb2sgJiYgaG9vay50b2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uaG9vaywgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayA/PyB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXQoaG9va0lkOiBzdHJpbmcsIHBhcmFtcz86IEdldEhvb2tQYXJhbXMpOiBQcm9taXNlPEhvb2s+IHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2hvb2tJZCcsIGhvb2tJZCk7XG4gICAgY29uc3QgaG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgYmFzZWRpcixcbiAgICAgICdob29rcycsXG4gICAgICBob29rSWQsXG4gICAgICBIb29rU2NoZW1hLFxuICAgICAgdGFnXG4gICAgKTtcbiAgICBpZiAoIWhvb2spIHtcbiAgICAgIGNvbnN0IHJlYnVpbHQgPSBhd2FpdCByZWJ1aWxkTGl2ZUhvb2tCeUlkRnJvbUV2ZW50TG9nKFxuICAgICAgICBiYXNlZGlyLFxuICAgICAgICBob29rSWQsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghcmVidWlsdCkge1xuICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9va0lkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSB8fCBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gZmlsdGVySG9va0RhdGEoXG4gICAgICAgIHsgLi4ucmVidWlsdCwgaXNXZWJob29rOiByZWJ1aWx0LmlzV2ViaG9vayA/PyB0cnVlIH0sXG4gICAgICAgIHJlc29sdmVEYXRhXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgfHwgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgIHJldHVybiBmaWx0ZXJIb29rRGF0YShcbiAgICAgIHsgLi4uaG9vaywgaXNXZWJob29rOiBob29rLmlzV2ViaG9vayA/PyB0cnVlIH0sXG4gICAgICByZXNvbHZlRGF0YVxuICAgICk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgICBjb25zdCBob29rID1cbiAgICAgIChhd2FpdCBmaW5kSG9va0J5VG9rZW4odG9rZW4pKSA/P1xuICAgICAgKGF3YWl0IHJlYnVpbGRMaXZlSG9va0J5VG9rZW5Gcm9tRXZlbnRMb2coYmFzZWRpciwgdG9rZW4sIHRhZykpO1xuICAgIGlmICghaG9vaykge1xuICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIGhvb2s7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsaXN0KFxuICAgIHBhcmFtczogTGlzdEhvb2tzUGFyYW1zXG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8SG9vaz4+IHtcbiAgICBjb25zdCBob29rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnaG9va3MnKTtcbiAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSB8fCBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgZGlyZWN0b3J5OiBob29rc0RpcixcbiAgICAgIHNjaGVtYTogSG9va1NjaGVtYSxcbiAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgIGxpbWl0OiBwYXJhbXMucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICBjdXJzb3I6IHBhcmFtcy5wYWdpbmF0aW9uPy5jdXJzb3IsXG4gICAgICBmaWxlUHJlZml4OiB1bmRlZmluZWQsIC8vIEhvb2tzIGRvbid0IGhhdmUgVUxJRHMsIHNvIHdlIGNhbid0IG9wdGltaXplIGJ5IGZpbGVuYW1lXG4gICAgICBmaWx0ZXI6IChob29rKSA9PiB7XG4gICAgICAgIC8vIEZpbHRlciBieSBydW5JZCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAocGFyYW1zLnJ1bklkICYmIGhvb2sucnVuSWQgIT09IHBhcmFtcy5ydW5JZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBnZXRDcmVhdGVkQXQ6ICgpID0+IHtcbiAgICAgICAgLy8gSG9vayBmaWxlcyBkb24ndCBoYXZlIFVMSUQgdGltZXN0YW1wcyBpbiBmaWxlbmFtZSwgc28gcmV0dXJuIG51bGxcbiAgICAgICAgLy8gdG8gc2tpcCB0aGUgZmlsZW5hbWUtYmFzZWQgb3B0aW1pemF0aW9uIGFuZCBkZWZlciB0byBKU09OLWJhc2VkXG4gICAgICAgIC8vIGN1cnNvciBmaWx0ZXJpbmcgd2hpY2ggdXNlcyB0aGUgYWN0dWFsIGNyZWF0ZWRBdCBmcm9tIHRoZSBmaWxlLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG4gICAgICBnZXRJZDogKGhvb2spID0+IGhvb2suaG9va0lkLFxuICAgIH0pO1xuXG4gICAgLy8gVHJhbnNmb3JtIHRoZSBkYXRhIGFmdGVyIHBhZ2luYXRpb25cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgZGF0YTogcmVzdWx0LmRhdGEubWFwKChob29rKSA9PiBmaWx0ZXJIb29rRGF0YShob29rLCByZXNvbHZlRGF0YSkpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBnZXQsIGdldEJ5VG9rZW4sIGxpc3QgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBob29rcyBhc3NvY2lhdGVkIHdpdGggYSB3b3JrZmxvdyBydW4uXG4gKiBDYWxsZWQgd2hlbiBhIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBbGxIb29rc0ZvclJ1bihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaG9va3NEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ2hvb2tzJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyhob29rc0Rpcik7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgaG9va1BhdGggPSBwYXRoLmpvaW4oaG9va3NEaXIsIGAke2ZpbGV9Lmpzb25gKTtcbiAgICBjb25zdCBob29rID0gYXdhaXQgcmVhZEpTT04oaG9va1BhdGgsIEhvb2tTY2hlbWEpO1xuICAgIGlmIChob29rICYmIGhvb2sucnVuSWQgPT09IHJ1bklkKSB7XG4gICAgICAvLyBSZWxlYXNlIHRoZSB0b2tlbiBjbGFpbSB0byBmcmVlIHVwIHRoZSB0b2tlbiDigJQgYnV0IG9ubHkgaWYgaXRcbiAgICAgIC8vIHN0aWxsIHBvaW50cyBhdCB0aGlzIGhvb2s6IGEgY2xhaW1hbnQgbWF5IGhhdmUgZm9yY2UtcmVsZWFzZWRcbiAgICAgIC8vIHRoZSB0ZXJtaW5hbCBydW4ncyBzdGFsZSBjbGFpbSBhbHJlYWR5IChzZWVcbiAgICAgIC8vIGBpc0hvb2tUb2tlbkNsYWltUmVsZWFzYWJsZWApIGFuZCBob2xkIGEgZnJlc2ggY2xhaW0gb2YgaXRzXG4gICAgICAvLyBvd24sIHdoaWNoIGFuIHVuY29uZGl0aW9uYWwgZGVsZXRlIHdvdWxkIGRlc3Ryb3kuIEFsc28gZGVsZXRlXG4gICAgICAvLyB0aGUgcmVjb3ZlcnkgbWFya2VyIChpZiBhbnkpIGZvciBkaXNrIGh5Z2llbmUuIFRoZVxuICAgICAgLy8gbWFya2VyJ3MgZmlsZW5hbWUgaGFzaCBpbmNsdWRlcyBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgc29cbiAgICAgIC8vIGEgbGVha2VkIG1hcmtlciBjYW4gbmV2ZXIgY29ycnVwdCBhIGRpZmZlcmVudCBsaWZldGltZSDigJQgYnV0XG4gICAgICAvLyBjbGVhbmluZyBpdCB1cCBoZXJlIGtlZXBzIHRoZSB0b2tlbnMvIGRpcmVjdG9yeSBmcm9tXG4gICAgICAvLyBhY2N1bXVsYXRpbmcgcmVjb3ZlcmVkLWhvb2sgc2lkZWNhcnMgb3ZlciB0aW1lLlxuICAgICAgYXdhaXQgcmVsZWFzZUhvb2tUb2tlbkNsYWltSWZPd25lZEJ5KFxuICAgICAgICBiYXNlZGlyLFxuICAgICAgICBob29rLnRva2VuLFxuICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICBob29rLmhvb2tJZFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoYmFzZWRpciwgaG9vay50b2tlbiwgaG9vay5ydW5JZCwgaG9vay5ob29rSWQpXG4gICAgICApO1xuICAgICAgYXdhaXQgZGVsZXRlSlNPTihob29rUGF0aCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -7,6 +7,7 @@ import { type LocalRunsStorage } from './runs-storage.js';
7
7
  */
8
8
  export type LocalStorage = Omit<Storage, 'runs'> & {
9
9
  runs: LocalRunsStorage;
10
+ clearCache(): void;
10
11
  };
11
12
  /**
12
13
  * Creates a complete storage implementation using the filesystem.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG7E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE9E;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAezE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG7E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG;IACjD,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,IAAI,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,YAAY,CAgBzE"}
@@ -25,6 +25,7 @@ export function createStorage(basedir, tag) {
25
25
  steps: instrumentObject('world.steps', steps),
26
26
  events: instrumentObject('world.events', events),
27
27
  hooks: instrumentObject('world.hooks', hooks),
28
+ clearCache: () => events.clearCache(),
28
29
  };
29
30
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQXlCLE1BQU0sbUJBQW1CLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFTeEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQWUsRUFBRSxHQUFZO0lBQ3pELHFDQUFxQztJQUNyQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFL0MsOENBQThDO0lBQzlDLCtEQUErRDtJQUMvRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7UUFDMUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDN0MsTUFBTSxFQUFFLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7UUFDaEQsS0FBSyxFQUFFLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7S0FDOUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0b3JhZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudE9iamVjdCB9IGZyb20gJy4uL2luc3RydW1lbnRPYmplY3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlRXZlbnRzU3RvcmFnZSB9IGZyb20gJy4vZXZlbnRzLXN0b3JhZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlSG9va3NTdG9yYWdlIH0gZnJvbSAnLi9ob29rcy1zdG9yYWdlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJ1bnNTdG9yYWdlLCB0eXBlIExvY2FsUnVuc1N0b3JhZ2UgfSBmcm9tICcuL3J1bnMtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdGVwc1N0b3JhZ2UgfSBmcm9tICcuL3N0ZXBzLXN0b3JhZ2UuanMnO1xuXG4vKipcbiAqIFN0b3JhZ2Ugc2hhcGUgdXNlZCBpbnNpZGUgd29ybGQtbG9jYWw6IGlkZW50aWNhbCB0byBgU3RvcmFnZWAsIGJ1dCBgcnVuc2BcbiAqIGV4cG9zZXMgdGhlIGludGVybmFsIGBmaWxlSWRGaWx0ZXJgIG9wdGlvbiBvbiBgbGlzdCgpYC4gU3RydWN0dXJhbGx5XG4gKiBhc3NpZ25hYmxlIHRvIGBTdG9yYWdlYCBhdCBwdWJsaWMgYm91bmRhcmllcyAoZS5nLiwgYHJlZW5xdWV1ZUFjdGl2ZVJ1bnNgKS5cbiAqL1xuZXhwb3J0IHR5cGUgTG9jYWxTdG9yYWdlID0gT21pdDxTdG9yYWdlLCAncnVucyc+ICYgeyBydW5zOiBMb2NhbFJ1bnNTdG9yYWdlIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGZpbGVzeXN0ZW0uXG4gKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IHRoYXQgY29tcG9zZXMgYWxsIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEFsbCBzdG9yYWdlIG1ldGhvZHMgYXJlIGluc3RydW1lbnRlZCB3aXRoIHRyYWNpbmcgc3BhbnMgZm9yIG9ic2VydmFiaWxpdHkuXG4gKlxuICogQHBhcmFtIGJhc2VkaXIgLSBUaGUgYmFzZSBkaXJlY3RvcnkgZm9yIHN0b3Jpbmcgd29ya2Zsb3cgZGF0YVxuICogQHJldHVybnMgQSBjb21wbGV0ZSBTdG9yYWdlIGltcGxlbWVudGF0aW9uIHdpdGggdHJhY2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RvcmFnZShiYXNlZGlyOiBzdHJpbmcsIHRhZz86IHN0cmluZyk6IExvY2FsU3RvcmFnZSB7XG4gIC8vIENyZWF0ZSByYXcgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbnNcbiAgY29uc3QgcnVucyA9IGNyZWF0ZVJ1bnNTdG9yYWdlKGJhc2VkaXIsIHRhZyk7XG4gIGNvbnN0IHN0ZXBzID0gY3JlYXRlU3RlcHNTdG9yYWdlKGJhc2VkaXIsIHRhZyk7XG4gIGNvbnN0IGV2ZW50cyA9IGNyZWF0ZUV2ZW50c1N0b3JhZ2UoYmFzZWRpciwgdGFnKTtcbiAgY29uc3QgaG9va3MgPSBjcmVhdGVIb29rc1N0b3JhZ2UoYmFzZWRpciwgdGFnKTtcblxuICAvLyBJbnN0cnVtZW50IGFsbCBzdG9yYWdlIG1ldGhvZHMgd2l0aCB0cmFjaW5nXG4gIC8vIE5PVEU6IFNwYW4gbmFtZXMgYXJlIGxvd2VyY2FzZSBwZXIgT1RFTCBzZW1hbnRpYyBjb252ZW50aW9uc1xuICByZXR1cm4ge1xuICAgIHJ1bnM6IGluc3RydW1lbnRPYmplY3QoJ3dvcmxkLnJ1bnMnLCBydW5zKSxcbiAgICBzdGVwczogaW5zdHJ1bWVudE9iamVjdCgnd29ybGQuc3RlcHMnLCBzdGVwcyksXG4gICAgZXZlbnRzOiBpbnN0cnVtZW50T2JqZWN0KCd3b3JsZC5ldmVudHMnLCBldmVudHMpLFxuICAgIGhvb2tzOiBpbnN0cnVtZW50T2JqZWN0KCd3b3JsZC5ob29rcycsIGhvb2tzKSxcbiAgfTtcbn1cbiJdfQ==
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQXlCLE1BQU0sbUJBQW1CLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFZeEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQWUsRUFBRSxHQUFZO0lBQ3pELHFDQUFxQztJQUNyQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFL0MsOENBQThDO0lBQzlDLCtEQUErRDtJQUMvRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7UUFDMUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDN0MsTUFBTSxFQUFFLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7UUFDaEQsS0FBSyxFQUFFLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDN0MsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7S0FDdEMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0b3JhZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudE9iamVjdCB9IGZyb20gJy4uL2luc3RydW1lbnRPYmplY3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlRXZlbnRzU3RvcmFnZSB9IGZyb20gJy4vZXZlbnRzLXN0b3JhZ2UuanMnO1xuaW1wb3J0IHsgY3JlYXRlSG9va3NTdG9yYWdlIH0gZnJvbSAnLi9ob29rcy1zdG9yYWdlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJ1bnNTdG9yYWdlLCB0eXBlIExvY2FsUnVuc1N0b3JhZ2UgfSBmcm9tICcuL3J1bnMtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdGVwc1N0b3JhZ2UgfSBmcm9tICcuL3N0ZXBzLXN0b3JhZ2UuanMnO1xuXG4vKipcbiAqIFN0b3JhZ2Ugc2hhcGUgdXNlZCBpbnNpZGUgd29ybGQtbG9jYWw6IGlkZW50aWNhbCB0byBgU3RvcmFnZWAsIGJ1dCBgcnVuc2BcbiAqIGV4cG9zZXMgdGhlIGludGVybmFsIGBmaWxlSWRGaWx0ZXJgIG9wdGlvbiBvbiBgbGlzdCgpYC4gU3RydWN0dXJhbGx5XG4gKiBhc3NpZ25hYmxlIHRvIGBTdG9yYWdlYCBhdCBwdWJsaWMgYm91bmRhcmllcyAoZS5nLiwgYHJlZW5xdWV1ZUFjdGl2ZVJ1bnNgKS5cbiAqL1xuZXhwb3J0IHR5cGUgTG9jYWxTdG9yYWdlID0gT21pdDxTdG9yYWdlLCAncnVucyc+ICYge1xuICBydW5zOiBMb2NhbFJ1bnNTdG9yYWdlO1xuICBjbGVhckNhY2hlKCk6IHZvaWQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCB0aGF0IGNvbXBvc2VzIGFsbCBzdG9yYWdlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBBbGwgc3RvcmFnZSBtZXRob2RzIGFyZSBpbnN0cnVtZW50ZWQgd2l0aCB0cmFjaW5nIHNwYW5zIGZvciBvYnNlcnZhYmlsaXR5LlxuICpcbiAqIEBwYXJhbSBiYXNlZGlyIC0gVGhlIGJhc2UgZGlyZWN0b3J5IGZvciBzdG9yaW5nIHdvcmtmbG93IGRhdGFcbiAqIEByZXR1cm5zIEEgY29tcGxldGUgU3RvcmFnZSBpbXBsZW1lbnRhdGlvbiB3aXRoIHRyYWNpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3JhZ2UoYmFzZWRpcjogc3RyaW5nLCB0YWc/OiBzdHJpbmcpOiBMb2NhbFN0b3JhZ2Uge1xuICAvLyBDcmVhdGUgcmF3IHN0b3JhZ2UgaW1wbGVtZW50YXRpb25zXG4gIGNvbnN0IHJ1bnMgPSBjcmVhdGVSdW5zU3RvcmFnZShiYXNlZGlyLCB0YWcpO1xuICBjb25zdCBzdGVwcyA9IGNyZWF0ZVN0ZXBzU3RvcmFnZShiYXNlZGlyLCB0YWcpO1xuICBjb25zdCBldmVudHMgPSBjcmVhdGVFdmVudHNTdG9yYWdlKGJhc2VkaXIsIHRhZyk7XG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3NTdG9yYWdlKGJhc2VkaXIsIHRhZyk7XG5cbiAgLy8gSW5zdHJ1bWVudCBhbGwgc3RvcmFnZSBtZXRob2RzIHdpdGggdHJhY2luZ1xuICAvLyBOT1RFOiBTcGFuIG5hbWVzIGFyZSBsb3dlcmNhc2UgcGVyIE9URUwgc2VtYW50aWMgY29udmVudGlvbnNcbiAgcmV0dXJuIHtcbiAgICBydW5zOiBpbnN0cnVtZW50T2JqZWN0KCd3b3JsZC5ydW5zJywgcnVucyksXG4gICAgc3RlcHM6IGluc3RydW1lbnRPYmplY3QoJ3dvcmxkLnN0ZXBzJywgc3RlcHMpLFxuICAgIGV2ZW50czogaW5zdHJ1bWVudE9iamVjdCgnd29ybGQuZXZlbnRzJywgZXZlbnRzKSxcbiAgICBob29rczogaW5zdHJ1bWVudE9iamVjdCgnd29ybGQuaG9va3MnLCBob29rcyksXG4gICAgY2xlYXJDYWNoZTogKCkgPT4gZXZlbnRzLmNsZWFyQ2FjaGUoKSxcbiAgfTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"streamer.d.ts","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,QAAQ,EAET,MAAM,iBAAiB,CAAC;AAsBzB;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,uBAG1C;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM;;;EAKlD;AA4DD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAwjBtE"}
1
+ {"version":3,"file":"streamer.d.ts","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,QAAQ,EAET,MAAM,iBAAiB,CAAC;AAsBzB;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,uBAG1C;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM;;;EAKlD;AA0ED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAgkBtE"}