@workglow/util 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/browser.js +332 -86
  2. package/dist/browser.js.map +17 -14
  3. package/dist/bun.js +332 -86
  4. package/dist/bun.js.map +17 -14
  5. package/dist/credentials/CredentialProviderOptions.d.ts +38 -0
  6. package/dist/credentials/CredentialProviderOptions.d.ts.map +1 -0
  7. package/dist/credentials/CredentialPutInputSchema.d.ts +37 -0
  8. package/dist/credentials/CredentialPutInputSchema.d.ts.map +1 -0
  9. package/dist/credentials/CredentialStoreRegistry.d.ts.map +1 -1
  10. package/dist/credentials/OtpPassphraseCache.d.ts +73 -0
  11. package/dist/credentials/OtpPassphraseCache.d.ts.map +1 -0
  12. package/dist/credentials/index.d.ts +6 -3
  13. package/dist/credentials/index.d.ts.map +1 -1
  14. package/dist/di/Container.d.ts +15 -0
  15. package/dist/di/Container.d.ts.map +1 -1
  16. package/dist/di/InputCompactorRegistry.d.ts.map +1 -1
  17. package/dist/di/InputResolverRegistry.d.ts.map +1 -1
  18. package/dist/di/ServiceRegistry.d.ts +11 -0
  19. package/dist/di/ServiceRegistry.d.ts.map +1 -1
  20. package/dist/events/EventEmitter.d.ts +16 -0
  21. package/dist/events/EventEmitter.d.ts.map +1 -1
  22. package/dist/graph/directedAcyclicGraph.d.ts.map +1 -1
  23. package/dist/graph/directedGraph.d.ts.map +1 -1
  24. package/dist/graph/graph.d.ts.map +1 -1
  25. package/dist/graph-entry.js +55 -18
  26. package/dist/graph-entry.js.map +6 -6
  27. package/dist/json-schema/SchemaValidation.d.ts +31 -0
  28. package/dist/json-schema/SchemaValidation.d.ts.map +1 -1
  29. package/dist/logging/LoggerRegistry.d.ts.map +1 -1
  30. package/dist/node.js +332 -86
  31. package/dist/node.js.map +17 -14
  32. package/dist/schema-entry.js +168 -1
  33. package/dist/schema-entry.js.map +4 -4
  34. package/dist/telemetry/TelemetryRegistry.d.ts.map +1 -1
  35. package/dist/vector/TypedArray.d.ts.map +1 -1
  36. package/dist/worker/WorkerManager.d.ts +9 -0
  37. package/dist/worker/WorkerManager.d.ts.map +1 -1
  38. package/dist/worker-browser.js +98 -25
  39. package/dist/worker-browser.js.map +9 -9
  40. package/dist/worker-bun.js +98 -25
  41. package/dist/worker-bun.js.map +9 -9
  42. package/dist/worker-node.js +98 -25
  43. package/dist/worker-node.js.map +9 -9
  44. package/package.json +6 -1
package/dist/bun.js CHANGED
@@ -87,12 +87,19 @@ class Container {
87
87
  services = new Map;
88
88
  factories = new Map;
89
89
  singletons = new Set;
90
+ resolving = [];
90
91
  register(token, factory, singleton = true) {
91
92
  this.factories.set(token, factory);
92
93
  if (singleton) {
93
94
  this.singletons.add(token);
94
95
  }
95
96
  }
97
+ registerIfAbsent(token, factory, singleton = true) {
98
+ if (this.factories.has(token) || this.services.has(token)) {
99
+ return;
100
+ }
101
+ this.register(token, factory, singleton);
102
+ }
96
103
  registerInstance(token, instance) {
97
104
  this.services.set(token, instance);
98
105
  this.singletons.add(token);
@@ -105,11 +112,20 @@ class Container {
105
112
  if (!factory) {
106
113
  throw new Error(`Service not registered: ${String(token)}`);
107
114
  }
108
- const instance = factory();
109
- if (this.singletons.has(token)) {
110
- this.services.set(token, instance);
115
+ if (this.resolving.includes(token)) {
116
+ const cycle = [...this.resolving.slice(this.resolving.indexOf(token)), token];
117
+ throw new Error(`Circular dependency detected: ${cycle.join(" -> ")}`);
118
+ }
119
+ this.resolving.push(token);
120
+ try {
121
+ const instance = factory();
122
+ if (this.singletons.has(token)) {
123
+ this.services.set(token, instance);
124
+ }
125
+ return instance;
126
+ } finally {
127
+ this.resolving.pop();
111
128
  }
112
- return instance;
113
129
  }
114
130
  has(token) {
115
131
  return this.services.has(token) || this.factories.has(token);
@@ -119,6 +135,36 @@ class Container {
119
135
  this.factories.delete(token);
120
136
  this.singletons.delete(token);
121
137
  }
138
+ async dispose() {
139
+ const errors = [];
140
+ try {
141
+ for (const service of this.services.values()) {
142
+ if (service == null)
143
+ continue;
144
+ try {
145
+ if (typeof service[Symbol.asyncDispose] === "function") {
146
+ await service[Symbol.asyncDispose]();
147
+ } else if (typeof service[Symbol.dispose] === "function") {
148
+ service[Symbol.dispose]();
149
+ } else if (typeof service.dispose === "function") {
150
+ await service.dispose();
151
+ }
152
+ } catch (err) {
153
+ errors.push(err);
154
+ }
155
+ }
156
+ } finally {
157
+ this.services.clear();
158
+ this.factories.clear();
159
+ this.singletons.clear();
160
+ }
161
+ if (errors.length > 0) {
162
+ throw new AggregateError(errors, "One or more services failed to dispose");
163
+ }
164
+ }
165
+ async[Symbol.asyncDispose]() {
166
+ await this.dispose();
167
+ }
122
168
  createChildContainer() {
123
169
  const child = new Container;
124
170
  this.factories.forEach((factory, token) => {
@@ -150,6 +196,9 @@ class ServiceRegistry {
150
196
  register(token, factory, singleton = true) {
151
197
  this.container.register(token.id, factory, singleton);
152
198
  }
199
+ registerIfAbsent(token, factory, singleton = true) {
200
+ this.container.registerIfAbsent(token.id, factory, singleton);
201
+ }
153
202
  registerInstance(token, instance) {
154
203
  this.container.registerInstance(token.id, instance);
155
204
  }
@@ -159,14 +208,15 @@ class ServiceRegistry {
159
208
  has(token) {
160
209
  return this.container.has(token.id);
161
210
  }
211
+ async dispose() {
212
+ await this.container.dispose();
213
+ }
162
214
  }
163
215
  var globalServiceRegistry = new ServiceRegistry(globalContainer);
164
216
 
165
217
  // src/di/InputCompactorRegistry.ts
166
218
  var INPUT_COMPACTORS = createServiceToken("task.input.compactors");
167
- if (!globalServiceRegistry.has(INPUT_COMPACTORS)) {
168
- globalServiceRegistry.register(INPUT_COMPACTORS, () => new Map, true);
169
- }
219
+ globalServiceRegistry.registerIfAbsent(INPUT_COMPACTORS, () => new Map, true);
170
220
  function getInputCompactors() {
171
221
  return globalServiceRegistry.get(INPUT_COMPACTORS);
172
222
  }
@@ -176,9 +226,7 @@ function registerInputCompactor(formatPrefix, compactor) {
176
226
  }
177
227
  // src/di/InputResolverRegistry.ts
178
228
  var INPUT_RESOLVERS = createServiceToken("task.input.resolvers");
179
- if (!globalServiceRegistry.has(INPUT_RESOLVERS)) {
180
- globalServiceRegistry.register(INPUT_RESOLVERS, () => new Map, true);
181
- }
229
+ globalServiceRegistry.registerIfAbsent(INPUT_RESOLVERS, () => new Map, true);
182
230
  function getInputResolvers() {
183
231
  return globalServiceRegistry.get(INPUT_RESOLVERS);
184
232
  }
@@ -189,17 +237,36 @@ function registerInputResolver(formatPrefix, resolver) {
189
237
  // src/events/EventEmitter.ts
190
238
  class EventEmitter {
191
239
  listeners = {};
240
+ maxListeners = 0;
241
+ warnedEvents = new Set;
242
+ setMaxListeners(n) {
243
+ if (!Number.isFinite(n) || n < 0) {
244
+ throw new RangeError(`"n" must be a non-negative finite number. Got ${n}.`);
245
+ }
246
+ this.maxListeners = Math.trunc(n);
247
+ this.warnedEvents.clear();
248
+ return this;
249
+ }
250
+ listenerCount(event) {
251
+ return this.listeners[event]?.length ?? 0;
252
+ }
253
+ eventNames() {
254
+ return Object.keys(this.listeners).filter((k) => (this.listeners[k]?.length ?? 0) > 0);
255
+ }
192
256
  removeAllListeners(event) {
193
257
  if (event) {
194
258
  delete this.listeners[event];
259
+ this.warnedEvents.delete(event);
195
260
  } else {
196
261
  this.listeners = {};
262
+ this.warnedEvents.clear();
197
263
  }
198
264
  return this;
199
265
  }
200
266
  on(event, listener) {
201
267
  const listeners = this.listeners[event] || (this.listeners[event] = []);
202
268
  listeners.push({ listener });
269
+ this.checkMaxListeners(event, listeners.length);
203
270
  return this;
204
271
  }
205
272
  off(event, listener) {
@@ -209,12 +276,16 @@ class EventEmitter {
209
276
  const index = listeners.findIndex((l) => l.listener === listener);
210
277
  if (index >= 0) {
211
278
  listeners.splice(index, 1);
279
+ if (this.maxListeners > 0 && listeners.length <= this.maxListeners) {
280
+ this.warnedEvents.delete(event);
281
+ }
212
282
  }
213
283
  return this;
214
284
  }
215
285
  once(event, listener) {
216
286
  const listeners = this.listeners[event] || (this.listeners[event] = []);
217
287
  listeners.push({ listener, once: true });
288
+ this.checkMaxListeners(event, listeners.length);
218
289
  return this;
219
290
  }
220
291
  waitOn(event) {
@@ -238,11 +309,22 @@ class EventEmitter {
238
309
  }
239
310
  }
240
311
  this.listeners[event] = listeners.filter((l) => !l.once);
241
- if (errors.length > 0) {
312
+ if (this.maxListeners > 0 && (this.listeners[event]?.length ?? 0) <= this.maxListeners) {
313
+ this.warnedEvents.delete(event);
314
+ }
315
+ if (errors.length > 1) {
316
+ throw new AggregateError(errors, `${errors.length} listener(s) threw on "${String(event)}"`);
317
+ } else if (errors.length === 1) {
242
318
  throw errors[0];
243
319
  }
244
320
  }
245
321
  }
322
+ checkMaxListeners(event, count) {
323
+ if (this.maxListeners > 0 && count > this.maxListeners && !this.warnedEvents.has(event)) {
324
+ this.warnedEvents.add(event);
325
+ console.warn(`MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ` + `${count} listeners added for event "${String(event)}". ` + `Use setMaxListeners() to increase limit (current: ${this.maxListeners}).`);
326
+ }
327
+ }
246
328
  subscribe(event, listener) {
247
329
  this.on(event, listener);
248
330
  return () => this.off(event, listener);
@@ -415,9 +497,7 @@ function createDefaultLogger() {
415
497
  }
416
498
  return new NullLogger;
417
499
  }
418
- if (!globalServiceRegistry.has(LOGGER)) {
419
- globalServiceRegistry.register(LOGGER, createDefaultLogger, true);
420
- }
500
+ globalServiceRegistry.registerIfAbsent(LOGGER, createDefaultLogger, true);
421
501
  function getLogger() {
422
502
  return globalServiceRegistry.get(LOGGER);
423
503
  }
@@ -828,16 +908,19 @@ class WorkerManager {
828
908
  let init = this.lazyInitPromises.get(name);
829
909
  if (!init) {
830
910
  init = (async () => {
831
- const f = this.lazyFactories.get(name);
832
- this.lazyFactories.delete(name);
833
- const worker = f();
834
- this.attachWorkerInstance(name, worker);
911
+ try {
912
+ const f = this.lazyFactories.get(name);
913
+ this.lazyFactories.delete(name);
914
+ const worker = f();
915
+ this.attachWorkerInstance(name, worker);
916
+ await this.readyWorkers.get(name);
917
+ } finally {
918
+ this.lazyInitPromises.delete(name);
919
+ }
835
920
  })();
836
921
  this.lazyInitPromises.set(name, init);
837
922
  }
838
923
  await init;
839
- await this.readyWorkers.get(name);
840
- this.lazyInitPromises.delete(name);
841
924
  }
842
925
  getWorker(name) {
843
926
  const worker = this.workers.get(name);
@@ -850,7 +933,6 @@ class WorkerManager {
850
933
  const worker = this.workers.get(workerName);
851
934
  if (!worker)
852
935
  throw new Error(`Worker ${workerName} not found.`);
853
- await this.readyWorkers.get(workerName);
854
936
  const knownFunctions = this.workerFunctions.get(workerName);
855
937
  if (knownFunctions && !knownFunctions.has(functionName)) {
856
938
  throw new Error(`Function "${functionName}" is not registered on worker "${workerName}".`);
@@ -899,7 +981,6 @@ class WorkerManager {
899
981
  const worker = this.workers.get(workerName);
900
982
  if (!worker)
901
983
  return;
902
- await this.readyWorkers.get(workerName);
903
984
  const knownReactive = this.workerReactiveFunctions.get(workerName);
904
985
  if (knownReactive && !knownReactive.has(functionName))
905
986
  return;
@@ -914,6 +995,9 @@ class WorkerManager {
914
995
  resolve(data);
915
996
  } else if (type === "error") {
916
997
  cleanup();
998
+ getLogger().warn(`Worker ${workerName} reactive function ${functionName} error:`, {
999
+ error: data
1000
+ });
917
1001
  resolve(undefined);
918
1002
  }
919
1003
  };
@@ -926,12 +1010,35 @@ class WorkerManager {
926
1010
  getLogger().info(`Worker ${workerName} reactive function ${functionName} called.`);
927
1011
  });
928
1012
  }
1013
+ async terminateWorker(name) {
1014
+ const worker = this.workers.get(name);
1015
+ this.workers.delete(name);
1016
+ this.readyWorkers.delete(name);
1017
+ this.workerFunctions.delete(name);
1018
+ this.workerStreamFunctions.delete(name);
1019
+ this.workerReactiveFunctions.delete(name);
1020
+ this.lazyFactories.delete(name);
1021
+ this.lazyInitPromises.delete(name);
1022
+ try {
1023
+ if (worker && "terminate" in worker && typeof worker.terminate === "function") {
1024
+ await worker.terminate();
1025
+ }
1026
+ } catch {}
1027
+ }
1028
+ async dispose() {
1029
+ const names = [...this.workers.keys(), ...this.lazyFactories.keys()];
1030
+ for (const name of names) {
1031
+ await this.terminateWorker(name);
1032
+ }
1033
+ }
1034
+ async[Symbol.asyncDispose]() {
1035
+ await this.dispose();
1036
+ }
929
1037
  async* callWorkerStreamFunction(workerName, functionName, args, options) {
930
1038
  await this.ensureWorkerReady(workerName);
931
1039
  const worker = this.workers.get(workerName);
932
1040
  if (!worker)
933
1041
  throw new Error(`Worker ${workerName} not found.`);
934
- await this.readyWorkers.get(workerName);
935
1042
  const knownStream = this.workerStreamFunctions.get(workerName);
936
1043
  const knownFns = this.workerFunctions.get(workerName);
937
1044
  if (knownStream && knownFns && !knownStream.has(functionName) && !knownFns.has(functionName)) {
@@ -1011,8 +1118,106 @@ class WorkerManager {
1011
1118
  }
1012
1119
  var WORKER_MANAGER = createServiceToken("worker.manager");
1013
1120
  globalServiceRegistry.register(WORKER_MANAGER, () => new WorkerManager, true);
1121
+ // src/credentials/ChainedCredentialStore.ts
1122
+ class ChainedCredentialStore {
1123
+ stores;
1124
+ constructor(stores) {
1125
+ this.stores = stores;
1126
+ if (stores.length === 0) {
1127
+ throw new Error("ChainedCredentialStore requires at least one store.");
1128
+ }
1129
+ }
1130
+ async get(key) {
1131
+ for (const store of this.stores) {
1132
+ const value = await store.get(key);
1133
+ if (value !== undefined)
1134
+ return value;
1135
+ }
1136
+ return;
1137
+ }
1138
+ async put(key, value, options) {
1139
+ await this.stores[0].put(key, value, options);
1140
+ }
1141
+ async delete(key) {
1142
+ let deleted = false;
1143
+ for (const store of this.stores) {
1144
+ if (await store.delete(key)) {
1145
+ deleted = true;
1146
+ }
1147
+ }
1148
+ return deleted;
1149
+ }
1150
+ async has(key) {
1151
+ for (const store of this.stores) {
1152
+ if (await store.has(key))
1153
+ return true;
1154
+ }
1155
+ return false;
1156
+ }
1157
+ async keys() {
1158
+ const seen = new Set;
1159
+ for (const store of this.stores) {
1160
+ for (const key of await store.keys()) {
1161
+ seen.add(key);
1162
+ }
1163
+ }
1164
+ return [...seen];
1165
+ }
1166
+ async deleteAll() {
1167
+ await Promise.all(this.stores.map((s) => s.deleteAll()));
1168
+ }
1169
+ }
1170
+ // src/credentials/CredentialProviderOptions.ts
1171
+ var CREDENTIAL_PROVIDER_VALUES = [
1172
+ "none",
1173
+ "anthropic",
1174
+ "openai",
1175
+ "google",
1176
+ "huggingface",
1177
+ "custom"
1178
+ ];
1179
+ var CREDENTIAL_PROVIDER_SCHEMA_ENUM = CREDENTIAL_PROVIDER_VALUES;
1180
+ var CREDENTIAL_PROVIDER_NONE = CREDENTIAL_PROVIDER_VALUES[0];
1181
+ var CREDENTIAL_PROVIDER_OPTIONS = [
1182
+ { value: CREDENTIAL_PROVIDER_VALUES[0], label: "None" },
1183
+ { value: CREDENTIAL_PROVIDER_VALUES[1], label: "Anthropic" },
1184
+ { value: CREDENTIAL_PROVIDER_VALUES[2], label: "OpenAI" },
1185
+ { value: CREDENTIAL_PROVIDER_VALUES[3], label: "Google" },
1186
+ { value: CREDENTIAL_PROVIDER_VALUES[4], label: "Hugging Face" },
1187
+ { value: CREDENTIAL_PROVIDER_VALUES[5], label: "Custom" }
1188
+ ];
1189
+ // src/credentials/CredentialPutInputSchema.ts
1190
+ var CredentialPutInputSchema = {
1191
+ type: "object",
1192
+ properties: {
1193
+ key: {
1194
+ type: "string",
1195
+ title: "Key",
1196
+ description: 'Unique identifier (e.g. "openai-api-key")'
1197
+ },
1198
+ value: {
1199
+ type: "string",
1200
+ title: "Value",
1201
+ description: "Secret value (API key, token, or password)",
1202
+ format: "password"
1203
+ },
1204
+ label: {
1205
+ type: "string",
1206
+ title: "Label",
1207
+ description: "Human-readable label (optional)"
1208
+ },
1209
+ provider: {
1210
+ type: "string",
1211
+ title: "Provider",
1212
+ description: "Optional provider this credential is associated with",
1213
+ enum: [...CREDENTIAL_PROVIDER_SCHEMA_ENUM]
1214
+ }
1215
+ },
1216
+ required: ["key", "value"]
1217
+ };
1014
1218
  // src/credentials/ICredentialStore.ts
1015
1219
  var CREDENTIAL_STORE = createServiceToken("credential.store");
1220
+
1016
1221
  // src/credentials/InMemoryCredentialStore.ts
1017
1222
  class InMemoryCredentialStore {
1018
1223
  store = new Map;
@@ -1067,6 +1272,25 @@ class InMemoryCredentialStore {
1067
1272
  this.store.clear();
1068
1273
  }
1069
1274
  }
1275
+
1276
+ // src/credentials/CredentialStoreRegistry.ts
1277
+ globalServiceRegistry.registerIfAbsent(CREDENTIAL_STORE, () => new InMemoryCredentialStore, true);
1278
+ function getGlobalCredentialStore() {
1279
+ return globalServiceRegistry.get(CREDENTIAL_STORE);
1280
+ }
1281
+ function setGlobalCredentialStore(store) {
1282
+ globalServiceRegistry.registerInstance(CREDENTIAL_STORE, store);
1283
+ }
1284
+ async function resolveCredential(key, registry) {
1285
+ const store = registry && registry.has(CREDENTIAL_STORE) ? registry.get(CREDENTIAL_STORE) : getGlobalCredentialStore();
1286
+ return store.get(key);
1287
+ }
1288
+ registerInputResolver("credential", async (id, _format, registry) => {
1289
+ return await resolveCredential(id, registry) ?? id;
1290
+ });
1291
+ registerInputCompactor("credential", (value) => {
1292
+ return typeof value === "string" ? value : undefined;
1293
+ });
1070
1294
  // src/credentials/EnvCredentialStore.ts
1071
1295
  class EnvCredentialStore {
1072
1296
  keyToEnvVar;
@@ -1130,75 +1354,94 @@ class EnvCredentialStore {
1130
1354
  }
1131
1355
  }
1132
1356
  }
1133
- // src/credentials/ChainedCredentialStore.ts
1134
- class ChainedCredentialStore {
1135
- stores;
1136
- constructor(stores) {
1137
- this.stores = stores;
1138
- if (stores.length === 0) {
1139
- throw new Error("ChainedCredentialStore requires at least one store.");
1357
+ // src/credentials/OtpPassphraseCache.ts
1358
+ var DEFAULT_HARD_TTL_MS = 6 * 60 * 60 * 1000;
1359
+
1360
+ class OtpPassphraseCache {
1361
+ masked;
1362
+ pad;
1363
+ hardTimer;
1364
+ idleTimer;
1365
+ options;
1366
+ constructor(options) {
1367
+ this.options = options ?? {};
1368
+ }
1369
+ store(passphrase) {
1370
+ this.clearInternal(false);
1371
+ const encoder = new TextEncoder;
1372
+ const raw = encoder.encode(passphrase);
1373
+ const pad = crypto.getRandomValues(new Uint8Array(raw.length));
1374
+ const masked = new Uint8Array(raw.length);
1375
+ for (let i = 0;i < raw.length; i++) {
1376
+ masked[i] = raw[i] ^ pad[i];
1377
+ }
1378
+ raw.fill(0);
1379
+ this.masked = masked;
1380
+ this.pad = pad;
1381
+ this.startTimers();
1382
+ }
1383
+ retrieve() {
1384
+ if (!this.masked || !this.pad)
1385
+ return;
1386
+ const raw = new Uint8Array(this.masked.length);
1387
+ for (let i = 0;i < this.masked.length; i++) {
1388
+ raw[i] = this.masked[i] ^ this.pad[i];
1140
1389
  }
1390
+ const result = new TextDecoder().decode(raw);
1391
+ raw.fill(0);
1392
+ this.resetIdleTimer();
1393
+ return result;
1141
1394
  }
1142
- async get(key) {
1143
- for (const store of this.stores) {
1144
- const value = await store.get(key);
1145
- if (value !== undefined)
1146
- return value;
1147
- }
1148
- return;
1395
+ get hasValue() {
1396
+ return this.masked !== undefined && this.pad !== undefined;
1149
1397
  }
1150
- async put(key, value, options) {
1151
- await this.stores[0].put(key, value, options);
1398
+ clear() {
1399
+ this.clearInternal(true);
1152
1400
  }
1153
- async delete(key) {
1154
- let deleted = false;
1155
- for (const store of this.stores) {
1156
- if (await store.delete(key)) {
1157
- deleted = true;
1158
- }
1401
+ clearInternal(fireCallback) {
1402
+ if (this.hardTimer !== undefined) {
1403
+ clearTimeout(this.hardTimer);
1404
+ this.hardTimer = undefined;
1405
+ }
1406
+ if (this.idleTimer !== undefined) {
1407
+ clearTimeout(this.idleTimer);
1408
+ this.idleTimer = undefined;
1409
+ }
1410
+ const hadValue = this.masked !== undefined;
1411
+ if (this.masked) {
1412
+ this.masked.fill(0);
1413
+ this.masked = undefined;
1414
+ }
1415
+ if (this.pad) {
1416
+ this.pad.fill(0);
1417
+ this.pad = undefined;
1418
+ }
1419
+ if (fireCallback && hadValue && this.options.onExpiry) {
1420
+ this.options.onExpiry();
1159
1421
  }
1160
- return deleted;
1161
1422
  }
1162
- async has(key) {
1163
- for (const store of this.stores) {
1164
- if (await store.has(key))
1165
- return true;
1423
+ startTimers() {
1424
+ const hardTtl = this.options.hardTtlMs ?? DEFAULT_HARD_TTL_MS;
1425
+ this.hardTimer = setTimeout(() => this.clear(), hardTtl);
1426
+ if (typeof this.hardTimer === "object" && "unref" in this.hardTimer) {
1427
+ this.hardTimer.unref();
1166
1428
  }
1167
- return false;
1429
+ this.resetIdleTimer();
1168
1430
  }
1169
- async keys() {
1170
- const seen = new Set;
1171
- for (const store of this.stores) {
1172
- for (const key of await store.keys()) {
1173
- seen.add(key);
1431
+ resetIdleTimer() {
1432
+ if (this.idleTimer !== undefined) {
1433
+ clearTimeout(this.idleTimer);
1434
+ this.idleTimer = undefined;
1435
+ }
1436
+ const idleTtl = this.options.idleTtlMs;
1437
+ if (idleTtl !== undefined && this.masked !== undefined) {
1438
+ this.idleTimer = setTimeout(() => this.clear(), idleTtl);
1439
+ if (typeof this.idleTimer === "object" && "unref" in this.idleTimer) {
1440
+ this.idleTimer.unref();
1174
1441
  }
1175
1442
  }
1176
- return [...seen];
1177
1443
  }
1178
- async deleteAll() {
1179
- await Promise.all(this.stores.map((s) => s.deleteAll()));
1180
- }
1181
- }
1182
- // src/credentials/CredentialStoreRegistry.ts
1183
- if (!globalServiceRegistry.has(CREDENTIAL_STORE)) {
1184
- globalServiceRegistry.register(CREDENTIAL_STORE, () => new InMemoryCredentialStore, true);
1185
- }
1186
- function getGlobalCredentialStore() {
1187
- return globalServiceRegistry.get(CREDENTIAL_STORE);
1188
- }
1189
- function setGlobalCredentialStore(store) {
1190
- globalServiceRegistry.registerInstance(CREDENTIAL_STORE, store);
1191
1444
  }
1192
- async function resolveCredential(key, registry) {
1193
- const store = registry && registry.has(CREDENTIAL_STORE) ? registry.get(CREDENTIAL_STORE) : getGlobalCredentialStore();
1194
- return store.get(key);
1195
- }
1196
- registerInputResolver("credential", async (id, _format, registry) => {
1197
- return await resolveCredential(id, registry) ?? id;
1198
- });
1199
- registerInputCompactor("credential", (value) => {
1200
- return typeof value === "string" ? value : undefined;
1201
- });
1202
1445
  // src/crypto/WebCrypto.ts
1203
1446
  var SALT_LENGTH = 16;
1204
1447
  async function deriveKey(passphrase, salt) {
@@ -1398,9 +1641,7 @@ function createDefaultTelemetryProvider() {
1398
1641
  }
1399
1642
  return new NoopTelemetryProvider;
1400
1643
  }
1401
- if (!globalServiceRegistry.has(TELEMETRY_PROVIDER)) {
1402
- globalServiceRegistry.register(TELEMETRY_PROVIDER, createDefaultTelemetryProvider, true);
1403
- }
1644
+ globalServiceRegistry.registerIfAbsent(TELEMETRY_PROVIDER, createDefaultTelemetryProvider, true);
1404
1645
  function getTelemetryProvider() {
1405
1646
  return globalServiceRegistry.get(TELEMETRY_PROVIDER);
1406
1647
  }
@@ -1599,9 +1840,9 @@ class WorkerServerBase {
1599
1840
  setTimeout(() => {
1600
1841
  this.completedRequests.delete(id);
1601
1842
  }, 5000);
1602
- if (this.completedRequests.size > 1e4) {
1843
+ if (this.completedRequests.size > 1000) {
1603
1844
  const iter = this.completedRequests.values();
1604
- for (let i = 0;i < 5000; i++) {
1845
+ for (let i = 0;i < 500; i++) {
1605
1846
  const entry = iter.next();
1606
1847
  if (entry.done)
1607
1848
  break;
@@ -1667,6 +1908,7 @@ export {
1667
1908
  TELEMETRY_PROVIDER,
1668
1909
  SpanStatusCode,
1669
1910
  ServiceRegistry,
1911
+ OtpPassphraseCache,
1670
1912
  OTelTelemetryProvider,
1671
1913
  NullLogger,
1672
1914
  NoopTelemetryProvider,
@@ -1676,12 +1918,16 @@ export {
1676
1918
  INPUT_COMPACTORS,
1677
1919
  EventEmitter,
1678
1920
  EnvCredentialStore,
1921
+ CredentialPutInputSchema,
1679
1922
  Container,
1680
1923
  ConsoleTelemetryProvider,
1681
1924
  ConsoleLogger,
1682
1925
  ChainedCredentialStore,
1683
1926
  CREDENTIAL_STORE,
1927
+ CREDENTIAL_PROVIDER_SCHEMA_ENUM,
1928
+ CREDENTIAL_PROVIDER_OPTIONS,
1929
+ CREDENTIAL_PROVIDER_NONE,
1684
1930
  BaseError
1685
1931
  };
1686
1932
 
1687
- //# debugId=B4994FA32E596BD364756E2164756E21
1933
+ //# debugId=C70A02C175B2D24B64756E2164756E21