@meframe/core 0.0.30-beta → 0.0.30

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 (44) hide show
  1. package/dist/Meframe.d.ts +0 -17
  2. package/dist/Meframe.d.ts.map +1 -1
  3. package/dist/Meframe.js +1 -18
  4. package/dist/Meframe.js.map +1 -1
  5. package/dist/cache/CacheManager.d.ts +7 -49
  6. package/dist/cache/CacheManager.d.ts.map +1 -1
  7. package/dist/cache/CacheManager.js +3 -56
  8. package/dist/cache/CacheManager.js.map +1 -1
  9. package/dist/cache/resource/ResourceCache.d.ts +2 -2
  10. package/dist/cache/resource/ResourceCache.d.ts.map +1 -1
  11. package/dist/cache/resource/ResourceCache.js.map +1 -1
  12. package/dist/controllers/PlaybackController.d.ts +1 -1
  13. package/dist/controllers/PlaybackController.d.ts.map +1 -1
  14. package/dist/controllers/PlaybackController.js +2 -3
  15. package/dist/controllers/PlaybackController.js.map +1 -1
  16. package/dist/model/types.d.ts +0 -1
  17. package/dist/model/types.d.ts.map +1 -1
  18. package/dist/model/types.js.map +1 -1
  19. package/dist/orchestrator/GlobalAudioSession.d.ts +3 -2
  20. package/dist/orchestrator/GlobalAudioSession.d.ts.map +1 -1
  21. package/dist/orchestrator/GlobalAudioSession.js +18 -13
  22. package/dist/orchestrator/GlobalAudioSession.js.map +1 -1
  23. package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
  24. package/dist/orchestrator/Orchestrator.js +15 -17
  25. package/dist/orchestrator/Orchestrator.js.map +1 -1
  26. package/dist/stages/load/ResourceLoader.d.ts +6 -13
  27. package/dist/stages/load/ResourceLoader.d.ts.map +1 -1
  28. package/dist/stages/load/ResourceLoader.js +37 -64
  29. package/dist/stages/load/ResourceLoader.js.map +1 -1
  30. package/dist/stages/load/index.d.ts +0 -1
  31. package/dist/stages/load/index.d.ts.map +1 -1
  32. package/dist/stages/load/types.d.ts +3 -10
  33. package/dist/stages/load/types.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/cache/l2/L2Cache.js +0 -329
  36. package/dist/cache/l2/L2Cache.js.map +0 -1
  37. package/dist/cache/l2/L2OPFSStore.js +0 -89
  38. package/dist/cache/l2/L2OPFSStore.js.map +0 -1
  39. package/dist/cache/storage/indexeddb/ChunkRecordStore.js +0 -180
  40. package/dist/cache/storage/indexeddb/ChunkRecordStore.js.map +0 -1
  41. package/dist/stages/load/EventHandlers.d.ts +0 -26
  42. package/dist/stages/load/EventHandlers.d.ts.map +0 -1
  43. package/dist/stages/load/EventHandlers.js +0 -42
  44. package/dist/stages/load/EventHandlers.js.map +0 -1
@@ -1,89 +0,0 @@
1
- import { OPFSManager } from "../storage/opfs/OPFSManager.js";
2
- class L2OPFSStore {
3
- opfsManager;
4
- constructor() {
5
- this.opfsManager = new OPFSManager();
6
- }
7
- async init() {
8
- await this.opfsManager.init();
9
- }
10
- /**
11
- * Read chunk data from OPFS file
12
- */
13
- async read(fileName, batch, projectId) {
14
- try {
15
- return await this.opfsManager.readRange(
16
- { projectId, prefix: "l2", fileName },
17
- batch.byteOffset,
18
- batch.byteOffset + batch.byteLength
19
- );
20
- } catch (error) {
21
- if (error?.name === "NotFoundError") {
22
- return null;
23
- }
24
- throw error;
25
- }
26
- }
27
- /**
28
- * Append chunks to OPFS file (or create new file)
29
- */
30
- async append(fileName, chunks, existingBatches, projectId) {
31
- const path = { projectId, prefix: "l2", fileName };
32
- let offset = 0;
33
- if (existingBatches && existingBatches.length > 0) {
34
- const lastBatch = existingBatches[existingBatches.length - 1];
35
- if (lastBatch) {
36
- offset = lastBatch.byteOffset + lastBatch.byteLength;
37
- }
38
- }
39
- const writable = await this.opfsManager.createWritableStream(path);
40
- const batches = [];
41
- for (const chunk of chunks) {
42
- const data = await this.chunkToArrayBuffer(chunk);
43
- await writable.write({ type: "write", position: offset, data });
44
- batches.push({
45
- startUs: chunk.timestamp,
46
- durationUs: chunk.duration || 0,
47
- byteOffset: offset,
48
- byteLength: data.byteLength,
49
- type: chunk.type
50
- });
51
- offset += data.byteLength;
52
- }
53
- await writable.close();
54
- return batches;
55
- }
56
- /**
57
- * Delete a file from OPFS
58
- */
59
- async deleteFile(fileName, projectId) {
60
- await this.opfsManager.deleteFile({ projectId, prefix: "l2", fileName });
61
- }
62
- /**
63
- * Delete entire project directory
64
- */
65
- async deleteProjectDirectory(projectId) {
66
- await this.opfsManager.deleteProjectDirectory(projectId, "l2");
67
- }
68
- /**
69
- * Check if a file exists in OPFS
70
- */
71
- async fileExists(fileName, projectId) {
72
- return await this.opfsManager.exists({ projectId, prefix: "l2", fileName });
73
- }
74
- /**
75
- * Clear all OPFS data for current project
76
- */
77
- async clear(projectId) {
78
- await this.deleteProjectDirectory(projectId);
79
- }
80
- async chunkToArrayBuffer(chunk) {
81
- const buffer = new ArrayBuffer(chunk.byteLength);
82
- chunk.copyTo(buffer);
83
- return buffer;
84
- }
85
- }
86
- export {
87
- L2OPFSStore
88
- };
89
- //# sourceMappingURL=L2OPFSStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"L2OPFSStore.js","sources":["../../../src/cache/l2/L2OPFSStore.ts"],"sourcesContent":["import { OPFSManager } from '../storage/opfs/OPFSManager';\nimport type { ChunkBatch } from '../storage/opfs/types';\n\n/**\n * L2-specific OPFS wrapper\n * Adapts OPFSManager for L2 cache chunk operations\n */\nexport class L2OPFSStore {\n private opfsManager: OPFSManager;\n\n constructor() {\n this.opfsManager = new OPFSManager();\n }\n\n async init(): Promise<void> {\n await this.opfsManager.init();\n }\n\n /**\n * Read chunk data from OPFS file\n */\n async read(fileName: string, batch: ChunkBatch, projectId: string): Promise<ArrayBuffer | null> {\n try {\n return await this.opfsManager.readRange(\n { projectId, prefix: 'l2', fileName },\n batch.byteOffset,\n batch.byteOffset + batch.byteLength\n );\n } catch (error) {\n if ((error as any)?.name === 'NotFoundError') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Append chunks to OPFS file (or create new file)\n */\n async append(\n fileName: string,\n chunks: Array<EncodedVideoChunk | EncodedAudioChunk>,\n existingBatches: ChunkBatch[] | undefined,\n projectId: string\n ): Promise<ChunkBatch[]> {\n const path = { projectId, prefix: 'l2' as const, fileName };\n\n // Calculate starting offset from existing batches\n let offset = 0;\n if (existingBatches && existingBatches.length > 0) {\n const lastBatch = existingBatches[existingBatches.length - 1];\n if (lastBatch) {\n offset = lastBatch.byteOffset + lastBatch.byteLength;\n }\n }\n\n const writable = await this.opfsManager.createWritableStream(path);\n const batches: ChunkBatch[] = [];\n\n for (const chunk of chunks) {\n const data = await this.chunkToArrayBuffer(chunk);\n await writable.write({ type: 'write', position: offset, data });\n\n batches.push({\n startUs: chunk.timestamp,\n durationUs: chunk.duration || 0,\n byteOffset: offset,\n byteLength: data.byteLength,\n type: chunk.type,\n });\n\n offset += data.byteLength;\n }\n\n await writable.close();\n return batches;\n }\n\n /**\n * Delete a file from OPFS\n */\n async deleteFile(fileName: string, projectId: string): Promise<void> {\n await this.opfsManager.deleteFile({ projectId, prefix: 'l2', fileName });\n }\n\n /**\n * Delete entire project directory\n */\n async deleteProjectDirectory(projectId: string): Promise<void> {\n await this.opfsManager.deleteProjectDirectory(projectId, 'l2');\n }\n\n /**\n * Check if a file exists in OPFS\n */\n async fileExists(fileName: string, projectId: string): Promise<boolean> {\n return await this.opfsManager.exists({ projectId, prefix: 'l2', fileName });\n }\n\n /**\n * Clear all OPFS data for current project\n */\n async clear(projectId: string): Promise<void> {\n await this.deleteProjectDirectory(projectId);\n }\n\n private async chunkToArrayBuffer(\n chunk: EncodedVideoChunk | EncodedAudioChunk\n ): Promise<ArrayBuffer> {\n const buffer = new ArrayBuffer(chunk.byteLength);\n chunk.copyTo(buffer);\n return buffer;\n }\n}\n"],"names":[],"mappings":";AAOO,MAAM,YAAY;AAAA,EACf;AAAA,EAER,cAAc;AACZ,SAAK,cAAc,IAAI,YAAA;AAAA,EACzB;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,YAAY,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,UAAkB,OAAmB,WAAgD;AAC9F,QAAI;AACF,aAAO,MAAM,KAAK,YAAY;AAAA,QAC5B,EAAE,WAAW,QAAQ,MAAM,SAAA;AAAA,QAC3B,MAAM;AAAA,QACN,MAAM,aAAa,MAAM;AAAA,MAAA;AAAA,IAE7B,SAAS,OAAO;AACd,UAAK,OAAe,SAAS,iBAAiB;AAC5C,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,UACA,QACA,iBACA,WACuB;AACvB,UAAM,OAAO,EAAE,WAAW,QAAQ,MAAe,SAAA;AAGjD,QAAI,SAAS;AACb,QAAI,mBAAmB,gBAAgB,SAAS,GAAG;AACjD,YAAM,YAAY,gBAAgB,gBAAgB,SAAS,CAAC;AAC5D,UAAI,WAAW;AACb,iBAAS,UAAU,aAAa,UAAU;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK,YAAY,qBAAqB,IAAI;AACjE,UAAM,UAAwB,CAAA;AAE9B,eAAW,SAAS,QAAQ;AAC1B,YAAM,OAAO,MAAM,KAAK,mBAAmB,KAAK;AAChD,YAAM,SAAS,MAAM,EAAE,MAAM,SAAS,UAAU,QAAQ,MAAM;AAE9D,cAAQ,KAAK;AAAA,QACX,SAAS,MAAM;AAAA,QACf,YAAY,MAAM,YAAY;AAAA,QAC9B,YAAY;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,MAAM,MAAM;AAAA,MAAA,CACb;AAED,gBAAU,KAAK;AAAA,IACjB;AAEA,UAAM,SAAS,MAAA;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAkB,WAAkC;AACnE,UAAM,KAAK,YAAY,WAAW,EAAE,WAAW,QAAQ,MAAM,UAAU;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,WAAkC;AAC7D,UAAM,KAAK,YAAY,uBAAuB,WAAW,IAAI;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAkB,WAAqC;AACtE,WAAO,MAAM,KAAK,YAAY,OAAO,EAAE,WAAW,QAAQ,MAAM,UAAU;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,WAAkC;AAC5C,UAAM,KAAK,uBAAuB,SAAS;AAAA,EAC7C;AAAA,EAEA,MAAc,mBACZ,OACsB;AACtB,UAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAC/C,UAAM,OAAO,MAAM;AACnB,WAAO;AAAA,EACT;AACF;"}
@@ -1,180 +0,0 @@
1
- class ChunkRecordStore {
2
- db = null;
3
- initPromise = null;
4
- async init() {
5
- if (this.initPromise) return this.initPromise;
6
- this.initPromise = this.initStorage();
7
- return this.initPromise;
8
- }
9
- async initStorage() {
10
- const request = indexedDB.open("meframe_cache", 2);
11
- request.onupgradeneeded = (event) => {
12
- const db = event.target.result;
13
- const oldVersion = event.oldVersion;
14
- if (oldVersion < 2) {
15
- if (db.objectStoreNames.contains("chunks")) {
16
- db.deleteObjectStore("chunks");
17
- }
18
- const store = db.createObjectStore("chunks", {
19
- keyPath: ["projectId", "clipId", "track"]
20
- });
21
- store.createIndex("lastAccess", "lastAccess");
22
- store.createIndex("projectId", "projectId");
23
- }
24
- if (!db.objectStoreNames.contains("meta")) {
25
- db.createObjectStore("meta", { keyPath: "projectId" });
26
- }
27
- };
28
- this.db = await new Promise((resolve, reject) => {
29
- request.onsuccess = () => resolve(request.result);
30
- request.onerror = () => reject(request.error);
31
- });
32
- }
33
- /**
34
- * Get a chunk record
35
- */
36
- async getRecord(projectId, clipId, track) {
37
- if (!this.db) return null;
38
- const tx = this.db.transaction("chunks", "readonly");
39
- const store = tx.objectStore("chunks");
40
- const record = await this.promisifyRequest(store.get([projectId, clipId, track]));
41
- return record || null;
42
- }
43
- /**
44
- * Put/update a chunk record
45
- */
46
- async putRecord(record) {
47
- if (!this.db) return;
48
- const tx = this.db.transaction("chunks", "readwrite");
49
- const store = tx.objectStore("chunks");
50
- store.put(record);
51
- await new Promise((resolve, reject) => {
52
- tx.oncomplete = () => resolve();
53
- tx.onerror = () => reject(tx.error);
54
- });
55
- }
56
- /**
57
- * Delete a chunk record
58
- */
59
- async deleteRecord(projectId, clipId, track) {
60
- if (!this.db) return;
61
- const tx = this.db.transaction("chunks", "readwrite");
62
- const store = tx.objectStore("chunks");
63
- await this.promisifyRequest(store.delete([projectId, clipId, track]));
64
- }
65
- /**
66
- * Update last access time for a record
67
- */
68
- async updateLastAccess(projectId, clipId, track) {
69
- if (!this.db) return;
70
- const tx = this.db.transaction("chunks", "readwrite");
71
- const store = tx.objectStore("chunks");
72
- const record = await this.promisifyRequest(store.get([projectId, clipId, track]));
73
- if (record) {
74
- record.lastAccess = Date.now();
75
- await this.promisifyRequest(store.put(record));
76
- }
77
- }
78
- /**
79
- * Collect all records for a specific clip
80
- */
81
- async collectRecordsByClipId(projectId, clipId) {
82
- if (!this.db) return [];
83
- const tx = this.db.transaction("chunks", "readonly");
84
- const store = tx.objectStore("chunks");
85
- const records = [];
86
- const cursor = store.openCursor();
87
- await new Promise((resolve) => {
88
- cursor.onsuccess = (event) => {
89
- const cursor2 = event.target.result;
90
- if (!cursor2) {
91
- resolve();
92
- return;
93
- }
94
- const record = cursor2.value;
95
- if (record.projectId === projectId && record.clipId === clipId) {
96
- records.push(record);
97
- }
98
- cursor2.continue();
99
- };
100
- });
101
- return records;
102
- }
103
- /**
104
- * Get all records for a specific project
105
- */
106
- async getRecordsByProjectId(projectId) {
107
- if (!this.db) return [];
108
- const tx = this.db.transaction("chunks", "readonly");
109
- const store = tx.objectStore("chunks");
110
- const index = store.index("projectId");
111
- const records = await this.promisifyRequest(
112
- index.getAll(IDBKeyRange.only(projectId))
113
- );
114
- return records;
115
- }
116
- /**
117
- * Get all records sorted by lastAccess (for quota enforcement)
118
- */
119
- async getAllRecordsSortedByAccess() {
120
- if (!this.db) return [];
121
- const tx = this.db.transaction("chunks", "readonly");
122
- const store = tx.objectStore("chunks");
123
- const index = store.index("lastAccess");
124
- const records = [];
125
- const cursor = index.openCursor();
126
- await new Promise((resolve) => {
127
- cursor.onsuccess = (event) => {
128
- const cursor2 = event.target.result;
129
- if (!cursor2) {
130
- resolve();
131
- return;
132
- }
133
- records.push(cursor2.value);
134
- cursor2.continue();
135
- };
136
- });
137
- return records;
138
- }
139
- /**
140
- * Get all records (for project statistics)
141
- */
142
- async getAllRecords() {
143
- if (!this.db) return [];
144
- const tx = this.db.transaction("chunks", "readonly");
145
- const store = tx.objectStore("chunks");
146
- const records = [];
147
- const cursor = store.openCursor();
148
- await new Promise((resolve) => {
149
- cursor.onsuccess = (event) => {
150
- const cursor2 = event.target.result;
151
- if (!cursor2) {
152
- resolve();
153
- return;
154
- }
155
- records.push(cursor2.value);
156
- cursor2.continue();
157
- };
158
- });
159
- return records;
160
- }
161
- /**
162
- * Clear all data from chunks and meta stores
163
- */
164
- async clear() {
165
- if (!this.db) return;
166
- const tx = this.db.transaction(["chunks", "meta"], "readwrite");
167
- await this.promisifyRequest(tx.objectStore("chunks").clear());
168
- await this.promisifyRequest(tx.objectStore("meta").clear());
169
- }
170
- promisifyRequest(request) {
171
- return new Promise((resolve, reject) => {
172
- request.onsuccess = () => resolve(request.result);
173
- request.onerror = () => reject(request.error);
174
- });
175
- }
176
- }
177
- export {
178
- ChunkRecordStore
179
- };
180
- //# sourceMappingURL=ChunkRecordStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChunkRecordStore.js","sources":["../../../../src/cache/storage/indexeddb/ChunkRecordStore.ts"],"sourcesContent":["import type { ChunkBatch } from '../opfs/types';\n\nexport type { ChunkBatch };\n\nexport interface ChunkRecord {\n projectId: string;\n clipId: string;\n track: 'video' | 'audio';\n fileName: string;\n batches: ChunkBatch[];\n lastAccess: number;\n totalBytes: number;\n isComplete: boolean;\n expectedDurationUs?: number;\n metadata?: {\n codec?: string;\n description?: Uint8Array;\n codedWidth?: number;\n codedHeight?: number;\n displayAspectWidth?: number;\n displayAspectHeight?: number;\n colorSpace?: VideoColorSpaceInit;\n hardwareAcceleration?: HardwareAcceleration;\n optimizeForLatency?: boolean;\n sampleRate?: number;\n numberOfChannels?: number;\n };\n}\n\n/**\n * IndexedDB storage for L2 cache metadata\n * Handles all database operations for chunk records\n */\nexport class ChunkRecordStore {\n private db: IDBDatabase | null = null;\n private initPromise: Promise<void> | null = null;\n\n async init(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this.initStorage();\n return this.initPromise;\n }\n\n private async initStorage(): Promise<void> {\n // meframe_cache schema v1.1 (IndexedDB version 2)\n // - Added projectId support for multi-project isolation\n // - Composite key: [projectId, clipId, track]\n const request = indexedDB.open('meframe_cache', 2);\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n const oldVersion = event.oldVersion;\n\n // Version 1→2: Add projectId support\n if (oldVersion < 2) {\n // Delete old chunks store if exists\n if (db.objectStoreNames.contains('chunks')) {\n db.deleteObjectStore('chunks');\n }\n\n // Create new chunks store with composite key [projectId, clipId, track]\n const store = db.createObjectStore('chunks', {\n keyPath: ['projectId', 'clipId', 'track'],\n });\n store.createIndex('lastAccess', 'lastAccess');\n store.createIndex('projectId', 'projectId'); // New: query by project\n }\n\n // meta store (unchanged)\n if (!db.objectStoreNames.contains('meta')) {\n db.createObjectStore('meta', { keyPath: 'projectId' });\n }\n };\n\n this.db = await new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Get a chunk record\n */\n async getRecord(projectId: string, clipId: string, track: string): Promise<ChunkRecord | null> {\n if (!this.db) return null;\n\n const tx = this.db.transaction('chunks', 'readonly');\n const store = tx.objectStore('chunks');\n const record = await this.promisifyRequest<ChunkRecord>(store.get([projectId, clipId, track]));\n\n return record || null;\n }\n\n /**\n * Put/update a chunk record\n */\n async putRecord(record: ChunkRecord): Promise<void> {\n if (!this.db) return;\n\n const tx = this.db.transaction('chunks', 'readwrite');\n const store = tx.objectStore('chunks');\n store.put(record);\n\n // Wait for transaction to complete\n await new Promise<void>((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n }\n\n /**\n * Delete a chunk record\n */\n async deleteRecord(projectId: string, clipId: string, track: string): Promise<void> {\n if (!this.db) return;\n\n const tx = this.db.transaction('chunks', 'readwrite');\n const store = tx.objectStore('chunks');\n await this.promisifyRequest(store.delete([projectId, clipId, track]));\n }\n\n /**\n * Update last access time for a record\n */\n async updateLastAccess(projectId: string, clipId: string, track: string): Promise<void> {\n if (!this.db) return;\n\n const tx = this.db.transaction('chunks', 'readwrite');\n const store = tx.objectStore('chunks');\n const record = await this.promisifyRequest<ChunkRecord>(store.get([projectId, clipId, track]));\n\n if (record) {\n record.lastAccess = Date.now();\n await this.promisifyRequest(store.put(record));\n }\n }\n\n /**\n * Collect all records for a specific clip\n */\n async collectRecordsByClipId(projectId: string, clipId: string): Promise<ChunkRecord[]> {\n if (!this.db) return [];\n\n const tx = this.db.transaction('chunks', 'readonly');\n const store = tx.objectStore('chunks');\n const records: ChunkRecord[] = [];\n const cursor = store.openCursor();\n\n await new Promise<void>((resolve) => {\n cursor.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n\n const record: ChunkRecord = cursor.value;\n if (record.projectId === projectId && record.clipId === clipId) {\n records.push(record);\n }\n\n cursor.continue();\n };\n });\n\n return records;\n }\n\n /**\n * Get all records for a specific project\n */\n async getRecordsByProjectId(projectId: string): Promise<ChunkRecord[]> {\n if (!this.db) return [];\n\n const tx = this.db.transaction('chunks', 'readonly');\n const store = tx.objectStore('chunks');\n const index = store.index('projectId');\n const records = await this.promisifyRequest<ChunkRecord[]>(\n index.getAll(IDBKeyRange.only(projectId))\n );\n\n return records;\n }\n\n /**\n * Get all records sorted by lastAccess (for quota enforcement)\n */\n async getAllRecordsSortedByAccess(): Promise<ChunkRecord[]> {\n if (!this.db) return [];\n\n const tx = this.db.transaction('chunks', 'readonly');\n const store = tx.objectStore('chunks');\n const index = store.index('lastAccess');\n const records: ChunkRecord[] = [];\n\n const cursor = index.openCursor();\n await new Promise<void>((resolve) => {\n cursor.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n\n records.push(cursor.value);\n cursor.continue();\n };\n });\n\n return records;\n }\n\n /**\n * Get all records (for project statistics)\n */\n async getAllRecords(): Promise<ChunkRecord[]> {\n if (!this.db) return [];\n\n const tx = this.db.transaction('chunks', 'readonly');\n const store = tx.objectStore('chunks');\n const records: ChunkRecord[] = [];\n\n const cursor = store.openCursor();\n await new Promise<void>((resolve) => {\n cursor.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n\n records.push(cursor.value);\n cursor.continue();\n };\n });\n\n return records;\n }\n\n /**\n * Clear all data from chunks and meta stores\n */\n async clear(): Promise<void> {\n if (!this.db) return;\n\n const tx = this.db.transaction(['chunks', 'meta'], 'readwrite');\n await this.promisifyRequest(tx.objectStore('chunks').clear());\n await this.promisifyRequest(tx.objectStore('meta').clear());\n }\n\n private promisifyRequest<T>(request: IDBRequest): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n}\n"],"names":["cursor"],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { CompositionModel } from '../../model';
2
- import { Orchestrator } from './types';
3
-
4
- /**
5
- * Handles resource events from Orchestrator
6
- */
7
- export declare class EventHandlers {
8
- private orchestrator;
9
- private onResourceCancel;
10
- private onModelSet;
11
- private eventHandlers;
12
- constructor(orchestrator: Orchestrator, onResourceCancel: (resourceId: string) => void, onModelSet: (model: CompositionModel) => void);
13
- /**
14
- * Setup event handlers
15
- */
16
- private setupHandlers;
17
- /**
18
- * Handle resource remove event
19
- */
20
- private handleResourceRemove;
21
- /**
22
- * Clean up event handlers
23
- */
24
- dispose(): void;
25
- }
26
- //# sourceMappingURL=EventHandlers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventHandlers.d.ts","sourceRoot":"","sources":["../../../src/stages/load/EventHandlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAa;IAItB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,UAAU;IALpB,OAAO,CAAC,aAAa,CAA0C;gBAGrD,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,EAC9C,UAAU,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;IAKvD;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
@@ -1,42 +0,0 @@
1
- import { MeframeEvent } from "../../event/events.js";
2
- class EventHandlers {
3
- constructor(orchestrator, onResourceCancel, onModelSet) {
4
- this.orchestrator = orchestrator;
5
- this.onResourceCancel = onResourceCancel;
6
- this.onModelSet = onModelSet;
7
- this.setupHandlers();
8
- }
9
- eventHandlers = /* @__PURE__ */ new Map();
10
- /**
11
- * Setup event handlers
12
- */
13
- setupHandlers() {
14
- const handlers = {
15
- [MeframeEvent.ResourceRemove]: (event) => this.handleResourceRemove(event),
16
- [MeframeEvent.ModelSet]: (model) => this.onModelSet(model)
17
- };
18
- for (const [event, handler] of Object.entries(handlers)) {
19
- this.orchestrator.on(event, handler);
20
- this.eventHandlers.set(event, handler);
21
- }
22
- }
23
- /**
24
- * Handle resource remove event
25
- */
26
- handleResourceRemove(event) {
27
- this.onResourceCancel(event.resourceId);
28
- }
29
- /**
30
- * Clean up event handlers
31
- */
32
- dispose() {
33
- for (const [event, handler] of this.eventHandlers) {
34
- this.orchestrator.off(event, handler);
35
- }
36
- this.eventHandlers.clear();
37
- }
38
- }
39
- export {
40
- EventHandlers
41
- };
42
- //# sourceMappingURL=EventHandlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventHandlers.js","sources":["../../../src/stages/load/EventHandlers.ts"],"sourcesContent":["import { MeframeEvent, ResourceEvent } from '../../event/events';\nimport type { CompositionModel } from '../../model';\nimport type { Orchestrator } from './types';\n\n/**\n * Handles resource events from Orchestrator\n */\nexport class EventHandlers {\n private eventHandlers = new Map<string, (data: any) => void>();\n\n constructor(\n private orchestrator: Orchestrator,\n private onResourceCancel: (resourceId: string) => void,\n private onModelSet: (model: CompositionModel) => void\n ) {\n this.setupHandlers();\n }\n\n /**\n * Setup event handlers\n */\n private setupHandlers(): void {\n const handlers = {\n [MeframeEvent.ResourceRemove]: (event: ResourceEvent) => this.handleResourceRemove(event),\n [MeframeEvent.ModelSet]: (model: CompositionModel) => this.onModelSet(model),\n };\n\n for (const [event, handler] of Object.entries(handlers)) {\n this.orchestrator.on(event, handler);\n this.eventHandlers.set(event, handler);\n }\n }\n\n /**\n * Handle resource remove event\n */\n private handleResourceRemove(event: ResourceEvent): void {\n this.onResourceCancel(event.resourceId);\n }\n\n /**\n * Clean up event handlers\n */\n dispose(): void {\n for (const [event, handler] of this.eventHandlers) {\n this.orchestrator.off(event, handler);\n }\n this.eventHandlers.clear();\n }\n}\n"],"names":[],"mappings":";AAOO,MAAM,cAAc;AAAA,EAGzB,YACU,cACA,kBACA,YACR;AAHQ,SAAA,eAAA;AACA,SAAA,mBAAA;AACA,SAAA,aAAA;AAER,SAAK,cAAA;AAAA,EACP;AAAA,EARQ,oCAAoB,IAAA;AAAA;AAAA;AAAA;AAAA,EAapB,gBAAsB;AAC5B,UAAM,WAAW;AAAA,MACf,CAAC,aAAa,cAAc,GAAG,CAAC,UAAyB,KAAK,qBAAqB,KAAK;AAAA,MACxF,CAAC,aAAa,QAAQ,GAAG,CAAC,UAA4B,KAAK,WAAW,KAAK;AAAA,IAAA;AAG7E,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACvD,WAAK,aAAa,GAAG,OAAO,OAAO;AACnC,WAAK,cAAc,IAAI,OAAO,OAAO;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAA4B;AACvD,SAAK,iBAAiB,MAAM,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,eAAW,CAAC,OAAO,OAAO,KAAK,KAAK,eAAe;AACjD,WAAK,aAAa,IAAI,OAAO,OAAO;AAAA,IACtC;AACA,SAAK,cAAc,MAAA;AAAA,EACrB;AACF;"}