@push.rocks/smartregistry 1.1.1

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.
Files changed (52) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/classes.smartregistry.d.ts +45 -0
  4. package/dist_ts/classes.smartregistry.js +113 -0
  5. package/dist_ts/core/classes.authmanager.d.ts +108 -0
  6. package/dist_ts/core/classes.authmanager.js +315 -0
  7. package/dist_ts/core/classes.baseregistry.d.ts +28 -0
  8. package/dist_ts/core/classes.baseregistry.js +6 -0
  9. package/dist_ts/core/classes.registrystorage.d.ts +109 -0
  10. package/dist_ts/core/classes.registrystorage.js +226 -0
  11. package/dist_ts/core/index.d.ts +7 -0
  12. package/dist_ts/core/index.js +10 -0
  13. package/dist_ts/core/interfaces.core.d.ts +142 -0
  14. package/dist_ts/core/interfaces.core.js +5 -0
  15. package/dist_ts/index.d.ts +8 -0
  16. package/dist_ts/index.js +13 -0
  17. package/dist_ts/npm/classes.npmregistry.d.ts +36 -0
  18. package/dist_ts/npm/classes.npmregistry.js +717 -0
  19. package/dist_ts/npm/index.d.ts +5 -0
  20. package/dist_ts/npm/index.js +6 -0
  21. package/dist_ts/npm/interfaces.npm.d.ts +245 -0
  22. package/dist_ts/npm/interfaces.npm.js +6 -0
  23. package/dist_ts/oci/classes.ociregistry.d.ts +43 -0
  24. package/dist_ts/oci/classes.ociregistry.js +565 -0
  25. package/dist_ts/oci/index.d.ts +5 -0
  26. package/dist_ts/oci/index.js +6 -0
  27. package/dist_ts/oci/interfaces.oci.d.ts +103 -0
  28. package/dist_ts/oci/interfaces.oci.js +5 -0
  29. package/dist_ts/paths.d.ts +1 -0
  30. package/dist_ts/paths.js +3 -0
  31. package/dist_ts/plugins.d.ts +6 -0
  32. package/dist_ts/plugins.js +9 -0
  33. package/npmextra.json +18 -0
  34. package/package.json +49 -0
  35. package/readme.hints.md +3 -0
  36. package/readme.md +486 -0
  37. package/ts/00_commitinfo_data.ts +8 -0
  38. package/ts/classes.smartregistry.ts +129 -0
  39. package/ts/core/classes.authmanager.ts +388 -0
  40. package/ts/core/classes.baseregistry.ts +36 -0
  41. package/ts/core/classes.registrystorage.ts +270 -0
  42. package/ts/core/index.ts +11 -0
  43. package/ts/core/interfaces.core.ts +159 -0
  44. package/ts/index.ts +16 -0
  45. package/ts/npm/classes.npmregistry.ts +890 -0
  46. package/ts/npm/index.ts +6 -0
  47. package/ts/npm/interfaces.npm.ts +263 -0
  48. package/ts/oci/classes.ociregistry.ts +734 -0
  49. package/ts/oci/index.ts +6 -0
  50. package/ts/oci/interfaces.oci.ts +101 -0
  51. package/ts/paths.ts +5 -0
  52. package/ts/plugins.ts +11 -0
@@ -0,0 +1,565 @@
1
+ import { BaseRegistry } from '../core/classes.baseregistry.js';
2
+ import { RegistryStorage } from '../core/classes.registrystorage.js';
3
+ import { AuthManager } from '../core/classes.authmanager.js';
4
+ /**
5
+ * OCI Distribution Specification v1.1 compliant registry
6
+ */
7
+ export class OciRegistry extends BaseRegistry {
8
+ storage;
9
+ authManager;
10
+ uploadSessions = new Map();
11
+ basePath = '/oci';
12
+ cleanupInterval;
13
+ constructor(storage, authManager, basePath = '/oci') {
14
+ super();
15
+ this.storage = storage;
16
+ this.authManager = authManager;
17
+ this.basePath = basePath;
18
+ }
19
+ async init() {
20
+ // Start cleanup of stale upload sessions
21
+ this.startUploadSessionCleanup();
22
+ }
23
+ getBasePath() {
24
+ return this.basePath;
25
+ }
26
+ async handleRequest(context) {
27
+ // Remove base path from URL
28
+ const path = context.path.replace(this.basePath, '');
29
+ // Extract token from Authorization header
30
+ const authHeader = context.headers['authorization'] || context.headers['Authorization'];
31
+ const tokenString = authHeader?.replace(/^Bearer\s+/i, '');
32
+ const token = tokenString ? await this.authManager.validateToken(tokenString, 'oci') : null;
33
+ // Route to appropriate handler
34
+ if (path === '/v2/' || path === '/v2') {
35
+ return this.handleVersionCheck();
36
+ }
37
+ // Manifest operations: /v2/{name}/manifests/{reference}
38
+ const manifestMatch = path.match(/^\/v2\/([^\/]+(?:\/[^\/]+)*)\/manifests\/([^\/]+)$/);
39
+ if (manifestMatch) {
40
+ const [, name, reference] = manifestMatch;
41
+ return this.handleManifestRequest(context.method, name, reference, token, context.body, context.headers);
42
+ }
43
+ // Blob operations: /v2/{name}/blobs/{digest}
44
+ const blobMatch = path.match(/^\/v2\/([^\/]+(?:\/[^\/]+)*)\/blobs\/(sha256:[a-f0-9]{64})$/);
45
+ if (blobMatch) {
46
+ const [, name, digest] = blobMatch;
47
+ return this.handleBlobRequest(context.method, name, digest, token, context.headers);
48
+ }
49
+ // Blob upload operations: /v2/{name}/blobs/uploads/
50
+ const uploadInitMatch = path.match(/^\/v2\/([^\/]+(?:\/[^\/]+)*)\/blobs\/uploads\/?$/);
51
+ if (uploadInitMatch && context.method === 'POST') {
52
+ const [, name] = uploadInitMatch;
53
+ return this.handleUploadInit(name, token, context.query, context.body);
54
+ }
55
+ // Blob upload operations: /v2/{name}/blobs/uploads/{uuid}
56
+ const uploadMatch = path.match(/^\/v2\/([^\/]+(?:\/[^\/]+)*)\/blobs\/uploads\/([^\/]+)$/);
57
+ if (uploadMatch) {
58
+ const [, name, uploadId] = uploadMatch;
59
+ return this.handleUploadSession(context.method, uploadId, token, context);
60
+ }
61
+ // Tags list: /v2/{name}/tags/list
62
+ const tagsMatch = path.match(/^\/v2\/([^\/]+(?:\/[^\/]+)*)\/tags\/list$/);
63
+ if (tagsMatch) {
64
+ const [, name] = tagsMatch;
65
+ return this.handleTagsList(name, token, context.query);
66
+ }
67
+ // Referrers: /v2/{name}/referrers/{digest}
68
+ const referrersMatch = path.match(/^\/v2\/([^\/]+(?:\/[^\/]+)*)\/referrers\/(sha256:[a-f0-9]{64})$/);
69
+ if (referrersMatch) {
70
+ const [, name, digest] = referrersMatch;
71
+ return this.handleReferrers(name, digest, token, context.query);
72
+ }
73
+ return {
74
+ status: 404,
75
+ headers: { 'Content-Type': 'application/json' },
76
+ body: this.createError('NOT_FOUND', 'Endpoint not found'),
77
+ };
78
+ }
79
+ async checkPermission(token, resource, action) {
80
+ if (!token)
81
+ return false;
82
+ return this.authManager.authorize(token, `oci:repository:${resource}`, action);
83
+ }
84
+ // ========================================================================
85
+ // REQUEST HANDLERS
86
+ // ========================================================================
87
+ handleVersionCheck() {
88
+ return {
89
+ status: 200,
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ 'Docker-Distribution-API-Version': 'registry/2.0',
93
+ },
94
+ body: {},
95
+ };
96
+ }
97
+ async handleManifestRequest(method, repository, reference, token, body, headers) {
98
+ switch (method) {
99
+ case 'GET':
100
+ return this.getManifest(repository, reference, token, headers);
101
+ case 'HEAD':
102
+ return this.headManifest(repository, reference, token);
103
+ case 'PUT':
104
+ return this.putManifest(repository, reference, token, body, headers);
105
+ case 'DELETE':
106
+ return this.deleteManifest(repository, reference, token);
107
+ default:
108
+ return {
109
+ status: 405,
110
+ headers: {},
111
+ body: this.createError('UNSUPPORTED', 'Method not allowed'),
112
+ };
113
+ }
114
+ }
115
+ async handleBlobRequest(method, repository, digest, token, headers) {
116
+ switch (method) {
117
+ case 'GET':
118
+ return this.getBlob(repository, digest, token, headers['range'] || headers['Range']);
119
+ case 'HEAD':
120
+ return this.headBlob(repository, digest, token);
121
+ case 'DELETE':
122
+ return this.deleteBlob(repository, digest, token);
123
+ default:
124
+ return {
125
+ status: 405,
126
+ headers: {},
127
+ body: this.createError('UNSUPPORTED', 'Method not allowed'),
128
+ };
129
+ }
130
+ }
131
+ async handleUploadInit(repository, token, query, body) {
132
+ if (!await this.checkPermission(token, repository, 'push')) {
133
+ return {
134
+ status: 401,
135
+ headers: {},
136
+ body: this.createError('DENIED', 'Insufficient permissions'),
137
+ };
138
+ }
139
+ // Check for monolithic upload (digest + body provided)
140
+ const digest = query.digest;
141
+ if (digest && body) {
142
+ // Monolithic upload: complete upload in single POST
143
+ const blobData = Buffer.isBuffer(body) ? body : Buffer.from(JSON.stringify(body));
144
+ // Verify digest
145
+ const calculatedDigest = await this.calculateDigest(blobData);
146
+ if (calculatedDigest !== digest) {
147
+ return {
148
+ status: 400,
149
+ headers: {},
150
+ body: this.createError('DIGEST_INVALID', 'Provided digest does not match uploaded content'),
151
+ };
152
+ }
153
+ // Store the blob
154
+ await this.storage.putOciBlob(digest, blobData);
155
+ return {
156
+ status: 201,
157
+ headers: {
158
+ 'Location': `${this.basePath}/v2/${repository}/blobs/${digest}`,
159
+ 'Docker-Content-Digest': digest,
160
+ },
161
+ body: null,
162
+ };
163
+ }
164
+ // Standard chunked upload: create session
165
+ const uploadId = this.generateUploadId();
166
+ const session = {
167
+ uploadId,
168
+ repository,
169
+ chunks: [],
170
+ totalSize: 0,
171
+ createdAt: new Date(),
172
+ lastActivity: new Date(),
173
+ };
174
+ this.uploadSessions.set(uploadId, session);
175
+ return {
176
+ status: 202,
177
+ headers: {
178
+ 'Location': `${this.basePath}/v2/${repository}/blobs/uploads/${uploadId}`,
179
+ 'Docker-Upload-UUID': uploadId,
180
+ },
181
+ body: null,
182
+ };
183
+ }
184
+ async handleUploadSession(method, uploadId, token, context) {
185
+ const session = this.uploadSessions.get(uploadId);
186
+ if (!session) {
187
+ return {
188
+ status: 404,
189
+ headers: {},
190
+ body: this.createError('BLOB_UPLOAD_INVALID', 'Upload session not found'),
191
+ };
192
+ }
193
+ if (!await this.checkPermission(token, session.repository, 'push')) {
194
+ return {
195
+ status: 401,
196
+ headers: {},
197
+ body: this.createError('DENIED', 'Insufficient permissions'),
198
+ };
199
+ }
200
+ switch (method) {
201
+ case 'PATCH':
202
+ return this.uploadChunk(uploadId, context.body, context.headers['content-range']);
203
+ case 'PUT':
204
+ return this.completeUpload(uploadId, context.query['digest'], context.body);
205
+ case 'GET':
206
+ return this.getUploadStatus(uploadId);
207
+ default:
208
+ return {
209
+ status: 405,
210
+ headers: {},
211
+ body: this.createError('UNSUPPORTED', 'Method not allowed'),
212
+ };
213
+ }
214
+ }
215
+ // Continuing with the actual OCI operations implementation...
216
+ // (The rest follows the same pattern as before, adapted to return IResponse objects)
217
+ async getManifest(repository, reference, token, headers) {
218
+ if (!await this.checkPermission(token, repository, 'pull')) {
219
+ return {
220
+ status: 401,
221
+ headers: {
222
+ 'WWW-Authenticate': `Bearer realm="${this.basePath}/v2/token",service="registry",scope="repository:${repository}:pull"`,
223
+ },
224
+ body: this.createError('DENIED', 'Insufficient permissions'),
225
+ };
226
+ }
227
+ // Resolve tag to digest if needed
228
+ let digest = reference;
229
+ if (!reference.startsWith('sha256:')) {
230
+ const tags = await this.getTagsData(repository);
231
+ digest = tags[reference];
232
+ if (!digest) {
233
+ return {
234
+ status: 404,
235
+ headers: {},
236
+ body: this.createError('MANIFEST_UNKNOWN', 'Manifest not found'),
237
+ };
238
+ }
239
+ }
240
+ const manifestData = await this.storage.getOciManifest(repository, digest);
241
+ if (!manifestData) {
242
+ return {
243
+ status: 404,
244
+ headers: {},
245
+ body: this.createError('MANIFEST_UNKNOWN', 'Manifest not found'),
246
+ };
247
+ }
248
+ return {
249
+ status: 200,
250
+ headers: {
251
+ 'Content-Type': 'application/vnd.oci.image.manifest.v1+json',
252
+ 'Docker-Content-Digest': digest,
253
+ },
254
+ body: manifestData,
255
+ };
256
+ }
257
+ async headManifest(repository, reference, token) {
258
+ if (!await this.checkPermission(token, repository, 'pull')) {
259
+ return {
260
+ status: 401,
261
+ headers: {},
262
+ body: null,
263
+ };
264
+ }
265
+ // Similar logic as getManifest but return headers only
266
+ let digest = reference;
267
+ if (!reference.startsWith('sha256:')) {
268
+ const tags = await this.getTagsData(repository);
269
+ digest = tags[reference];
270
+ if (!digest) {
271
+ return { status: 404, headers: {}, body: null };
272
+ }
273
+ }
274
+ const exists = await this.storage.ociManifestExists(repository, digest);
275
+ if (!exists) {
276
+ return { status: 404, headers: {}, body: null };
277
+ }
278
+ const manifestData = await this.storage.getOciManifest(repository, digest);
279
+ return {
280
+ status: 200,
281
+ headers: {
282
+ 'Content-Type': 'application/vnd.oci.image.manifest.v1+json',
283
+ 'Docker-Content-Digest': digest,
284
+ 'Content-Length': manifestData ? manifestData.length.toString() : '0',
285
+ },
286
+ body: null,
287
+ };
288
+ }
289
+ async putManifest(repository, reference, token, body, headers) {
290
+ if (!await this.checkPermission(token, repository, 'push')) {
291
+ return {
292
+ status: 401,
293
+ headers: {
294
+ 'WWW-Authenticate': `Bearer realm="${this.basePath}/v2/token",service="registry",scope="repository:${repository}:push"`,
295
+ },
296
+ body: this.createError('DENIED', 'Insufficient permissions'),
297
+ };
298
+ }
299
+ if (!body) {
300
+ return {
301
+ status: 400,
302
+ headers: {},
303
+ body: this.createError('MANIFEST_INVALID', 'Manifest body is required'),
304
+ };
305
+ }
306
+ const manifestData = Buffer.isBuffer(body) ? body : Buffer.from(JSON.stringify(body));
307
+ const contentType = headers?.['content-type'] || headers?.['Content-Type'] || 'application/vnd.oci.image.manifest.v1+json';
308
+ // Calculate manifest digest
309
+ const digest = await this.calculateDigest(manifestData);
310
+ // Store manifest by digest
311
+ await this.storage.putOciManifest(repository, digest, manifestData, contentType);
312
+ // If reference is a tag (not a digest), update tags mapping
313
+ if (!reference.startsWith('sha256:')) {
314
+ const tags = await this.getTagsData(repository);
315
+ tags[reference] = digest;
316
+ const tagsPath = `oci/tags/${repository}/tags.json`;
317
+ await this.storage.putObject(tagsPath, Buffer.from(JSON.stringify(tags), 'utf-8'));
318
+ }
319
+ return {
320
+ status: 201,
321
+ headers: {
322
+ 'Location': `${this.basePath}/v2/${repository}/manifests/${digest}`,
323
+ 'Docker-Content-Digest': digest,
324
+ },
325
+ body: null,
326
+ };
327
+ }
328
+ async deleteManifest(repository, digest, token) {
329
+ if (!digest.startsWith('sha256:')) {
330
+ return {
331
+ status: 400,
332
+ headers: {},
333
+ body: this.createError('UNSUPPORTED', 'Must use digest for deletion'),
334
+ };
335
+ }
336
+ if (!await this.checkPermission(token, repository, 'delete')) {
337
+ return {
338
+ status: 401,
339
+ headers: {},
340
+ body: this.createError('DENIED', 'Insufficient permissions'),
341
+ };
342
+ }
343
+ await this.storage.deleteOciManifest(repository, digest);
344
+ return {
345
+ status: 202,
346
+ headers: {},
347
+ body: null,
348
+ };
349
+ }
350
+ async getBlob(repository, digest, token, range) {
351
+ if (!await this.checkPermission(token, repository, 'pull')) {
352
+ return {
353
+ status: 401,
354
+ headers: {},
355
+ body: this.createError('DENIED', 'Insufficient permissions'),
356
+ };
357
+ }
358
+ const data = await this.storage.getOciBlob(digest);
359
+ if (!data) {
360
+ return {
361
+ status: 404,
362
+ headers: {},
363
+ body: this.createError('BLOB_UNKNOWN', 'Blob not found'),
364
+ };
365
+ }
366
+ return {
367
+ status: 200,
368
+ headers: {
369
+ 'Content-Type': 'application/octet-stream',
370
+ 'Docker-Content-Digest': digest,
371
+ },
372
+ body: data,
373
+ };
374
+ }
375
+ async headBlob(repository, digest, token) {
376
+ if (!await this.checkPermission(token, repository, 'pull')) {
377
+ return { status: 401, headers: {}, body: null };
378
+ }
379
+ const exists = await this.storage.ociBlobExists(digest);
380
+ if (!exists) {
381
+ return { status: 404, headers: {}, body: null };
382
+ }
383
+ const blob = await this.storage.getOciBlob(digest);
384
+ return {
385
+ status: 200,
386
+ headers: {
387
+ 'Content-Length': blob ? blob.length.toString() : '0',
388
+ 'Docker-Content-Digest': digest,
389
+ },
390
+ body: null,
391
+ };
392
+ }
393
+ async deleteBlob(repository, digest, token) {
394
+ if (!await this.checkPermission(token, repository, 'delete')) {
395
+ return {
396
+ status: 401,
397
+ headers: {},
398
+ body: this.createError('DENIED', 'Insufficient permissions'),
399
+ };
400
+ }
401
+ await this.storage.deleteOciBlob(digest);
402
+ return {
403
+ status: 202,
404
+ headers: {},
405
+ body: null,
406
+ };
407
+ }
408
+ async uploadChunk(uploadId, data, contentRange) {
409
+ const session = this.uploadSessions.get(uploadId);
410
+ if (!session) {
411
+ return {
412
+ status: 404,
413
+ headers: {},
414
+ body: this.createError('BLOB_UPLOAD_INVALID', 'Upload session not found'),
415
+ };
416
+ }
417
+ session.chunks.push(data);
418
+ session.totalSize += data.length;
419
+ session.lastActivity = new Date();
420
+ return {
421
+ status: 202,
422
+ headers: {
423
+ 'Location': `${this.basePath}/v2/${session.repository}/blobs/uploads/${uploadId}`,
424
+ 'Range': `0-${session.totalSize - 1}`,
425
+ 'Docker-Upload-UUID': uploadId,
426
+ },
427
+ body: null,
428
+ };
429
+ }
430
+ async completeUpload(uploadId, digest, finalData) {
431
+ const session = this.uploadSessions.get(uploadId);
432
+ if (!session) {
433
+ return {
434
+ status: 404,
435
+ headers: {},
436
+ body: this.createError('BLOB_UPLOAD_INVALID', 'Upload session not found'),
437
+ };
438
+ }
439
+ const chunks = [...session.chunks];
440
+ if (finalData)
441
+ chunks.push(finalData);
442
+ const blobData = Buffer.concat(chunks);
443
+ // Verify digest
444
+ const calculatedDigest = await this.calculateDigest(blobData);
445
+ if (calculatedDigest !== digest) {
446
+ return {
447
+ status: 400,
448
+ headers: {},
449
+ body: this.createError('DIGEST_INVALID', 'Digest mismatch'),
450
+ };
451
+ }
452
+ await this.storage.putOciBlob(digest, blobData);
453
+ this.uploadSessions.delete(uploadId);
454
+ return {
455
+ status: 201,
456
+ headers: {
457
+ 'Location': `${this.basePath}/v2/${session.repository}/blobs/${digest}`,
458
+ 'Docker-Content-Digest': digest,
459
+ },
460
+ body: null,
461
+ };
462
+ }
463
+ async getUploadStatus(uploadId) {
464
+ const session = this.uploadSessions.get(uploadId);
465
+ if (!session) {
466
+ return {
467
+ status: 404,
468
+ headers: {},
469
+ body: this.createError('BLOB_UPLOAD_INVALID', 'Upload session not found'),
470
+ };
471
+ }
472
+ return {
473
+ status: 204,
474
+ headers: {
475
+ 'Location': `${this.basePath}/v2/${session.repository}/blobs/uploads/${uploadId}`,
476
+ 'Range': session.totalSize > 0 ? `0-${session.totalSize - 1}` : '0-0',
477
+ 'Docker-Upload-UUID': uploadId,
478
+ },
479
+ body: null,
480
+ };
481
+ }
482
+ async handleTagsList(repository, token, query) {
483
+ if (!await this.checkPermission(token, repository, 'pull')) {
484
+ return {
485
+ status: 401,
486
+ headers: {},
487
+ body: this.createError('DENIED', 'Insufficient permissions'),
488
+ };
489
+ }
490
+ const tags = await this.getTagsData(repository);
491
+ const tagNames = Object.keys(tags);
492
+ const response = {
493
+ name: repository,
494
+ tags: tagNames,
495
+ };
496
+ return {
497
+ status: 200,
498
+ headers: { 'Content-Type': 'application/json' },
499
+ body: response,
500
+ };
501
+ }
502
+ async handleReferrers(repository, digest, token, query) {
503
+ if (!await this.checkPermission(token, repository, 'pull')) {
504
+ return {
505
+ status: 401,
506
+ headers: {},
507
+ body: this.createError('DENIED', 'Insufficient permissions'),
508
+ };
509
+ }
510
+ const response = {
511
+ schemaVersion: 2,
512
+ mediaType: 'application/vnd.oci.image.index.v1+json',
513
+ manifests: [],
514
+ };
515
+ return {
516
+ status: 200,
517
+ headers: { 'Content-Type': 'application/json' },
518
+ body: response,
519
+ };
520
+ }
521
+ // ========================================================================
522
+ // HELPER METHODS
523
+ // ========================================================================
524
+ async getTagsData(repository) {
525
+ const path = `oci/tags/${repository}/tags.json`;
526
+ const data = await this.storage.getObject(path);
527
+ return data ? JSON.parse(data.toString('utf-8')) : {};
528
+ }
529
+ async putTagsData(repository, tags) {
530
+ const path = `oci/tags/${repository}/tags.json`;
531
+ const data = Buffer.from(JSON.stringify(tags, null, 2), 'utf-8');
532
+ await this.storage.putObject(path, data);
533
+ }
534
+ generateUploadId() {
535
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
536
+ }
537
+ async calculateDigest(data) {
538
+ const crypto = await import('crypto');
539
+ const hash = crypto.createHash('sha256').update(data).digest('hex');
540
+ return `sha256:${hash}`;
541
+ }
542
+ createError(code, message, detail) {
543
+ return {
544
+ errors: [{ code, message, detail }],
545
+ };
546
+ }
547
+ startUploadSessionCleanup() {
548
+ this.cleanupInterval = setInterval(() => {
549
+ const now = new Date();
550
+ const maxAge = 60 * 60 * 1000; // 1 hour
551
+ for (const [uploadId, session] of this.uploadSessions.entries()) {
552
+ if (now.getTime() - session.lastActivity.getTime() > maxAge) {
553
+ this.uploadSessions.delete(uploadId);
554
+ }
555
+ }
556
+ }, 10 * 60 * 1000);
557
+ }
558
+ destroy() {
559
+ if (this.cleanupInterval) {
560
+ clearInterval(this.cleanupInterval);
561
+ this.cleanupInterval = undefined;
562
+ }
563
+ }
564
+ }
565
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vY2lyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL29jaS9jbGFzc2VzLm9jaXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBVzdEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVksU0FBUSxZQUFZO0lBQ25DLE9BQU8sQ0FBa0I7SUFDekIsV0FBVyxDQUFjO0lBQ3pCLGNBQWMsR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxRQUFRLEdBQVcsTUFBTSxDQUFDO0lBQzFCLGVBQWUsQ0FBa0I7SUFFekMsWUFBWSxPQUF3QixFQUFFLFdBQXdCLEVBQUUsV0FBbUIsTUFBTTtRQUN2RixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLHlDQUF5QztRQUN6QyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBd0I7UUFDakQsNEJBQTRCO1FBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckQsMENBQTBDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FB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
@@ -0,0 +1,5 @@
1
+ /**
2
+ * OCI Registry module exports
3
+ */
4
+ export { OciRegistry } from './classes.ociregistry.js';
5
+ export * from './interfaces.oci.js';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * OCI Registry module exports
3
+ */
4
+ export { OciRegistry } from './classes.ociregistry.js';
5
+ export * from './interfaces.oci.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9vY2kvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsY0FBYyxxQkFBcUIsQ0FBQyJ9