@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/node.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,25 @@ 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
|
|
|
216
|
+
// src/di/InputCompactorRegistry.ts
|
|
217
|
+
var INPUT_COMPACTORS = createServiceToken("task.input.compactors");
|
|
218
|
+
globalServiceRegistry.registerIfAbsent(INPUT_COMPACTORS, () => new Map, true);
|
|
219
|
+
function getInputCompactors() {
|
|
220
|
+
return globalServiceRegistry.get(INPUT_COMPACTORS);
|
|
221
|
+
}
|
|
222
|
+
function registerInputCompactor(formatPrefix, compactor) {
|
|
223
|
+
const compactors = getInputCompactors();
|
|
224
|
+
compactors.set(formatPrefix, compactor);
|
|
225
|
+
}
|
|
164
226
|
// src/di/InputResolverRegistry.ts
|
|
165
227
|
var INPUT_RESOLVERS = createServiceToken("task.input.resolvers");
|
|
166
|
-
|
|
167
|
-
globalServiceRegistry.register(INPUT_RESOLVERS, () => new Map, true);
|
|
168
|
-
}
|
|
228
|
+
globalServiceRegistry.registerIfAbsent(INPUT_RESOLVERS, () => new Map, true);
|
|
169
229
|
function getInputResolvers() {
|
|
170
230
|
return globalServiceRegistry.get(INPUT_RESOLVERS);
|
|
171
231
|
}
|
|
@@ -176,17 +236,36 @@ function registerInputResolver(formatPrefix, resolver) {
|
|
|
176
236
|
// src/events/EventEmitter.ts
|
|
177
237
|
class EventEmitter {
|
|
178
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
|
+
}
|
|
179
255
|
removeAllListeners(event) {
|
|
180
256
|
if (event) {
|
|
181
257
|
delete this.listeners[event];
|
|
258
|
+
this.warnedEvents.delete(event);
|
|
182
259
|
} else {
|
|
183
260
|
this.listeners = {};
|
|
261
|
+
this.warnedEvents.clear();
|
|
184
262
|
}
|
|
185
263
|
return this;
|
|
186
264
|
}
|
|
187
265
|
on(event, listener) {
|
|
188
266
|
const listeners = this.listeners[event] || (this.listeners[event] = []);
|
|
189
267
|
listeners.push({ listener });
|
|
268
|
+
this.checkMaxListeners(event, listeners.length);
|
|
190
269
|
return this;
|
|
191
270
|
}
|
|
192
271
|
off(event, listener) {
|
|
@@ -196,12 +275,16 @@ class EventEmitter {
|
|
|
196
275
|
const index = listeners.findIndex((l) => l.listener === listener);
|
|
197
276
|
if (index >= 0) {
|
|
198
277
|
listeners.splice(index, 1);
|
|
278
|
+
if (this.maxListeners > 0 && listeners.length <= this.maxListeners) {
|
|
279
|
+
this.warnedEvents.delete(event);
|
|
280
|
+
}
|
|
199
281
|
}
|
|
200
282
|
return this;
|
|
201
283
|
}
|
|
202
284
|
once(event, listener) {
|
|
203
285
|
const listeners = this.listeners[event] || (this.listeners[event] = []);
|
|
204
286
|
listeners.push({ listener, once: true });
|
|
287
|
+
this.checkMaxListeners(event, listeners.length);
|
|
205
288
|
return this;
|
|
206
289
|
}
|
|
207
290
|
waitOn(event) {
|
|
@@ -225,11 +308,22 @@ class EventEmitter {
|
|
|
225
308
|
}
|
|
226
309
|
}
|
|
227
310
|
this.listeners[event] = listeners.filter((l) => !l.once);
|
|
228
|
-
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) {
|
|
229
317
|
throw errors[0];
|
|
230
318
|
}
|
|
231
319
|
}
|
|
232
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
|
+
}
|
|
233
327
|
subscribe(event, listener) {
|
|
234
328
|
this.on(event, listener);
|
|
235
329
|
return () => this.off(event, listener);
|
|
@@ -402,9 +496,7 @@ function createDefaultLogger() {
|
|
|
402
496
|
}
|
|
403
497
|
return new NullLogger;
|
|
404
498
|
}
|
|
405
|
-
|
|
406
|
-
globalServiceRegistry.register(LOGGER, createDefaultLogger, true);
|
|
407
|
-
}
|
|
499
|
+
globalServiceRegistry.registerIfAbsent(LOGGER, createDefaultLogger, true);
|
|
408
500
|
function getLogger() {
|
|
409
501
|
return globalServiceRegistry.get(LOGGER);
|
|
410
502
|
}
|
|
@@ -815,16 +907,19 @@ class WorkerManager {
|
|
|
815
907
|
let init = this.lazyInitPromises.get(name);
|
|
816
908
|
if (!init) {
|
|
817
909
|
init = (async () => {
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
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
|
+
}
|
|
822
919
|
})();
|
|
823
920
|
this.lazyInitPromises.set(name, init);
|
|
824
921
|
}
|
|
825
922
|
await init;
|
|
826
|
-
await this.readyWorkers.get(name);
|
|
827
|
-
this.lazyInitPromises.delete(name);
|
|
828
923
|
}
|
|
829
924
|
getWorker(name) {
|
|
830
925
|
const worker = this.workers.get(name);
|
|
@@ -837,7 +932,6 @@ class WorkerManager {
|
|
|
837
932
|
const worker = this.workers.get(workerName);
|
|
838
933
|
if (!worker)
|
|
839
934
|
throw new Error(`Worker ${workerName} not found.`);
|
|
840
|
-
await this.readyWorkers.get(workerName);
|
|
841
935
|
const knownFunctions = this.workerFunctions.get(workerName);
|
|
842
936
|
if (knownFunctions && !knownFunctions.has(functionName)) {
|
|
843
937
|
throw new Error(`Function "${functionName}" is not registered on worker "${workerName}".`);
|
|
@@ -886,7 +980,6 @@ class WorkerManager {
|
|
|
886
980
|
const worker = this.workers.get(workerName);
|
|
887
981
|
if (!worker)
|
|
888
982
|
return;
|
|
889
|
-
await this.readyWorkers.get(workerName);
|
|
890
983
|
const knownReactive = this.workerReactiveFunctions.get(workerName);
|
|
891
984
|
if (knownReactive && !knownReactive.has(functionName))
|
|
892
985
|
return;
|
|
@@ -901,6 +994,9 @@ class WorkerManager {
|
|
|
901
994
|
resolve(data);
|
|
902
995
|
} else if (type === "error") {
|
|
903
996
|
cleanup();
|
|
997
|
+
getLogger().warn(`Worker ${workerName} reactive function ${functionName} error:`, {
|
|
998
|
+
error: data
|
|
999
|
+
});
|
|
904
1000
|
resolve(undefined);
|
|
905
1001
|
}
|
|
906
1002
|
};
|
|
@@ -913,12 +1009,35 @@ class WorkerManager {
|
|
|
913
1009
|
getLogger().info(`Worker ${workerName} reactive function ${functionName} called.`);
|
|
914
1010
|
});
|
|
915
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
|
+
}
|
|
916
1036
|
async* callWorkerStreamFunction(workerName, functionName, args, options) {
|
|
917
1037
|
await this.ensureWorkerReady(workerName);
|
|
918
1038
|
const worker = this.workers.get(workerName);
|
|
919
1039
|
if (!worker)
|
|
920
1040
|
throw new Error(`Worker ${workerName} not found.`);
|
|
921
|
-
await this.readyWorkers.get(workerName);
|
|
922
1041
|
const knownStream = this.workerStreamFunctions.get(workerName);
|
|
923
1042
|
const knownFns = this.workerFunctions.get(workerName);
|
|
924
1043
|
if (knownStream && knownFns && !knownStream.has(functionName) && !knownFns.has(functionName)) {
|
|
@@ -998,8 +1117,106 @@ class WorkerManager {
|
|
|
998
1117
|
}
|
|
999
1118
|
var WORKER_MANAGER = createServiceToken("worker.manager");
|
|
1000
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
|
+
};
|
|
1001
1217
|
// src/credentials/ICredentialStore.ts
|
|
1002
1218
|
var CREDENTIAL_STORE = createServiceToken("credential.store");
|
|
1219
|
+
|
|
1003
1220
|
// src/credentials/InMemoryCredentialStore.ts
|
|
1004
1221
|
class InMemoryCredentialStore {
|
|
1005
1222
|
store = new Map;
|
|
@@ -1054,6 +1271,25 @@ class InMemoryCredentialStore {
|
|
|
1054
1271
|
this.store.clear();
|
|
1055
1272
|
}
|
|
1056
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
|
+
});
|
|
1057
1293
|
// src/credentials/EnvCredentialStore.ts
|
|
1058
1294
|
class EnvCredentialStore {
|
|
1059
1295
|
keyToEnvVar;
|
|
@@ -1117,72 +1353,94 @@ class EnvCredentialStore {
|
|
|
1117
1353
|
}
|
|
1118
1354
|
}
|
|
1119
1355
|
}
|
|
1120
|
-
// src/credentials/
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
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];
|
|
1127
1388
|
}
|
|
1389
|
+
const result = new TextDecoder().decode(raw);
|
|
1390
|
+
raw.fill(0);
|
|
1391
|
+
this.resetIdleTimer();
|
|
1392
|
+
return result;
|
|
1128
1393
|
}
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
const value = await store.get(key);
|
|
1132
|
-
if (value !== undefined)
|
|
1133
|
-
return value;
|
|
1134
|
-
}
|
|
1135
|
-
return;
|
|
1394
|
+
get hasValue() {
|
|
1395
|
+
return this.masked !== undefined && this.pad !== undefined;
|
|
1136
1396
|
}
|
|
1137
|
-
|
|
1138
|
-
|
|
1397
|
+
clear() {
|
|
1398
|
+
this.clearInternal(true);
|
|
1139
1399
|
}
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
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();
|
|
1146
1420
|
}
|
|
1147
|
-
return deleted;
|
|
1148
1421
|
}
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
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();
|
|
1153
1427
|
}
|
|
1154
|
-
|
|
1428
|
+
this.resetIdleTimer();
|
|
1155
1429
|
}
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
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();
|
|
1161
1440
|
}
|
|
1162
1441
|
}
|
|
1163
|
-
return [...seen];
|
|
1164
|
-
}
|
|
1165
|
-
async deleteAll() {
|
|
1166
|
-
await Promise.all(this.stores.map((s) => s.deleteAll()));
|
|
1167
1442
|
}
|
|
1168
1443
|
}
|
|
1169
|
-
// src/credentials/CredentialStoreRegistry.ts
|
|
1170
|
-
if (!globalServiceRegistry.has(CREDENTIAL_STORE)) {
|
|
1171
|
-
globalServiceRegistry.register(CREDENTIAL_STORE, () => new InMemoryCredentialStore, true);
|
|
1172
|
-
}
|
|
1173
|
-
function getGlobalCredentialStore() {
|
|
1174
|
-
return globalServiceRegistry.get(CREDENTIAL_STORE);
|
|
1175
|
-
}
|
|
1176
|
-
function setGlobalCredentialStore(store) {
|
|
1177
|
-
globalServiceRegistry.registerInstance(CREDENTIAL_STORE, store);
|
|
1178
|
-
}
|
|
1179
|
-
async function resolveCredential(key, registry) {
|
|
1180
|
-
const store = registry && registry.has(CREDENTIAL_STORE) ? registry.get(CREDENTIAL_STORE) : getGlobalCredentialStore();
|
|
1181
|
-
return store.get(key);
|
|
1182
|
-
}
|
|
1183
|
-
registerInputResolver("credential", async (id, _format, registry) => {
|
|
1184
|
-
return await resolveCredential(id, registry) ?? id;
|
|
1185
|
-
});
|
|
1186
1444
|
// src/crypto/WebCrypto.ts
|
|
1187
1445
|
var SALT_LENGTH = 16;
|
|
1188
1446
|
async function deriveKey(passphrase, salt) {
|
|
@@ -1382,9 +1640,7 @@ function createDefaultTelemetryProvider() {
|
|
|
1382
1640
|
}
|
|
1383
1641
|
return new NoopTelemetryProvider;
|
|
1384
1642
|
}
|
|
1385
|
-
|
|
1386
|
-
globalServiceRegistry.register(TELEMETRY_PROVIDER, createDefaultTelemetryProvider, true);
|
|
1387
|
-
}
|
|
1643
|
+
globalServiceRegistry.registerIfAbsent(TELEMETRY_PROVIDER, createDefaultTelemetryProvider, true);
|
|
1388
1644
|
function getTelemetryProvider() {
|
|
1389
1645
|
return globalServiceRegistry.get(TELEMETRY_PROVIDER);
|
|
1390
1646
|
}
|
|
@@ -1588,9 +1844,9 @@ class WorkerServerBase {
|
|
|
1588
1844
|
setTimeout(() => {
|
|
1589
1845
|
this.completedRequests.delete(id);
|
|
1590
1846
|
}, 5000);
|
|
1591
|
-
if (this.completedRequests.size >
|
|
1847
|
+
if (this.completedRequests.size > 1000) {
|
|
1592
1848
|
const iter = this.completedRequests.values();
|
|
1593
|
-
for (let i = 0;i <
|
|
1849
|
+
for (let i = 0;i < 500; i++) {
|
|
1594
1850
|
const entry = iter.next();
|
|
1595
1851
|
if (entry.done)
|
|
1596
1852
|
break;
|
|
@@ -1645,6 +1901,7 @@ export {
|
|
|
1645
1901
|
serialize,
|
|
1646
1902
|
resolveCredential,
|
|
1647
1903
|
registerInputResolver,
|
|
1904
|
+
registerInputCompactor,
|
|
1648
1905
|
parentPort,
|
|
1649
1906
|
objectOfArraysAsArrayOfObjects,
|
|
1650
1907
|
makeFingerprint,
|
|
@@ -1653,6 +1910,7 @@ export {
|
|
|
1653
1910
|
getTelemetryProvider,
|
|
1654
1911
|
getLogger,
|
|
1655
1912
|
getInputResolvers,
|
|
1913
|
+
getInputCompactors,
|
|
1656
1914
|
getGlobalCredentialStore,
|
|
1657
1915
|
forceArray,
|
|
1658
1916
|
encrypt,
|
|
@@ -1671,20 +1929,26 @@ export {
|
|
|
1671
1929
|
TELEMETRY_PROVIDER,
|
|
1672
1930
|
SpanStatusCode,
|
|
1673
1931
|
ServiceRegistry,
|
|
1932
|
+
OtpPassphraseCache,
|
|
1674
1933
|
OTelTelemetryProvider,
|
|
1675
1934
|
NullLogger,
|
|
1676
1935
|
NoopTelemetryProvider,
|
|
1677
1936
|
LOGGER,
|
|
1678
1937
|
InMemoryCredentialStore,
|
|
1679
1938
|
INPUT_RESOLVERS,
|
|
1939
|
+
INPUT_COMPACTORS,
|
|
1680
1940
|
EventEmitter,
|
|
1681
1941
|
EnvCredentialStore,
|
|
1942
|
+
CredentialPutInputSchema,
|
|
1682
1943
|
Container,
|
|
1683
1944
|
ConsoleTelemetryProvider,
|
|
1684
1945
|
ConsoleLogger,
|
|
1685
1946
|
ChainedCredentialStore,
|
|
1686
1947
|
CREDENTIAL_STORE,
|
|
1948
|
+
CREDENTIAL_PROVIDER_SCHEMA_ENUM,
|
|
1949
|
+
CREDENTIAL_PROVIDER_OPTIONS,
|
|
1950
|
+
CREDENTIAL_PROVIDER_NONE,
|
|
1687
1951
|
BaseError
|
|
1688
1952
|
};
|
|
1689
1953
|
|
|
1690
|
-
//# debugId=
|
|
1954
|
+
//# debugId=4E655B5EF37DCACC64756E2164756E21
|