@cepseudo/assets 1.0.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/LICENSE +21 -0
- package/README.md +204 -0
- package/dist/assets_manager.d.ts +643 -0
- package/dist/assets_manager.d.ts.map +1 -0
- package/dist/assets_manager.js +1217 -0
- package/dist/assets_manager.js.map +1 -0
- package/dist/assets_openapi.d.ts +9 -0
- package/dist/assets_openapi.d.ts.map +1 -0
- package/dist/assets_openapi.js +391 -0
- package/dist/assets_openapi.js.map +1 -0
- package/dist/async_upload.d.ts +20 -0
- package/dist/async_upload.d.ts.map +1 -0
- package/dist/async_upload.js +10 -0
- package/dist/async_upload.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/map_manager.d.ts +61 -0
- package/dist/map_manager.d.ts.map +1 -0
- package/dist/map_manager.js +217 -0
- package/dist/map_manager.js.map +1 -0
- package/dist/presigned_upload_service.d.ts +52 -0
- package/dist/presigned_upload_service.d.ts.map +1 -0
- package/dist/presigned_upload_service.js +152 -0
- package/dist/presigned_upload_service.js.map +1 -0
- package/dist/tileset_manager.d.ts +128 -0
- package/dist/tileset_manager.d.ts.map +1 -0
- package/dist/tileset_manager.js +705 -0
- package/dist/tileset_manager.js.map +1 -0
- package/dist/upload_processor.d.ts +42 -0
- package/dist/upload_processor.d.ts.map +1 -0
- package/dist/upload_processor.js +138 -0
- package/dist/upload_processor.js.map +1 -0
- package/dist/upload_reconciler.d.ts +44 -0
- package/dist/upload_reconciler.d.ts.map +1 -0
- package/dist/upload_reconciler.js +140 -0
- package/dist/upload_reconciler.js.map +1 -0
- package/dist/utils/zip_utils.d.ts +66 -0
- package/dist/utils/zip_utils.d.ts.map +1 -0
- package/dist/utils/zip_utils.js +169 -0
- package/dist/utils/zip_utils.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tileset_manager.js","sourceRoot":"","sources":["../src/tileset_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Job } from 'bullmq';
|
|
2
|
+
import type { ConnectionOptions } from 'bullmq';
|
|
3
|
+
import type { StorageService } from '@cepseudo/storage';
|
|
4
|
+
import type { DatabaseAdapter } from '@cepseudo/database';
|
|
5
|
+
export interface TilesetUploadJobData {
|
|
6
|
+
type: 'tileset';
|
|
7
|
+
recordId: number;
|
|
8
|
+
tempFilePath: string;
|
|
9
|
+
componentName: string;
|
|
10
|
+
userId: number;
|
|
11
|
+
filename: string;
|
|
12
|
+
description: string;
|
|
13
|
+
/** S3 key for presigned uploads (when set, download from S3 instead of reading temp file) */
|
|
14
|
+
presignedKey?: string;
|
|
15
|
+
}
|
|
16
|
+
export type UploadJobData = TilesetUploadJobData;
|
|
17
|
+
export type UploadStatus = 'pending' | 'processing' | 'completed' | 'failed';
|
|
18
|
+
/**
|
|
19
|
+
* Background worker for processing large file uploads (tileset extraction).
|
|
20
|
+
* Prevents HTTP timeout by queuing jobs and processing asynchronously.
|
|
21
|
+
*
|
|
22
|
+
* Flow:
|
|
23
|
+
* 1. Read ZIP from temp file
|
|
24
|
+
* 2. Extract and upload all files to storage (OVH S3)
|
|
25
|
+
* 3. Update database with tileset_url and base_path
|
|
26
|
+
* 4. Clean up temp file
|
|
27
|
+
*/
|
|
28
|
+
export declare class UploadProcessor {
|
|
29
|
+
private worker;
|
|
30
|
+
private storage;
|
|
31
|
+
private db;
|
|
32
|
+
constructor(storage: StorageService, db: DatabaseAdapter);
|
|
33
|
+
start(connection: ConnectionOptions): void;
|
|
34
|
+
stop(): Promise<void>;
|
|
35
|
+
private processJob;
|
|
36
|
+
/**
|
|
37
|
+
* Process a tileset upload job. Public for testability.
|
|
38
|
+
*/
|
|
39
|
+
processTilesetUpload(job: Job<TilesetUploadJobData>): Promise<void>;
|
|
40
|
+
private updateRecordStatus;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=upload_processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload_processor.d.ts","sourceRoot":"","sources":["../src/upload_processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,GAAG,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAOzD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,SAAS,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAChD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAA;AAE5E;;;;;;;;;GASG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,EAAE,CAAiB;gBAEf,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,eAAe;IAKxD,KAAK,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAWpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,UAAU;IAQxB;;OAEG;IACG,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAuG3D,kBAAkB;CAGnC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Worker } from 'bullmq';
|
|
2
|
+
import { extractAndStoreArchive } from './utils/zip_utils.js';
|
|
3
|
+
import { safeAsync, safeCleanup, Logger } from '@cepseudo/shared';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
const logger = new Logger('UploadProcessor');
|
|
6
|
+
/**
|
|
7
|
+
* Background worker for processing large file uploads (tileset extraction).
|
|
8
|
+
* Prevents HTTP timeout by queuing jobs and processing asynchronously.
|
|
9
|
+
*
|
|
10
|
+
* Flow:
|
|
11
|
+
* 1. Read ZIP from temp file
|
|
12
|
+
* 2. Extract and upload all files to storage (OVH S3)
|
|
13
|
+
* 3. Update database with tileset_url and base_path
|
|
14
|
+
* 4. Clean up temp file
|
|
15
|
+
*/
|
|
16
|
+
export class UploadProcessor {
|
|
17
|
+
constructor(storage, db) {
|
|
18
|
+
this.worker = null;
|
|
19
|
+
this.storage = storage;
|
|
20
|
+
this.db = db;
|
|
21
|
+
}
|
|
22
|
+
start(connection) {
|
|
23
|
+
this.worker = new Worker('dt-uploads', async (job) => this.processJob(job), {
|
|
24
|
+
connection,
|
|
25
|
+
concurrency: 2,
|
|
26
|
+
limiter: { max: 5, duration: 60000 }
|
|
27
|
+
});
|
|
28
|
+
this.worker.on('completed', job => console.log(`[UploadProcessor] Job ${job.id} completed`));
|
|
29
|
+
this.worker.on('failed', (job, err) => console.error(`[UploadProcessor] Job ${job?.id} failed:`, err.message));
|
|
30
|
+
}
|
|
31
|
+
async stop() {
|
|
32
|
+
if (this.worker) {
|
|
33
|
+
await this.worker.close();
|
|
34
|
+
this.worker = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async processJob(job) {
|
|
38
|
+
if (job.data.type === 'tileset') {
|
|
39
|
+
await this.processTilesetUpload(job);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new Error(`Unknown upload job type: ${String(job.data.type)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Process a tileset upload job. Public for testability.
|
|
47
|
+
*/
|
|
48
|
+
async processTilesetUpload(job) {
|
|
49
|
+
const { recordId, tempFilePath, componentName, presignedKey } = job.data;
|
|
50
|
+
let basePath = null;
|
|
51
|
+
try {
|
|
52
|
+
await this.updateRecordStatus(recordId, componentName, 'processing');
|
|
53
|
+
await job.updateProgress(10);
|
|
54
|
+
// Read ZIP file from presigned S3 key or temp file
|
|
55
|
+
let zipBuffer;
|
|
56
|
+
if (presignedKey) {
|
|
57
|
+
zipBuffer = await this.storage.retrieve(presignedKey).catch(err => {
|
|
58
|
+
throw new Error(`Failed to download presigned file from storage: ${err.message}`);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
zipBuffer = await fs.readFile(tempFilePath).catch(err => {
|
|
63
|
+
throw new Error(`Failed to read temp file: ${err.message}`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
await job.updateProgress(20);
|
|
67
|
+
// Generate unique base path
|
|
68
|
+
basePath = `${componentName}/${Date.now()}`;
|
|
69
|
+
// Extract and upload all files to storage
|
|
70
|
+
const extractResult = await extractAndStoreArchive(zipBuffer, this.storage, basePath);
|
|
71
|
+
await job.updateProgress(80);
|
|
72
|
+
// Validate tileset.json exists
|
|
73
|
+
if (!extractResult.root_file) {
|
|
74
|
+
// Clean up uploaded files (basePath is always set at this point)
|
|
75
|
+
if (basePath) {
|
|
76
|
+
const pathToDelete = basePath;
|
|
77
|
+
await safeAsync(() => this.storage.deleteByPrefix(pathToDelete), 'cleanup storage on invalid tileset', logger);
|
|
78
|
+
}
|
|
79
|
+
throw new Error('Invalid tileset: no tileset.json found in the ZIP archive');
|
|
80
|
+
}
|
|
81
|
+
// Build the public URL for tileset.json
|
|
82
|
+
const tilesetPath = `${basePath}/${extractResult.root_file}`;
|
|
83
|
+
const tilesetUrl = this.storage.getPublicUrl(tilesetPath);
|
|
84
|
+
// Update database record (url = basePath for deletion)
|
|
85
|
+
await this.db.updateById(componentName, recordId, {
|
|
86
|
+
url: basePath,
|
|
87
|
+
tileset_url: tilesetUrl,
|
|
88
|
+
upload_status: 'completed'
|
|
89
|
+
});
|
|
90
|
+
await job.updateProgress(90);
|
|
91
|
+
// Clean up source file
|
|
92
|
+
if (presignedKey) {
|
|
93
|
+
// Delete the original ZIP from S3 (extraction created individual files)
|
|
94
|
+
await safeAsync(() => this.storage.delete(presignedKey), 'cleanup presigned ZIP after extraction', logger);
|
|
95
|
+
}
|
|
96
|
+
else if (tempFilePath) {
|
|
97
|
+
await safeAsync(() => fs.unlink(tempFilePath), 'cleanup temp file after upload', logger);
|
|
98
|
+
}
|
|
99
|
+
await job.updateProgress(100);
|
|
100
|
+
logger.info(`Tileset ${recordId} uploaded: ${extractResult.file_count} files`);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
// Update record as failed (don't delete - keep for debugging)
|
|
104
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
105
|
+
await safeAsync(() => this.db.updateById(componentName, recordId, {
|
|
106
|
+
upload_status: 'failed',
|
|
107
|
+
upload_error: errorMessage
|
|
108
|
+
}), 'update record status to failed', logger);
|
|
109
|
+
// Clean up: uploaded files and source file
|
|
110
|
+
const pathToClean = basePath; // Capture for closure
|
|
111
|
+
const cleanupOps = [];
|
|
112
|
+
if (pathToClean) {
|
|
113
|
+
cleanupOps.push({
|
|
114
|
+
operation: () => this.storage.deleteByPrefix(pathToClean),
|
|
115
|
+
context: 'cleanup storage on upload error'
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
if (presignedKey) {
|
|
119
|
+
cleanupOps.push({
|
|
120
|
+
operation: () => this.storage.delete(presignedKey),
|
|
121
|
+
context: 'cleanup presigned ZIP on upload error'
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else if (tempFilePath) {
|
|
125
|
+
cleanupOps.push({
|
|
126
|
+
operation: () => fs.unlink(tempFilePath),
|
|
127
|
+
context: 'cleanup temp file on upload error'
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
await safeCleanup(cleanupOps, logger);
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async updateRecordStatus(id, tableName, status) {
|
|
135
|
+
await this.db.updateById(tableName, id, { upload_status: status });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=upload_processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload_processor.js","sourceRoot":"","sources":["../src/upload_processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { StorageService } from '@cepseudo/storage';
|
|
2
|
+
import type { DatabaseAdapter } from '@cepseudo/database';
|
|
3
|
+
export interface ReconciliationResult {
|
|
4
|
+
checked: number;
|
|
5
|
+
completed: number;
|
|
6
|
+
expired: number;
|
|
7
|
+
skipped: number;
|
|
8
|
+
}
|
|
9
|
+
export interface UploadReconcilerOptions {
|
|
10
|
+
intervalMs?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Periodically reconciles pending presigned uploads.
|
|
14
|
+
*
|
|
15
|
+
* Checks all records with upload_status='pending' and presigned_key set:
|
|
16
|
+
* - If presigned URL expired and file exists on S3 → mark completed
|
|
17
|
+
* - If presigned URL expired and no file on S3 → mark expired
|
|
18
|
+
* - If presigned URL not expired and file exists → mark completed (early confirm)
|
|
19
|
+
* - If presigned URL not expired and no file → skip (still waiting)
|
|
20
|
+
*/
|
|
21
|
+
export declare class UploadReconciler {
|
|
22
|
+
private db;
|
|
23
|
+
private storage;
|
|
24
|
+
private intervalMs;
|
|
25
|
+
private timer;
|
|
26
|
+
private tableNames;
|
|
27
|
+
constructor(db: DatabaseAdapter, storage: StorageService, options?: UploadReconcilerOptions);
|
|
28
|
+
/**
|
|
29
|
+
* Register table names to reconcile.
|
|
30
|
+
* Call this before start() to tell the reconciler which tables to check.
|
|
31
|
+
*/
|
|
32
|
+
registerTables(names: string[]): void;
|
|
33
|
+
start(): void;
|
|
34
|
+
stop(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Run reconciliation across all registered tables.
|
|
37
|
+
*/
|
|
38
|
+
reconcile(): Promise<ReconciliationResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Reconcile pending presigned uploads for a specific table.
|
|
41
|
+
*/
|
|
42
|
+
reconcileTable(tableName: string): Promise<ReconciliationResult>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=upload_reconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload_reconciler.d.ts","sourceRoot":"","sources":["../src/upload_reconciler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAKzD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,uBAAuB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,UAAU,CAAe;gBAErB,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAM3F;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAQrC,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA6BhD;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAoEzE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { safeAsync, Logger } from '@cepseudo/shared';
|
|
2
|
+
const logger = new Logger('UploadReconciler');
|
|
3
|
+
/**
|
|
4
|
+
* Periodically reconciles pending presigned uploads.
|
|
5
|
+
*
|
|
6
|
+
* Checks all records with upload_status='pending' and presigned_key set:
|
|
7
|
+
* - If presigned URL expired and file exists on S3 → mark completed
|
|
8
|
+
* - If presigned URL expired and no file on S3 → mark expired
|
|
9
|
+
* - If presigned URL not expired and file exists → mark completed (early confirm)
|
|
10
|
+
* - If presigned URL not expired and no file → skip (still waiting)
|
|
11
|
+
*/
|
|
12
|
+
export class UploadReconciler {
|
|
13
|
+
constructor(db, storage, options) {
|
|
14
|
+
this.timer = null;
|
|
15
|
+
this.tableNames = [];
|
|
16
|
+
this.db = db;
|
|
17
|
+
this.storage = storage;
|
|
18
|
+
this.intervalMs = options?.intervalMs ?? 5 * 60 * 1000; // 5 minutes default
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register table names to reconcile.
|
|
22
|
+
* Call this before start() to tell the reconciler which tables to check.
|
|
23
|
+
*/
|
|
24
|
+
registerTables(names) {
|
|
25
|
+
for (const name of names) {
|
|
26
|
+
if (!this.tableNames.includes(name)) {
|
|
27
|
+
this.tableNames.push(name);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
start() {
|
|
32
|
+
if (this.timer)
|
|
33
|
+
return;
|
|
34
|
+
if (this.tableNames.length === 0) {
|
|
35
|
+
logger.info('No tables registered, upload reconciler not started');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
logger.info(`Starting upload reconciler (interval: ${this.intervalMs}ms, tables: ${this.tableNames.join(', ')})`);
|
|
39
|
+
this.timer = setInterval(() => {
|
|
40
|
+
safeAsync(() => this.reconcile(), 'upload reconciliation cycle', logger);
|
|
41
|
+
}, this.intervalMs);
|
|
42
|
+
}
|
|
43
|
+
stop() {
|
|
44
|
+
if (this.timer) {
|
|
45
|
+
clearInterval(this.timer);
|
|
46
|
+
this.timer = null;
|
|
47
|
+
logger.info('Upload reconciler stopped');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run reconciliation across all registered tables.
|
|
52
|
+
*/
|
|
53
|
+
async reconcile() {
|
|
54
|
+
const totals = {
|
|
55
|
+
checked: 0,
|
|
56
|
+
completed: 0,
|
|
57
|
+
expired: 0,
|
|
58
|
+
skipped: 0
|
|
59
|
+
};
|
|
60
|
+
if (!this.storage.supportsPresignedUrls()) {
|
|
61
|
+
return totals;
|
|
62
|
+
}
|
|
63
|
+
for (const tableName of this.tableNames) {
|
|
64
|
+
const result = await this.reconcileTable(tableName);
|
|
65
|
+
totals.checked += result.checked;
|
|
66
|
+
totals.completed += result.completed;
|
|
67
|
+
totals.expired += result.expired;
|
|
68
|
+
totals.skipped += result.skipped;
|
|
69
|
+
}
|
|
70
|
+
if (totals.checked > 0) {
|
|
71
|
+
logger.info(`Reconciliation totals: checked=${totals.checked}, completed=${totals.completed}, expired=${totals.expired}, skipped=${totals.skipped}`);
|
|
72
|
+
}
|
|
73
|
+
return totals;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Reconcile pending presigned uploads for a specific table.
|
|
77
|
+
*/
|
|
78
|
+
async reconcileTable(tableName) {
|
|
79
|
+
const result = {
|
|
80
|
+
checked: 0,
|
|
81
|
+
completed: 0,
|
|
82
|
+
expired: 0,
|
|
83
|
+
skipped: 0
|
|
84
|
+
};
|
|
85
|
+
if (!this.storage.supportsPresignedUrls()) {
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
// Find all pending records with a presigned_key
|
|
90
|
+
const pendingRecords = await this.db.findByConditions(tableName, {
|
|
91
|
+
upload_status: 'pending'
|
|
92
|
+
});
|
|
93
|
+
const now = new Date();
|
|
94
|
+
for (const record of pendingRecords) {
|
|
95
|
+
if (!record.presigned_key)
|
|
96
|
+
continue;
|
|
97
|
+
result.checked++;
|
|
98
|
+
const isExpired = record.presigned_expires_at
|
|
99
|
+
? new Date(record.presigned_expires_at) < now
|
|
100
|
+
: false;
|
|
101
|
+
try {
|
|
102
|
+
const existsResult = await this.storage.objectExists(record.presigned_key);
|
|
103
|
+
if (existsResult.exists) {
|
|
104
|
+
// File uploaded — mark completed
|
|
105
|
+
await this.db.updateById(tableName, record.id, {
|
|
106
|
+
upload_status: 'completed',
|
|
107
|
+
url: record.presigned_key
|
|
108
|
+
});
|
|
109
|
+
result.completed++;
|
|
110
|
+
logger.info(`Reconciled record ${record.id}: completed (file found)`);
|
|
111
|
+
}
|
|
112
|
+
else if (isExpired) {
|
|
113
|
+
// URL expired and no file — mark expired
|
|
114
|
+
await this.db.updateById(tableName, record.id, {
|
|
115
|
+
upload_status: 'expired'
|
|
116
|
+
});
|
|
117
|
+
result.expired++;
|
|
118
|
+
logger.info(`Reconciled record ${record.id}: expired`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// URL not expired, no file yet — skip
|
|
122
|
+
result.skipped++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
logger.warn(`Failed to reconcile record ${record.id}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
127
|
+
result.skipped++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (result.checked > 0) {
|
|
131
|
+
logger.info(`Reconciliation for ${tableName}: checked=${result.checked}, completed=${result.completed}, expired=${result.expired}, skipped=${result.skipped}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
logger.warn(`Failed to reconcile table ${tableName}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=upload_reconciler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload_reconciler.js","sourceRoot":"","sources":["../src/upload_reconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { StorageService } from '@cepseudo/storage';
|
|
2
|
+
/**
|
|
3
|
+
* Result of extracting and storing a ZIP archive
|
|
4
|
+
*/
|
|
5
|
+
export interface ExtractedArchiveResult {
|
|
6
|
+
/** The root/main file path (e.g., 'tileset.json') */
|
|
7
|
+
root_file?: string;
|
|
8
|
+
/** Total number of files extracted */
|
|
9
|
+
file_count: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Extracts the content of a zip file as a stream (for large files)
|
|
13
|
+
* @param zipBuffer - The content of the zip file as Buffer
|
|
14
|
+
* @returns A generator yielding tuples containing the name and content of each file in the zip file
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractZipContentStream(zipBuffer: Buffer): AsyncGenerator<[string, string | Buffer]>;
|
|
17
|
+
/**
|
|
18
|
+
* Converts a zip file to a dictionary containing all files and their contents
|
|
19
|
+
* @param zipBuffer - The content of the zip file as Buffer
|
|
20
|
+
* @returns A dictionary containing the content of the zip file
|
|
21
|
+
*/
|
|
22
|
+
export declare function zipToDict(zipBuffer: Buffer): Promise<Record<string, string | Buffer>>;
|
|
23
|
+
/**
|
|
24
|
+
* Detects the root file for 3D Tiles tilesets
|
|
25
|
+
* Looks for tileset.json or similar entry point files
|
|
26
|
+
* @param files - List of file paths in the archive
|
|
27
|
+
* @returns The path to the root file, or undefined if not found
|
|
28
|
+
*/
|
|
29
|
+
export declare function detectTilesetRootFile(files: string[]): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Normalizes file paths from ZIP archives
|
|
32
|
+
* Removes leading directory if all files share the same root folder
|
|
33
|
+
* @param files - Original file paths from the archive
|
|
34
|
+
* @returns Normalized file paths (original -> normalized)
|
|
35
|
+
*/
|
|
36
|
+
export declare function normalizeArchivePaths(files: string[]): Map<string, string>;
|
|
37
|
+
/**
|
|
38
|
+
* Extracts a ZIP archive and stores each file individually using the storage service.
|
|
39
|
+
*
|
|
40
|
+
* This function:
|
|
41
|
+
* 1. Extracts all files from the ZIP
|
|
42
|
+
* 2. Normalizes paths (removes common root directory if present)
|
|
43
|
+
* 3. Stores each file using the storage service with a unique base path
|
|
44
|
+
* 4. Returns the root file path and file count
|
|
45
|
+
*
|
|
46
|
+
* Files are uploaded in parallel batches for performance.
|
|
47
|
+
*
|
|
48
|
+
* @param zipBuffer - The ZIP file content as a Buffer
|
|
49
|
+
* @param storage - The storage service to use for saving files
|
|
50
|
+
* @param basePath - Base path/folder for storing extracted files (e.g., 'tilesets/1234567890')
|
|
51
|
+
* @returns ExtractedArchiveResult with root file and file count
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const result = await extractAndStoreArchive(zipBuffer, storage, 'tilesets/1234567890')
|
|
56
|
+
* // result.root_file = 'tileset.json'
|
|
57
|
+
* // result.file_count = 42
|
|
58
|
+
*
|
|
59
|
+
* // Files are stored at:
|
|
60
|
+
* // tilesets/1234567890/tileset.json
|
|
61
|
+
* // tilesets/1234567890/tiles/tile_0.b3dm
|
|
62
|
+
* // etc.
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractAndStoreArchive(zipBuffer: Buffer, storage: StorageService, basePath: string): Promise<ExtractedArchiveResult>;
|
|
66
|
+
//# sourceMappingURL=zip_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip_utils.d.ts","sourceRoot":"","sources":["../../src/utils/zip_utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAuB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAqB3G;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAQ3F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAezE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB1E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,sBAAsB,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAuEjC"}
|