@workglow/util 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +332 -86
- package/dist/browser.js.map +17 -14
- package/dist/bun.js +332 -86
- package/dist/bun.js.map +17 -14
- package/dist/credentials/CredentialProviderOptions.d.ts +38 -0
- package/dist/credentials/CredentialProviderOptions.d.ts.map +1 -0
- package/dist/credentials/CredentialPutInputSchema.d.ts +37 -0
- package/dist/credentials/CredentialPutInputSchema.d.ts.map +1 -0
- package/dist/credentials/CredentialStoreRegistry.d.ts.map +1 -1
- package/dist/credentials/OtpPassphraseCache.d.ts +73 -0
- package/dist/credentials/OtpPassphraseCache.d.ts.map +1 -0
- package/dist/credentials/index.d.ts +6 -3
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/di/Container.d.ts +15 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/InputCompactorRegistry.d.ts.map +1 -1
- package/dist/di/InputResolverRegistry.d.ts.map +1 -1
- package/dist/di/ServiceRegistry.d.ts +11 -0
- package/dist/di/ServiceRegistry.d.ts.map +1 -1
- package/dist/events/EventEmitter.d.ts +16 -0
- package/dist/events/EventEmitter.d.ts.map +1 -1
- package/dist/graph/directedAcyclicGraph.d.ts.map +1 -1
- package/dist/graph/directedGraph.d.ts.map +1 -1
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph-entry.js +55 -18
- package/dist/graph-entry.js.map +6 -6
- package/dist/json-schema/SchemaValidation.d.ts +31 -0
- package/dist/json-schema/SchemaValidation.d.ts.map +1 -1
- package/dist/logging/LoggerRegistry.d.ts.map +1 -1
- package/dist/node.js +332 -86
- package/dist/node.js.map +17 -14
- package/dist/schema-entry.js +168 -1
- package/dist/schema-entry.js.map +4 -4
- package/dist/telemetry/TelemetryRegistry.d.ts.map +1 -1
- package/dist/vector/TypedArray.d.ts.map +1 -1
- package/dist/worker/WorkerManager.d.ts +9 -0
- package/dist/worker/WorkerManager.d.ts.map +1 -1
- package/dist/worker-browser.js +98 -25
- package/dist/worker-browser.js.map +9 -9
- package/dist/worker-bun.js +98 -25
- package/dist/worker-bun.js.map +9 -9
- package/dist/worker-node.js +98 -25
- package/dist/worker-node.js.map +9 -9
- 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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
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/
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
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
|
-
|
|
1143
|
-
|
|
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
|
-
|
|
1151
|
-
|
|
1398
|
+
clear() {
|
|
1399
|
+
this.clearInternal(true);
|
|
1152
1400
|
}
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
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
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
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
|
-
|
|
1429
|
+
this.resetIdleTimer();
|
|
1168
1430
|
}
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
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
|
-
|
|
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 >
|
|
1843
|
+
if (this.completedRequests.size > 1000) {
|
|
1603
1844
|
const iter = this.completedRequests.values();
|
|
1604
|
-
for (let i = 0;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=
|
|
1933
|
+
//# debugId=C70A02C175B2D24B64756E2164756E21
|