@kya-os/mcp-i-core 1.1.13-canary.2 → 1.2.1-canary.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/__tests__/utils/mock-providers.d.ts +5 -3
- package/dist/__tests__/utils/mock-providers.d.ts.map +1 -1
- package/dist/__tests__/utils/mock-providers.js +23 -12
- package/dist/__tests__/utils/mock-providers.js.map +1 -1
- package/dist/index.d.ts +33 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +18 -3
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +5 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/memory.d.ts +2 -2
- package/dist/providers/memory.d.ts.map +1 -1
- package/dist/providers/memory.js +9 -5
- package/dist/providers/memory.js.map +1 -1
- package/dist/runtime/base.d.ts +40 -1
- package/dist/runtime/base.d.ts.map +1 -1
- package/dist/runtime/base.js +148 -20
- package/dist/runtime/base.js.map +1 -1
- package/dist/services/access-control.service.d.ts +121 -0
- package/dist/services/access-control.service.d.ts.map +1 -0
- package/dist/services/access-control.service.js +458 -0
- package/dist/services/access-control.service.js.map +1 -0
- package/dist/services/crypto.service.d.ts +69 -0
- package/dist/services/crypto.service.d.ts.map +1 -0
- package/dist/services/crypto.service.js +225 -0
- package/dist/services/crypto.service.js.map +1 -0
- package/dist/services/errors.d.ts +49 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +66 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/index.d.ts +5 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/proof-verifier.d.ts +98 -0
- package/dist/services/proof-verifier.d.ts.map +1 -0
- package/dist/services/proof-verifier.js +319 -0
- package/dist/services/proof-verifier.js.map +1 -0
- package/dist/services/storage.service.d.ts +116 -0
- package/dist/services/storage.service.d.ts.map +1 -0
- package/dist/services/storage.service.js +405 -0
- package/dist/services/storage.service.js.map +1 -0
- package/dist/utils/base64.d.ts +31 -0
- package/dist/utils/base64.d.ts.map +1 -0
- package/dist/utils/base64.js +138 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/storage-keys.d.ts +120 -0
- package/dist/utils/storage-keys.d.ts.map +1 -0
- package/dist/utils/storage-keys.js +217 -0
- package/dist/utils/storage-keys.js.map +1 -0
- package/package.json +5 -4
- package/dist/compliance/schema-verifier-v2.d.ts +0 -110
- package/dist/compliance/schema-verifier-v2.d.ts.map +0 -1
- package/dist/compliance/schema-verifier-v2.js +0 -510
- package/dist/compliance/schema-verifier-v2.js.map +0 -1
- package/dist/did/resolver.d.ts +0 -92
- package/dist/did/resolver.d.ts.map +0 -1
- package/dist/did/resolver.js +0 -203
- package/dist/did/resolver.js.map +0 -1
- package/dist/proof/proof-engine.d.ts +0 -89
- package/dist/proof/proof-engine.d.ts.map +0 -1
- package/dist/proof/proof-engine.js +0 -249
- package/dist/proof/proof-engine.js.map +0 -1
- package/dist/runtime/base-v2.d.ts +0 -117
- package/dist/runtime/base-v2.d.ts.map +0 -1
- package/dist/runtime/base-v2.js +0 -328
- package/dist/runtime/base-v2.js.map +0 -1
- package/dist/types/providers.d.ts +0 -142
- package/dist/types/providers.d.ts.map +0 -1
- package/dist/types/providers.js +0 -43
- package/dist/types/providers.js.map +0 -1
- package/dist/verification/interfaces.d.ts +0 -125
- package/dist/verification/interfaces.d.ts.map +0 -1
- package/dist/verification/interfaces.js +0 -101
- package/dist/verification/interfaces.js.map +0 -1
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Storage Service Factory
|
|
4
|
+
*
|
|
5
|
+
* Auto-selects storage providers based on available configuration.
|
|
6
|
+
* Priority: Redis > Cloudflare KV > Cloudflare Durable Objects > Memory
|
|
7
|
+
*
|
|
8
|
+
* @package @kya-os/mcp-i-core
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.StorageKeyHelpers = void 0;
|
|
12
|
+
exports.createStorageProviders = createStorageProviders;
|
|
13
|
+
exports.migrateLegacyKeys = migrateLegacyKeys;
|
|
14
|
+
const base_js_1 = require("../providers/base.js");
|
|
15
|
+
const memory_js_1 = require("../providers/memory.js");
|
|
16
|
+
/**
|
|
17
|
+
* Key helper functions for consistent key formatting
|
|
18
|
+
*/
|
|
19
|
+
class StorageKeyHelpers {
|
|
20
|
+
/**
|
|
21
|
+
* Build delegation key using composite format
|
|
22
|
+
* Format: delegation:${userDid}:${agentDid}:${projectId}
|
|
23
|
+
*/
|
|
24
|
+
static buildDelegationKey(userDid, agentDid, projectId) {
|
|
25
|
+
return `delegation:${userDid}:${agentDid}:${projectId}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Build session key
|
|
29
|
+
* Format: session:${sessionId}
|
|
30
|
+
*/
|
|
31
|
+
static buildSessionKey(sessionId) {
|
|
32
|
+
return `session:${sessionId}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build nonce key
|
|
36
|
+
* Format: nonce:${agentDid}:${nonce}
|
|
37
|
+
*/
|
|
38
|
+
static buildNonceKey(agentDid, nonce) {
|
|
39
|
+
return `nonce:${agentDid}:${nonce}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse delegation key back into components
|
|
43
|
+
*
|
|
44
|
+
* Format: delegation:${userDid}:${agentDid}:${projectId}
|
|
45
|
+
*
|
|
46
|
+
* Note: DIDs contain colons (e.g., did:key:z123), so we can't simply split by ":"
|
|
47
|
+
* Instead, we:
|
|
48
|
+
* 1. Check that key starts with "delegation:"
|
|
49
|
+
* 2. Take the last part as projectId (doesn't contain colons)
|
|
50
|
+
* 3. Find where agentDid starts (look for "did:" pattern)
|
|
51
|
+
* 4. Everything before agentDid is userDid, everything between agentDid and projectId is agentDid
|
|
52
|
+
*
|
|
53
|
+
* Strategy: Since DIDs always start with "did:", we can find the second occurrence of "did:"
|
|
54
|
+
* to determine where agentDid begins. However, this assumes userDid and agentDid both start with "did:".
|
|
55
|
+
*
|
|
56
|
+
* For keys like "delegation:did:key:user123:did:key:agent456:project-789":
|
|
57
|
+
* - Remove "delegation:" prefix → "did:key:user123:did:key:agent456:project-789"
|
|
58
|
+
* - Find last ":" → separates agentDid from projectId
|
|
59
|
+
* - projectId = "project-789"
|
|
60
|
+
* - Find second occurrence of "did:" → separates userDid from agentDid
|
|
61
|
+
* - userDid = "did:key:user123"
|
|
62
|
+
* - agentDid = "did:key:agent456"
|
|
63
|
+
*/
|
|
64
|
+
static parseDelegationKey(key) {
|
|
65
|
+
if (!key.startsWith("delegation:")) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
// Remove "delegation:" prefix
|
|
69
|
+
const rest = key.slice("delegation:".length);
|
|
70
|
+
// Find the last colon (separates agentDid from projectId)
|
|
71
|
+
const lastColonIndex = rest.lastIndexOf(":");
|
|
72
|
+
if (lastColonIndex === -1) {
|
|
73
|
+
return null; // No colon found, invalid format
|
|
74
|
+
}
|
|
75
|
+
// Last part is projectId (doesn't contain colons)
|
|
76
|
+
const projectId = rest.slice(lastColonIndex + 1);
|
|
77
|
+
if (!projectId) {
|
|
78
|
+
return null; // Empty projectId
|
|
79
|
+
}
|
|
80
|
+
// Everything before the last colon is userDid:agentDid
|
|
81
|
+
const userDidAndAgentDid = rest.slice(0, lastColonIndex);
|
|
82
|
+
// Find the second occurrence of "did:" to separate userDid from agentDid
|
|
83
|
+
// First occurrence is at the start (userDid), second is agentDid
|
|
84
|
+
const firstDidIndex = userDidAndAgentDid.indexOf("did:");
|
|
85
|
+
if (firstDidIndex !== 0) {
|
|
86
|
+
return null; // userDid must start with "did:"
|
|
87
|
+
}
|
|
88
|
+
// Find where the first DID ends by looking for the pattern "did:method:identifier"
|
|
89
|
+
// A DID has the format: did:method:identifier (where identifier may contain colons)
|
|
90
|
+
// We need to find the next "did:" that appears after a complete DID
|
|
91
|
+
// Strategy: Find the method separator colon (after "did:"), then search for the next "did:" after that
|
|
92
|
+
// This ensures we find the second complete DID, not a substring within the first DID's identifier
|
|
93
|
+
const firstMethodColon = userDidAndAgentDid.indexOf(":", firstDidIndex + "did:".length);
|
|
94
|
+
if (firstMethodColon === -1) {
|
|
95
|
+
return null; // Invalid DID format - no method separator
|
|
96
|
+
}
|
|
97
|
+
// Now search for the next "did:" after the first complete DID
|
|
98
|
+
// The first DID ends somewhere after the method colon, so search from there
|
|
99
|
+
const secondDidIndex = userDidAndAgentDid.indexOf("did:", firstMethodColon + 1);
|
|
100
|
+
if (secondDidIndex === -1) {
|
|
101
|
+
return null; // No second "did:" found, can't separate userDid and agentDid
|
|
102
|
+
}
|
|
103
|
+
// userDid is everything before the second "did:", agentDid is everything after
|
|
104
|
+
const userDid = userDidAndAgentDid.slice(0, secondDidIndex);
|
|
105
|
+
const agentDid = userDidAndAgentDid.slice(secondDidIndex);
|
|
106
|
+
// Remove trailing colon from userDid if present
|
|
107
|
+
const cleanUserDid = userDid.endsWith(":") ? userDid.slice(0, -1) : userDid;
|
|
108
|
+
if (!cleanUserDid || !agentDid) {
|
|
109
|
+
return null; // Empty userDid or agentDid
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
userDid: cleanUserDid,
|
|
113
|
+
agentDid,
|
|
114
|
+
projectId,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.StorageKeyHelpers = StorageKeyHelpers;
|
|
119
|
+
/**
|
|
120
|
+
* Durable Object Storage Provider
|
|
121
|
+
* Wraps Cloudflare Durable Object state storage
|
|
122
|
+
*/
|
|
123
|
+
class DurableObjectStorageProvider extends base_js_1.StorageProvider {
|
|
124
|
+
state;
|
|
125
|
+
constructor(state) {
|
|
126
|
+
super();
|
|
127
|
+
this.state = state;
|
|
128
|
+
}
|
|
129
|
+
async get(key) {
|
|
130
|
+
const value = await this.state.storage.get(key);
|
|
131
|
+
return value ?? null;
|
|
132
|
+
}
|
|
133
|
+
async set(key, value) {
|
|
134
|
+
await this.state.storage.put(key, value);
|
|
135
|
+
}
|
|
136
|
+
async delete(key) {
|
|
137
|
+
await this.state.storage.delete(key);
|
|
138
|
+
}
|
|
139
|
+
async exists(key) {
|
|
140
|
+
const value = await this.state.storage.get(key);
|
|
141
|
+
return value !== undefined;
|
|
142
|
+
}
|
|
143
|
+
async list(prefix) {
|
|
144
|
+
const result = await this.state.storage.list(prefix ? { prefix } : undefined);
|
|
145
|
+
return Array.from(result.keys());
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Durable Object Nonce Cache Provider
|
|
150
|
+
*/
|
|
151
|
+
class DurableObjectNonceCacheProvider extends base_js_1.NonceCacheProvider {
|
|
152
|
+
state;
|
|
153
|
+
constructor(state) {
|
|
154
|
+
super();
|
|
155
|
+
this.state = state;
|
|
156
|
+
}
|
|
157
|
+
async has(nonce, agentDid) {
|
|
158
|
+
const key = agentDid
|
|
159
|
+
? StorageKeyHelpers.buildNonceKey(agentDid, nonce)
|
|
160
|
+
: `nonce:${nonce}`;
|
|
161
|
+
const value = await this.state.storage.get(key);
|
|
162
|
+
if (!value) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const expiresAt = parseInt(value, 10);
|
|
166
|
+
return Date.now() < expiresAt;
|
|
167
|
+
}
|
|
168
|
+
async add(nonce, ttlSeconds, agentDid) {
|
|
169
|
+
const key = agentDid
|
|
170
|
+
? StorageKeyHelpers.buildNonceKey(agentDid, nonce)
|
|
171
|
+
: `nonce:${nonce}`;
|
|
172
|
+
// Convert TTL seconds to absolute expiration timestamp for storage
|
|
173
|
+
const expiresAt = Date.now() + (ttlSeconds * 1000);
|
|
174
|
+
await this.state.storage.put(key, expiresAt.toString());
|
|
175
|
+
}
|
|
176
|
+
async cleanup() {
|
|
177
|
+
// Durable Objects don't support efficient bulk operations
|
|
178
|
+
// Cleanup would require listing all keys, which is expensive
|
|
179
|
+
// For now, rely on TTL checking in has() method
|
|
180
|
+
}
|
|
181
|
+
async destroy() {
|
|
182
|
+
// Durable Objects state persists automatically
|
|
183
|
+
// No explicit cleanup needed
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Redis Storage Provider
|
|
188
|
+
* Uses Redis for storage operations
|
|
189
|
+
*/
|
|
190
|
+
class RedisStorageProvider extends base_js_1.StorageProvider {
|
|
191
|
+
redis; // Redis client from 'redis' package
|
|
192
|
+
constructor(redisClient) {
|
|
193
|
+
super();
|
|
194
|
+
this.redis = redisClient;
|
|
195
|
+
}
|
|
196
|
+
async get(key) {
|
|
197
|
+
return await this.redis.get(key);
|
|
198
|
+
}
|
|
199
|
+
async set(key, value) {
|
|
200
|
+
await this.redis.set(key, value);
|
|
201
|
+
}
|
|
202
|
+
async delete(key) {
|
|
203
|
+
await this.redis.del(key);
|
|
204
|
+
}
|
|
205
|
+
async exists(key) {
|
|
206
|
+
const result = await this.redis.exists(key);
|
|
207
|
+
return result === 1;
|
|
208
|
+
}
|
|
209
|
+
async list(prefix) {
|
|
210
|
+
const pattern = prefix ? `${prefix}*` : "*";
|
|
211
|
+
const keys = await this.redis.keys(pattern);
|
|
212
|
+
return keys;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Redis Nonce Cache Provider
|
|
217
|
+
*/
|
|
218
|
+
class RedisNonceCacheProvider extends base_js_1.NonceCacheProvider {
|
|
219
|
+
redis;
|
|
220
|
+
keyPrefix;
|
|
221
|
+
constructor(redisClient, keyPrefix = "nonce:") {
|
|
222
|
+
super();
|
|
223
|
+
this.redis = redisClient;
|
|
224
|
+
this.keyPrefix = keyPrefix;
|
|
225
|
+
}
|
|
226
|
+
async has(nonce, agentDid) {
|
|
227
|
+
const key = agentDid
|
|
228
|
+
? StorageKeyHelpers.buildNonceKey(agentDid, nonce)
|
|
229
|
+
: `${this.keyPrefix}${nonce}`;
|
|
230
|
+
const result = await this.redis.exists(key);
|
|
231
|
+
return result === 1;
|
|
232
|
+
}
|
|
233
|
+
async add(nonce, ttlSeconds, agentDid) {
|
|
234
|
+
const key = agentDid
|
|
235
|
+
? StorageKeyHelpers.buildNonceKey(agentDid, nonce)
|
|
236
|
+
: `${this.keyPrefix}${nonce}`;
|
|
237
|
+
// Use TTL directly in seconds (callers now pass TTL, not absolute timestamp)
|
|
238
|
+
await this.redis.setEx(key, ttlSeconds, "1");
|
|
239
|
+
}
|
|
240
|
+
async cleanup() {
|
|
241
|
+
// Redis handles TTL automatically, no cleanup needed
|
|
242
|
+
}
|
|
243
|
+
async destroy() {
|
|
244
|
+
// Redis connection should be managed by caller
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* KV Storage Provider wrapper
|
|
249
|
+
* Uses existing KVStorageProvider from mcp-i-cloudflare
|
|
250
|
+
*/
|
|
251
|
+
/**
|
|
252
|
+
* Create Cloudflare KV storage providers
|
|
253
|
+
*
|
|
254
|
+
* This function dynamically imports Cloudflare-specific storage providers.
|
|
255
|
+
* The @ts-ignore is necessary because @kya-os/mcp-i-cloudflare/providers/storage
|
|
256
|
+
* is an optional dependency that may not exist in Node.js environments.
|
|
257
|
+
* This is intentional for platform-specific code - the import will fail at runtime
|
|
258
|
+
* if the module doesn't exist, which is handled by the try-catch block.
|
|
259
|
+
*/
|
|
260
|
+
async function createKVStorageProvider(kvNamespace) {
|
|
261
|
+
// Dynamic import to avoid bundling Cloudflare-specific code
|
|
262
|
+
// This is an optional dependency that may not exist in all environments
|
|
263
|
+
try {
|
|
264
|
+
// Use string literal to avoid TypeScript checking the module path at compile time
|
|
265
|
+
const storageModulePath = "@kya-os/mcp-i-cloudflare/providers/storage";
|
|
266
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
267
|
+
// @ts-ignore TS2307 - Optional dependency: @kya-os/mcp-i-cloudflare/providers/storage
|
|
268
|
+
// may not exist in Node.js environments. This is intentional for platform-specific code.
|
|
269
|
+
const { KVStorageProvider, KVNonceCacheProvider } = await import(storageModulePath);
|
|
270
|
+
const storage = new KVStorageProvider(kvNamespace);
|
|
271
|
+
const nonceCache = new KVNonceCacheProvider(kvNamespace);
|
|
272
|
+
return { storage, nonceCache };
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
throw new Error(`Failed to import Cloudflare storage providers: ${error instanceof Error ? error.message : String(error)}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create storage providers based on configuration
|
|
280
|
+
*
|
|
281
|
+
* Priority order:
|
|
282
|
+
* 1. Redis (if redisUrl provided)
|
|
283
|
+
* 2. Cloudflare KV (if kvNamespace provided)
|
|
284
|
+
* 3. Cloudflare Durable Objects (if durableObjectState provided)
|
|
285
|
+
* 4. In-memory fallback (if fallbackToMemory is true, default)
|
|
286
|
+
*/
|
|
287
|
+
async function createStorageProviders(config) {
|
|
288
|
+
const fallbackToMemory = config.fallbackToMemory !== false;
|
|
289
|
+
// Priority 1: Redis
|
|
290
|
+
if (config.redisUrl) {
|
|
291
|
+
try {
|
|
292
|
+
// @ts-expect-error TS2307 - Optional dependency: 'redis' package may not be installed.
|
|
293
|
+
// This is intentional for environments that don't use Redis storage.
|
|
294
|
+
const redisModule = await import("redis").catch(() => null);
|
|
295
|
+
if (!redisModule) {
|
|
296
|
+
throw new Error("Redis package not available");
|
|
297
|
+
}
|
|
298
|
+
const { createClient } = redisModule;
|
|
299
|
+
const redis = createClient({
|
|
300
|
+
url: config.redisUrl,
|
|
301
|
+
socket: {
|
|
302
|
+
connectTimeout: 5000,
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
await redis.connect();
|
|
306
|
+
await redis.ping();
|
|
307
|
+
const storageProvider = new RedisStorageProvider(redis);
|
|
308
|
+
const nonceCacheProvider = new RedisNonceCacheProvider(redis);
|
|
309
|
+
return {
|
|
310
|
+
storageProvider,
|
|
311
|
+
nonceCacheProvider,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
if (!fallbackToMemory) {
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
console.warn("[StorageService] Failed to connect to Redis, falling back to memory:", error instanceof Error ? error.message : String(error));
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// Priority 2: Cloudflare KV
|
|
322
|
+
if (config.kvNamespace) {
|
|
323
|
+
try {
|
|
324
|
+
const providers = await createKVStorageProvider(config.kvNamespace);
|
|
325
|
+
return {
|
|
326
|
+
storageProvider: providers.storage,
|
|
327
|
+
nonceCacheProvider: providers.nonceCache,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
if (!fallbackToMemory) {
|
|
332
|
+
throw error;
|
|
333
|
+
}
|
|
334
|
+
console.warn("[StorageService] Failed to initialize KV, falling back to memory:", error instanceof Error ? error.message : String(error));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Priority 3: Cloudflare Durable Objects
|
|
338
|
+
if (config.durableObjectState) {
|
|
339
|
+
try {
|
|
340
|
+
const storageProvider = new DurableObjectStorageProvider(config.durableObjectState);
|
|
341
|
+
const nonceCacheProvider = new DurableObjectNonceCacheProvider(config.durableObjectState);
|
|
342
|
+
return {
|
|
343
|
+
storageProvider,
|
|
344
|
+
nonceCacheProvider,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
if (!fallbackToMemory) {
|
|
349
|
+
throw error;
|
|
350
|
+
}
|
|
351
|
+
console.warn("[StorageService] Failed to initialize Durable Objects, falling back to memory:", error instanceof Error ? error.message : String(error));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Priority 4: In-memory fallback
|
|
355
|
+
if (fallbackToMemory) {
|
|
356
|
+
return {
|
|
357
|
+
storageProvider: new memory_js_1.MemoryStorageProvider(),
|
|
358
|
+
nonceCacheProvider: new memory_js_1.MemoryNonceCacheProvider(),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
throw new Error("No storage provider configured and fallbackToMemory is false");
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Migration utility for legacy key formats
|
|
365
|
+
*
|
|
366
|
+
* Migrates keys from old format (e.g., `agent:${did}:delegation`) to new composite format
|
|
367
|
+
*/
|
|
368
|
+
async function migrateLegacyKeys(oldKeyPrefix, newKeyFormat, storageProvider, batchSize = 100) {
|
|
369
|
+
let migrated = 0;
|
|
370
|
+
try {
|
|
371
|
+
// List all keys with old prefix
|
|
372
|
+
const oldKeys = await storageProvider.list(oldKeyPrefix);
|
|
373
|
+
for (const oldKey of oldKeys) {
|
|
374
|
+
const newKey = newKeyFormat(oldKey);
|
|
375
|
+
if (!newKey) {
|
|
376
|
+
continue; // Skip if transformation fails
|
|
377
|
+
}
|
|
378
|
+
// Check if new key already exists
|
|
379
|
+
const existing = await storageProvider.exists(newKey);
|
|
380
|
+
if (existing) {
|
|
381
|
+
continue; // Skip if already migrated
|
|
382
|
+
}
|
|
383
|
+
// Read old value
|
|
384
|
+
const value = await storageProvider.get(oldKey);
|
|
385
|
+
if (!value) {
|
|
386
|
+
continue; // Skip if old key has no value
|
|
387
|
+
}
|
|
388
|
+
// Write to new key
|
|
389
|
+
await storageProvider.set(newKey, value);
|
|
390
|
+
// Optionally delete old key (commented out for safety)
|
|
391
|
+
// await storageProvider.delete(oldKey);
|
|
392
|
+
migrated++;
|
|
393
|
+
if (migrated % batchSize === 0) {
|
|
394
|
+
// Yield to event loop for large migrations
|
|
395
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
catch (error) {
|
|
400
|
+
console.error("[StorageService] Migration error:", error);
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
return migrated;
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=storage.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base64URL Encoding/Decoding Utilities
|
|
3
|
+
*
|
|
4
|
+
* Environment-aware base64url helpers that work in both Node.js and Cloudflare Workers.
|
|
5
|
+
* Uses Buffer in Node.js, TextEncoder/Decoder fallback for Workers.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Decode base64url string to string
|
|
9
|
+
*/
|
|
10
|
+
export declare function base64urlDecodeToString(input: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Decode base64url string to Uint8Array
|
|
13
|
+
*/
|
|
14
|
+
export declare function base64urlDecodeToBytes(input: string): Uint8Array;
|
|
15
|
+
/**
|
|
16
|
+
* Encode string to base64url
|
|
17
|
+
*/
|
|
18
|
+
export declare function base64urlEncodeFromString(input: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Encode Uint8Array to base64url
|
|
21
|
+
*/
|
|
22
|
+
export declare function base64urlEncodeFromBytes(bytes: Uint8Array): string;
|
|
23
|
+
/**
|
|
24
|
+
* Convert bytes to standard base64 (not base64url)
|
|
25
|
+
*/
|
|
26
|
+
export declare function bytesToBase64(bytes: Uint8Array): string;
|
|
27
|
+
/**
|
|
28
|
+
* Convert standard base64 to bytes
|
|
29
|
+
*/
|
|
30
|
+
export declare function base64ToBytes(base64: string): Uint8Array;
|
|
31
|
+
//# sourceMappingURL=base64.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA+B7D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAuBhE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU/D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAalE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAWvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAaxD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base64URL Encoding/Decoding Utilities
|
|
4
|
+
*
|
|
5
|
+
* Environment-aware base64url helpers that work in both Node.js and Cloudflare Workers.
|
|
6
|
+
* Uses Buffer in Node.js, TextEncoder/Decoder fallback for Workers.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.base64urlDecodeToString = base64urlDecodeToString;
|
|
10
|
+
exports.base64urlDecodeToBytes = base64urlDecodeToBytes;
|
|
11
|
+
exports.base64urlEncodeFromString = base64urlEncodeFromString;
|
|
12
|
+
exports.base64urlEncodeFromBytes = base64urlEncodeFromBytes;
|
|
13
|
+
exports.bytesToBase64 = bytesToBase64;
|
|
14
|
+
exports.base64ToBytes = base64ToBytes;
|
|
15
|
+
/**
|
|
16
|
+
* Decode base64url string to string
|
|
17
|
+
*/
|
|
18
|
+
function base64urlDecodeToString(input) {
|
|
19
|
+
const padded = addPadding(input);
|
|
20
|
+
const base64 = padded.replace(/-/g, "+").replace(/_/g, "/");
|
|
21
|
+
// For platforms that don't have Buffer (e.g., Cloudflare Workers)
|
|
22
|
+
if (typeof atob !== "undefined") {
|
|
23
|
+
try {
|
|
24
|
+
return atob(base64);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new Error(`Invalid base64url string: ${error instanceof Error ? error.message : String(error)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// For Node.js environments - Buffer.from doesn't throw for invalid base64
|
|
31
|
+
// We need to validate by checking if the input contains only valid base64 characters
|
|
32
|
+
// Base64 characters: A-Z, a-z, 0-9, +, /, = (padding)
|
|
33
|
+
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
34
|
+
if (!base64Regex.test(base64)) {
|
|
35
|
+
throw new Error("Invalid base64url string: contains invalid characters");
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const decoded = Buffer.from(base64, "base64").toString("utf-8");
|
|
39
|
+
return decoded;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new Error(`Invalid base64url string: ${error instanceof Error ? error.message : String(error)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Decode base64url string to Uint8Array
|
|
47
|
+
*/
|
|
48
|
+
function base64urlDecodeToBytes(input) {
|
|
49
|
+
const padded = addPadding(input);
|
|
50
|
+
const base64 = padded.replace(/-/g, "+").replace(/_/g, "/");
|
|
51
|
+
// For platforms that don't have Buffer (e.g., Cloudflare Workers)
|
|
52
|
+
if (typeof atob !== "undefined") {
|
|
53
|
+
try {
|
|
54
|
+
const binaryString = atob(base64);
|
|
55
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
56
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
57
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
58
|
+
}
|
|
59
|
+
return bytes;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new Error(`Invalid base64url string: ${error instanceof Error ? error.message : String(error)}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// For Node.js environments - Buffer.from doesn't throw, so we can't validate here
|
|
66
|
+
// The caller should validate the result if needed
|
|
67
|
+
return new Uint8Array(Buffer.from(base64, "base64"));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Encode string to base64url
|
|
71
|
+
*/
|
|
72
|
+
function base64urlEncodeFromString(input) {
|
|
73
|
+
// For platforms that don't have Buffer
|
|
74
|
+
if (typeof btoa !== "undefined") {
|
|
75
|
+
const base64 = btoa(input);
|
|
76
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
77
|
+
}
|
|
78
|
+
// For Node.js environments
|
|
79
|
+
const base64 = Buffer.from(input, "utf-8").toString("base64");
|
|
80
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Encode Uint8Array to base64url
|
|
84
|
+
*/
|
|
85
|
+
function base64urlEncodeFromBytes(bytes) {
|
|
86
|
+
// For platforms that don't have Buffer
|
|
87
|
+
if (typeof btoa !== "undefined") {
|
|
88
|
+
const binaryString = Array.from(bytes)
|
|
89
|
+
.map((byte) => String.fromCharCode(byte))
|
|
90
|
+
.join("");
|
|
91
|
+
const base64 = btoa(binaryString);
|
|
92
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
93
|
+
}
|
|
94
|
+
// For Node.js environments
|
|
95
|
+
const base64 = Buffer.from(bytes).toString("base64");
|
|
96
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Convert bytes to standard base64 (not base64url)
|
|
100
|
+
*/
|
|
101
|
+
function bytesToBase64(bytes) {
|
|
102
|
+
// For platforms that don't have Buffer
|
|
103
|
+
if (typeof btoa !== "undefined") {
|
|
104
|
+
const binaryString = Array.from(bytes)
|
|
105
|
+
.map((byte) => String.fromCharCode(byte))
|
|
106
|
+
.join("");
|
|
107
|
+
return btoa(binaryString);
|
|
108
|
+
}
|
|
109
|
+
// For Node.js environments
|
|
110
|
+
return Buffer.from(bytes).toString("base64");
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Convert standard base64 to bytes
|
|
114
|
+
*/
|
|
115
|
+
function base64ToBytes(base64) {
|
|
116
|
+
// For platforms that don't have Buffer
|
|
117
|
+
if (typeof atob !== "undefined") {
|
|
118
|
+
const binaryString = atob(base64);
|
|
119
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
120
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
121
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
122
|
+
}
|
|
123
|
+
return bytes;
|
|
124
|
+
}
|
|
125
|
+
// For Node.js environments
|
|
126
|
+
return new Uint8Array(Buffer.from(base64, "base64"));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Add padding to base64url string if needed
|
|
130
|
+
*/
|
|
131
|
+
function addPadding(input) {
|
|
132
|
+
const remainder = input.length % 4;
|
|
133
|
+
if (remainder === 0) {
|
|
134
|
+
return input;
|
|
135
|
+
}
|
|
136
|
+
return input + "=".repeat((4 - remainder) % 4);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=base64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/utils/base64.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAKH,0DA+BC;AAKD,wDAuBC;AAKD,8DAUC;AAKD,4DAaC;AAKD,sCAWC;AAKD,sCAaC;AAjID;;GAEG;AACH,SAAgB,uBAAuB,CAAC,KAAa;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE5D,kEAAkE;IAClE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,qFAAqF;IACrF,sDAAsD;IACtD,MAAM,WAAW,GAAG,wBAAwB,CAAC;IAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAE5D,kEAAkE;IAClE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,kDAAkD;IAClD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CAAC,KAAa;IACrD,uCAAuC;IACvC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,KAAiB;IACxD,uCAAuC;IACvC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACxC,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAiB;IAC7C,uCAAuC;IACvC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aACnC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACxC,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,2BAA2B;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,MAAc;IAC1C,uCAAuC;IACvC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2BAA2B;IAC3B,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -18,4 +18,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
20
|
__exportStar(require("./cors"), exports);
|
|
21
|
+
__exportStar(require("./base64"), exports);
|
|
22
|
+
__exportStar(require("./storage-keys"), exports);
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,yCAAuB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,yCAAuB;AACvB,2CAAyB;AACzB,iDAA+B"}
|