@workglow/util 0.1.1 → 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 +344 -80
- package/dist/browser.js.map +17 -13
- package/dist/bun.js +344 -80
- package/dist/bun.js.map +17 -13
- 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 +46 -0
- package/dist/di/InputCompactorRegistry.d.ts.map +1 -0
- 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/di/index.d.ts +1 -0
- package/dist/di/index.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 +344 -80
- package/dist/node.js.map +17 -13
- package/dist/schema-entry.js +168 -1
- package/dist/schema-entry.js.map +4 -4
- package/dist/telemetry/ITelemetryProvider.d.ts.map +1 -1
- package/dist/telemetry/TelemetryRegistry.d.ts.map +1 -1
- package/dist/vector/Tensor.d.ts.map +1 -1
- package/dist/vector/TypedArray.d.ts.map +1 -1
- package/dist/worker/Worker.browser.d.ts +1 -1
- package/dist/worker/Worker.bun.d.ts +1 -1
- package/dist/worker/WorkerManager.d.ts +9 -0
- package/dist/worker/WorkerManager.d.ts.map +1 -1
- package/dist/worker-browser.js +110 -22
- package/dist/worker-browser.js.map +10 -9
- package/dist/worker-bun.js +110 -22
- package/dist/worker-bun.js.map +10 -9
- package/dist/worker-node.js +110 -22
- package/dist/worker-node.js.map +10 -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,25 @@ 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
|
|
|
217
|
+
// src/di/InputCompactorRegistry.ts
|
|
218
|
+
var INPUT_COMPACTORS = createServiceToken("task.input.compactors");
|
|
219
|
+
globalServiceRegistry.registerIfAbsent(INPUT_COMPACTORS, () => new Map, true);
|
|
220
|
+
function getInputCompactors() {
|
|
221
|
+
return globalServiceRegistry.get(INPUT_COMPACTORS);
|
|
222
|
+
}
|
|
223
|
+
function registerInputCompactor(formatPrefix, compactor) {
|
|
224
|
+
const compactors = getInputCompactors();
|
|
225
|
+
compactors.set(formatPrefix, compactor);
|
|
226
|
+
}
|
|
165
227
|
// src/di/InputResolverRegistry.ts
|
|
166
228
|
var INPUT_RESOLVERS = createServiceToken("task.input.resolvers");
|
|
167
|
-
|
|
168
|
-
globalServiceRegistry.register(INPUT_RESOLVERS, () => new Map, true);
|
|
169
|
-
}
|
|
229
|
+
globalServiceRegistry.registerIfAbsent(INPUT_RESOLVERS, () => new Map, true);
|
|
170
230
|
function getInputResolvers() {
|
|
171
231
|
return globalServiceRegistry.get(INPUT_RESOLVERS);
|
|
172
232
|
}
|
|
@@ -177,17 +237,36 @@ function registerInputResolver(formatPrefix, resolver) {
|
|
|
177
237
|
// src/events/EventEmitter.ts
|
|
178
238
|
class EventEmitter {
|
|
179
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
|
+
}
|
|
180
256
|
removeAllListeners(event) {
|
|
181
257
|
if (event) {
|
|
182
258
|
delete this.listeners[event];
|
|
259
|
+
this.warnedEvents.delete(event);
|
|
183
260
|
} else {
|
|
184
261
|
this.listeners = {};
|
|
262
|
+
this.warnedEvents.clear();
|
|
185
263
|
}
|
|
186
264
|
return this;
|
|
187
265
|
}
|
|
188
266
|
on(event, listener) {
|
|
189
267
|
const listeners = this.listeners[event] || (this.listeners[event] = []);
|
|
190
268
|
listeners.push({ listener });
|
|
269
|
+
this.checkMaxListeners(event, listeners.length);
|
|
191
270
|
return this;
|
|
192
271
|
}
|
|
193
272
|
off(event, listener) {
|
|
@@ -197,12 +276,16 @@ class EventEmitter {
|
|
|
197
276
|
const index = listeners.findIndex((l) => l.listener === listener);
|
|
198
277
|
if (index >= 0) {
|
|
199
278
|
listeners.splice(index, 1);
|
|
279
|
+
if (this.maxListeners > 0 && listeners.length <= this.maxListeners) {
|
|
280
|
+
this.warnedEvents.delete(event);
|
|
281
|
+
}
|
|
200
282
|
}
|
|
201
283
|
return this;
|
|
202
284
|
}
|
|
203
285
|
once(event, listener) {
|
|
204
286
|
const listeners = this.listeners[event] || (this.listeners[event] = []);
|
|
205
287
|
listeners.push({ listener, once: true });
|
|
288
|
+
this.checkMaxListeners(event, listeners.length);
|
|
206
289
|
return this;
|
|
207
290
|
}
|
|
208
291
|
waitOn(event) {
|
|
@@ -226,11 +309,22 @@ class EventEmitter {
|
|
|
226
309
|
}
|
|
227
310
|
}
|
|
228
311
|
this.listeners[event] = listeners.filter((l) => !l.once);
|
|
229
|
-
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) {
|
|
230
318
|
throw errors[0];
|
|
231
319
|
}
|
|
232
320
|
}
|
|
233
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
|
+
}
|
|
234
328
|
subscribe(event, listener) {
|
|
235
329
|
this.on(event, listener);
|
|
236
330
|
return () => this.off(event, listener);
|
|
@@ -403,9 +497,7 @@ function createDefaultLogger() {
|
|
|
403
497
|
}
|
|
404
498
|
return new NullLogger;
|
|
405
499
|
}
|
|
406
|
-
|
|
407
|
-
globalServiceRegistry.register(LOGGER, createDefaultLogger, true);
|
|
408
|
-
}
|
|
500
|
+
globalServiceRegistry.registerIfAbsent(LOGGER, createDefaultLogger, true);
|
|
409
501
|
function getLogger() {
|
|
410
502
|
return globalServiceRegistry.get(LOGGER);
|
|
411
503
|
}
|
|
@@ -816,16 +908,19 @@ class WorkerManager {
|
|
|
816
908
|
let init = this.lazyInitPromises.get(name);
|
|
817
909
|
if (!init) {
|
|
818
910
|
init = (async () => {
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
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
|
+
}
|
|
823
920
|
})();
|
|
824
921
|
this.lazyInitPromises.set(name, init);
|
|
825
922
|
}
|
|
826
923
|
await init;
|
|
827
|
-
await this.readyWorkers.get(name);
|
|
828
|
-
this.lazyInitPromises.delete(name);
|
|
829
924
|
}
|
|
830
925
|
getWorker(name) {
|
|
831
926
|
const worker = this.workers.get(name);
|
|
@@ -838,7 +933,6 @@ class WorkerManager {
|
|
|
838
933
|
const worker = this.workers.get(workerName);
|
|
839
934
|
if (!worker)
|
|
840
935
|
throw new Error(`Worker ${workerName} not found.`);
|
|
841
|
-
await this.readyWorkers.get(workerName);
|
|
842
936
|
const knownFunctions = this.workerFunctions.get(workerName);
|
|
843
937
|
if (knownFunctions && !knownFunctions.has(functionName)) {
|
|
844
938
|
throw new Error(`Function "${functionName}" is not registered on worker "${workerName}".`);
|
|
@@ -887,7 +981,6 @@ class WorkerManager {
|
|
|
887
981
|
const worker = this.workers.get(workerName);
|
|
888
982
|
if (!worker)
|
|
889
983
|
return;
|
|
890
|
-
await this.readyWorkers.get(workerName);
|
|
891
984
|
const knownReactive = this.workerReactiveFunctions.get(workerName);
|
|
892
985
|
if (knownReactive && !knownReactive.has(functionName))
|
|
893
986
|
return;
|
|
@@ -902,6 +995,9 @@ class WorkerManager {
|
|
|
902
995
|
resolve(data);
|
|
903
996
|
} else if (type === "error") {
|
|
904
997
|
cleanup();
|
|
998
|
+
getLogger().warn(`Worker ${workerName} reactive function ${functionName} error:`, {
|
|
999
|
+
error: data
|
|
1000
|
+
});
|
|
905
1001
|
resolve(undefined);
|
|
906
1002
|
}
|
|
907
1003
|
};
|
|
@@ -914,12 +1010,35 @@ class WorkerManager {
|
|
|
914
1010
|
getLogger().info(`Worker ${workerName} reactive function ${functionName} called.`);
|
|
915
1011
|
});
|
|
916
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
|
+
}
|
|
917
1037
|
async* callWorkerStreamFunction(workerName, functionName, args, options) {
|
|
918
1038
|
await this.ensureWorkerReady(workerName);
|
|
919
1039
|
const worker = this.workers.get(workerName);
|
|
920
1040
|
if (!worker)
|
|
921
1041
|
throw new Error(`Worker ${workerName} not found.`);
|
|
922
|
-
await this.readyWorkers.get(workerName);
|
|
923
1042
|
const knownStream = this.workerStreamFunctions.get(workerName);
|
|
924
1043
|
const knownFns = this.workerFunctions.get(workerName);
|
|
925
1044
|
if (knownStream && knownFns && !knownStream.has(functionName) && !knownFns.has(functionName)) {
|
|
@@ -999,8 +1118,106 @@ class WorkerManager {
|
|
|
999
1118
|
}
|
|
1000
1119
|
var WORKER_MANAGER = createServiceToken("worker.manager");
|
|
1001
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
|
+
};
|
|
1002
1218
|
// src/credentials/ICredentialStore.ts
|
|
1003
1219
|
var CREDENTIAL_STORE = createServiceToken("credential.store");
|
|
1220
|
+
|
|
1004
1221
|
// src/credentials/InMemoryCredentialStore.ts
|
|
1005
1222
|
class InMemoryCredentialStore {
|
|
1006
1223
|
store = new Map;
|
|
@@ -1055,6 +1272,25 @@ class InMemoryCredentialStore {
|
|
|
1055
1272
|
this.store.clear();
|
|
1056
1273
|
}
|
|
1057
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
|
+
});
|
|
1058
1294
|
// src/credentials/EnvCredentialStore.ts
|
|
1059
1295
|
class EnvCredentialStore {
|
|
1060
1296
|
keyToEnvVar;
|
|
@@ -1118,72 +1354,94 @@ class EnvCredentialStore {
|
|
|
1118
1354
|
}
|
|
1119
1355
|
}
|
|
1120
1356
|
}
|
|
1121
|
-
// src/credentials/
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
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];
|
|
1128
1389
|
}
|
|
1390
|
+
const result = new TextDecoder().decode(raw);
|
|
1391
|
+
raw.fill(0);
|
|
1392
|
+
this.resetIdleTimer();
|
|
1393
|
+
return result;
|
|
1129
1394
|
}
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
const value = await store.get(key);
|
|
1133
|
-
if (value !== undefined)
|
|
1134
|
-
return value;
|
|
1135
|
-
}
|
|
1136
|
-
return;
|
|
1395
|
+
get hasValue() {
|
|
1396
|
+
return this.masked !== undefined && this.pad !== undefined;
|
|
1137
1397
|
}
|
|
1138
|
-
|
|
1139
|
-
|
|
1398
|
+
clear() {
|
|
1399
|
+
this.clearInternal(true);
|
|
1140
1400
|
}
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
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();
|
|
1147
1421
|
}
|
|
1148
|
-
return deleted;
|
|
1149
1422
|
}
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
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();
|
|
1154
1428
|
}
|
|
1155
|
-
|
|
1429
|
+
this.resetIdleTimer();
|
|
1156
1430
|
}
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
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();
|
|
1162
1441
|
}
|
|
1163
1442
|
}
|
|
1164
|
-
return [...seen];
|
|
1165
|
-
}
|
|
1166
|
-
async deleteAll() {
|
|
1167
|
-
await Promise.all(this.stores.map((s) => s.deleteAll()));
|
|
1168
1443
|
}
|
|
1169
1444
|
}
|
|
1170
|
-
// src/credentials/CredentialStoreRegistry.ts
|
|
1171
|
-
if (!globalServiceRegistry.has(CREDENTIAL_STORE)) {
|
|
1172
|
-
globalServiceRegistry.register(CREDENTIAL_STORE, () => new InMemoryCredentialStore, true);
|
|
1173
|
-
}
|
|
1174
|
-
function getGlobalCredentialStore() {
|
|
1175
|
-
return globalServiceRegistry.get(CREDENTIAL_STORE);
|
|
1176
|
-
}
|
|
1177
|
-
function setGlobalCredentialStore(store) {
|
|
1178
|
-
globalServiceRegistry.registerInstance(CREDENTIAL_STORE, store);
|
|
1179
|
-
}
|
|
1180
|
-
async function resolveCredential(key, registry) {
|
|
1181
|
-
const store = registry && registry.has(CREDENTIAL_STORE) ? registry.get(CREDENTIAL_STORE) : getGlobalCredentialStore();
|
|
1182
|
-
return store.get(key);
|
|
1183
|
-
}
|
|
1184
|
-
registerInputResolver("credential", async (id, _format, registry) => {
|
|
1185
|
-
return await resolveCredential(id, registry) ?? id;
|
|
1186
|
-
});
|
|
1187
1445
|
// src/crypto/WebCrypto.ts
|
|
1188
1446
|
var SALT_LENGTH = 16;
|
|
1189
1447
|
async function deriveKey(passphrase, salt) {
|
|
@@ -1383,9 +1641,7 @@ function createDefaultTelemetryProvider() {
|
|
|
1383
1641
|
}
|
|
1384
1642
|
return new NoopTelemetryProvider;
|
|
1385
1643
|
}
|
|
1386
|
-
|
|
1387
|
-
globalServiceRegistry.register(TELEMETRY_PROVIDER, createDefaultTelemetryProvider, true);
|
|
1388
|
-
}
|
|
1644
|
+
globalServiceRegistry.registerIfAbsent(TELEMETRY_PROVIDER, createDefaultTelemetryProvider, true);
|
|
1389
1645
|
function getTelemetryProvider() {
|
|
1390
1646
|
return globalServiceRegistry.get(TELEMETRY_PROVIDER);
|
|
1391
1647
|
}
|
|
@@ -1584,9 +1840,9 @@ class WorkerServerBase {
|
|
|
1584
1840
|
setTimeout(() => {
|
|
1585
1841
|
this.completedRequests.delete(id);
|
|
1586
1842
|
}, 5000);
|
|
1587
|
-
if (this.completedRequests.size >
|
|
1843
|
+
if (this.completedRequests.size > 1000) {
|
|
1588
1844
|
const iter = this.completedRequests.values();
|
|
1589
|
-
for (let i = 0;i <
|
|
1845
|
+
for (let i = 0;i < 500; i++) {
|
|
1590
1846
|
const entry = iter.next();
|
|
1591
1847
|
if (entry.done)
|
|
1592
1848
|
break;
|
|
@@ -1624,6 +1880,7 @@ export {
|
|
|
1624
1880
|
serialize,
|
|
1625
1881
|
resolveCredential,
|
|
1626
1882
|
registerInputResolver,
|
|
1883
|
+
registerInputCompactor,
|
|
1627
1884
|
parentPort,
|
|
1628
1885
|
objectOfArraysAsArrayOfObjects,
|
|
1629
1886
|
makeFingerprint,
|
|
@@ -1632,6 +1889,7 @@ export {
|
|
|
1632
1889
|
getTelemetryProvider,
|
|
1633
1890
|
getLogger,
|
|
1634
1891
|
getInputResolvers,
|
|
1892
|
+
getInputCompactors,
|
|
1635
1893
|
getGlobalCredentialStore,
|
|
1636
1894
|
forceArray,
|
|
1637
1895
|
encrypt,
|
|
@@ -1650,20 +1908,26 @@ export {
|
|
|
1650
1908
|
TELEMETRY_PROVIDER,
|
|
1651
1909
|
SpanStatusCode,
|
|
1652
1910
|
ServiceRegistry,
|
|
1911
|
+
OtpPassphraseCache,
|
|
1653
1912
|
OTelTelemetryProvider,
|
|
1654
1913
|
NullLogger,
|
|
1655
1914
|
NoopTelemetryProvider,
|
|
1656
1915
|
LOGGER,
|
|
1657
1916
|
InMemoryCredentialStore,
|
|
1658
1917
|
INPUT_RESOLVERS,
|
|
1918
|
+
INPUT_COMPACTORS,
|
|
1659
1919
|
EventEmitter,
|
|
1660
1920
|
EnvCredentialStore,
|
|
1921
|
+
CredentialPutInputSchema,
|
|
1661
1922
|
Container,
|
|
1662
1923
|
ConsoleTelemetryProvider,
|
|
1663
1924
|
ConsoleLogger,
|
|
1664
1925
|
ChainedCredentialStore,
|
|
1665
1926
|
CREDENTIAL_STORE,
|
|
1927
|
+
CREDENTIAL_PROVIDER_SCHEMA_ENUM,
|
|
1928
|
+
CREDENTIAL_PROVIDER_OPTIONS,
|
|
1929
|
+
CREDENTIAL_PROVIDER_NONE,
|
|
1666
1930
|
BaseError
|
|
1667
1931
|
};
|
|
1668
1932
|
|
|
1669
|
-
//# debugId=
|
|
1933
|
+
//# debugId=C70A02C175B2D24B64756E2164756E21
|