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