@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/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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
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/
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
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
|
-
|
|
1142
|
-
|
|
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
|
-
|
|
1150
|
-
|
|
1397
|
+
clear() {
|
|
1398
|
+
this.clearInternal(true);
|
|
1151
1399
|
}
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
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
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
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
|
-
|
|
1428
|
+
this.resetIdleTimer();
|
|
1167
1429
|
}
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
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
|
-
|
|
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 >
|
|
1842
|
+
if (this.completedRequests.size > 1000) {
|
|
1602
1843
|
const iter = this.completedRequests.values();
|
|
1603
|
-
for (let i = 0;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=
|
|
1932
|
+
//# debugId=F3EE4A1B6E6F8E6A64756E2164756E21
|