@editframe/cli 0.10.0-beta.5 → 0.10.0-beta.7

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 (53) hide show
  1. package/dist/VERSION.d.ts +1 -1
  2. package/dist/VERSION.js +1 -1
  3. package/dist/commands/render.d.ts +1 -1
  4. package/dist/commands/render.js +55 -43
  5. package/dist/commands/sync.js +5 -2
  6. package/dist/operations/syncAssetsDirectory/SubAssetSync.d.ts +20 -0
  7. package/dist/operations/syncAssetsDirectory/SubAssetSync.js +26 -0
  8. package/dist/operations/syncAssetsDirectory/SyncCaption.d.ts +19 -0
  9. package/dist/operations/syncAssetsDirectory/SyncCaption.js +66 -0
  10. package/dist/operations/syncAssetsDirectory/SyncCaption.test.d.ts +1 -0
  11. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.d.ts +20 -0
  12. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.js +79 -0
  13. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.test.d.ts +1 -0
  14. package/dist/operations/syncAssetsDirectory/SyncImage.d.ts +23 -0
  15. package/dist/operations/syncAssetsDirectory/SyncImage.js +95 -0
  16. package/dist/operations/syncAssetsDirectory/SyncImage.test.d.ts +1 -0
  17. package/dist/operations/syncAssetsDirectory/SyncStatus.d.ts +41 -0
  18. package/dist/operations/syncAssetsDirectory/SyncStatus.js +43 -0
  19. package/dist/operations/syncAssetsDirectory/SyncTrack.d.ts +70 -0
  20. package/dist/operations/syncAssetsDirectory/SyncTrack.js +138 -0
  21. package/dist/operations/syncAssetsDirectory/SyncTrack.test.d.ts +1 -0
  22. package/dist/operations/syncAssetsDirectory/doAssetSync.d.ts +5 -0
  23. package/dist/operations/syncAssetsDirectory/doAssetSync.js +48 -0
  24. package/dist/operations/syncAssetsDirectory/doAssetSync.test.d.ts +1 -0
  25. package/dist/operations/syncAssetsDirectory.d.ts +1 -1
  26. package/dist/operations/syncAssetsDirectory.js +20 -240
  27. package/dist/test-fixtures/fixture.d.ts +26 -0
  28. package/dist/utils/index.js +4 -1
  29. package/package.json +5 -5
  30. package/src/commands/render.ts +61 -52
  31. package/src/commands/sync.ts +5 -2
  32. package/src/operations/syncAssetsDirectory/SubAssetSync.ts +42 -0
  33. package/src/operations/syncAssetsDirectory/SyncCaption.test.ts +145 -0
  34. package/src/operations/syncAssetsDirectory/SyncCaption.ts +76 -0
  35. package/src/operations/syncAssetsDirectory/SyncFragmentIndex.test.ts +151 -0
  36. package/src/operations/syncAssetsDirectory/SyncFragmentIndex.ts +92 -0
  37. package/src/operations/syncAssetsDirectory/SyncImage.test.ts +131 -0
  38. package/src/operations/syncAssetsDirectory/SyncImage.ts +112 -0
  39. package/src/operations/syncAssetsDirectory/SyncStatus.ts +51 -0
  40. package/src/operations/syncAssetsDirectory/SyncTrack.test.ts +222 -0
  41. package/src/operations/syncAssetsDirectory/SyncTrack.ts +164 -0
  42. package/src/operations/syncAssetsDirectory/doAssetSync.test.ts +134 -0
  43. package/src/operations/syncAssetsDirectory/doAssetSync.ts +62 -0
  44. package/src/operations/syncAssetsDirectory.test.ts +482 -0
  45. package/src/operations/syncAssetsDirectory.ts +22 -283
  46. package/src/utils/index.ts +4 -1
  47. package/test-fixtures/fixture.ts +141 -0
  48. package/test-fixtures/network.ts +181 -0
  49. package/test-fixtures/test-captions.json +9 -0
  50. package/test-fixtures/test.mp4 +0 -0
  51. package/test-fixtures/test.png +0 -0
  52. package/src/commands/render.test.ts +0 -34
  53. /package/dist/{commands/render.test.d.ts → operations/syncAssetsDirectory.test.d.ts} +0 -0
@@ -0,0 +1,134 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+ import type { SubAssetSync } from "./SubAssetSync.ts";
3
+ import type { SyncStatusInfo } from "./SyncStatus.ts";
4
+ import { doAssetSync } from "./doAssetSync.ts";
5
+
6
+ const collectAsyncGenerator = async (
7
+ generator: SubAssetSync<unknown>,
8
+ ): Promise<
9
+ {
10
+ status: "info" | "success";
11
+ message: string;
12
+ }[]
13
+ > => {
14
+ const result = [];
15
+ for await (const item of doAssetSync(generator)) {
16
+ result.push(item);
17
+ }
18
+ return result;
19
+ };
20
+
21
+ const buildFakeSync = (): SubAssetSync<unknown> => {
22
+ const fakeSyncStatus = {
23
+ isSynced: vi.fn().mockReturnValue(false),
24
+ } as unknown as SyncStatusInfo;
25
+ const fakeSync = {
26
+ label: "TEST_LABEL",
27
+ icon: "🧪",
28
+ path: "TEST_PATH",
29
+ readInfo: vi.fn().mockReturnValue(Promise.resolve(null)),
30
+ syncStatus: fakeSyncStatus,
31
+ markSynced: vi.fn().mockReturnValue(Promise.resolve()),
32
+ isComplete: vi.fn().mockReturnValue(false),
33
+ prepare: vi.fn().mockReturnValue(Promise.resolve()),
34
+ validate: vi.fn().mockReturnValue(Promise.resolve()),
35
+ create: vi.fn().mockReturnValue(Promise.resolve()),
36
+ upload: vi.fn().mockReturnValue(Promise.resolve()),
37
+ } as unknown as SubAssetSync<unknown>;
38
+ return fakeSync;
39
+ };
40
+
41
+ describe("doAssetSync", () => {
42
+ test("Succeeds if all steps are executed without error", async () => {
43
+ const fakeSync = buildFakeSync();
44
+ const messages = await collectAsyncGenerator(fakeSync);
45
+ expect(messages).toEqual([
46
+ {
47
+ status: "info",
48
+ message: "🧪 Syncing TEST_LABEL: TEST_PATH",
49
+ },
50
+ {
51
+ status: "success",
52
+ message: "Synced TEST_LABEL: TEST_PATH",
53
+ },
54
+ ]);
55
+ });
56
+
57
+ test("Succeeds if asset is already synced", async () => {
58
+ const fakeSync = buildFakeSync();
59
+ fakeSync.syncStatus.isSynced = vi.fn().mockReturnValue(true);
60
+ const messages = await collectAsyncGenerator(fakeSync);
61
+ expect(messages).toEqual([
62
+ {
63
+ status: "info",
64
+ message: "Sub-asset has already been synced: TEST_PATH",
65
+ },
66
+ ]);
67
+ });
68
+
69
+ test("Succeeds if asset is already uploaded", async () => {
70
+ const fakeSync = buildFakeSync();
71
+ fakeSync.isComplete = vi.fn().mockReturnValue(true);
72
+ const messages = await collectAsyncGenerator(fakeSync);
73
+ expect(messages).toEqual([
74
+ {
75
+ status: "info",
76
+ message: "🧪 Syncing TEST_LABEL: TEST_PATH",
77
+ },
78
+ {
79
+ status: "success",
80
+ message: "Synced TEST_LABEL: TEST_PATH",
81
+ },
82
+ ]);
83
+ });
84
+
85
+ test("Throws if prepare fails", async () => {
86
+ const fakeSync = buildFakeSync();
87
+ fakeSync.prepare = vi
88
+ .fn()
89
+ .mockReturnValue(Promise.reject(new Error("TEST_ERROR")));
90
+ await expect(collectAsyncGenerator(fakeSync)).rejects.toThrow(
91
+ "Error validating TEST_LABEL: TEST_ERROR",
92
+ );
93
+ });
94
+
95
+ test("Throws if validate fails", async () => {
96
+ const fakeSync = buildFakeSync();
97
+ fakeSync.validate = vi
98
+ .fn()
99
+ .mockReturnValue(Promise.reject(new Error("TEST_ERROR")));
100
+ await expect(collectAsyncGenerator(fakeSync)).rejects.toThrow(
101
+ "Error validating TEST_LABEL: TEST_ERROR",
102
+ );
103
+ });
104
+
105
+ test("Throws if create fails", async () => {
106
+ const fakeSync = buildFakeSync();
107
+ fakeSync.create = vi
108
+ .fn()
109
+ .mockReturnValue(Promise.reject(new Error("TEST_ERROR")));
110
+ await expect(collectAsyncGenerator(fakeSync)).rejects.toThrow(
111
+ "Error creating TEST_LABEL: TEST_ERROR",
112
+ );
113
+ });
114
+
115
+ test("Throws if upload fails", async () => {
116
+ const fakeSync = buildFakeSync();
117
+ fakeSync.upload = vi
118
+ .fn()
119
+ .mockReturnValue(Promise.reject(new Error("TEST_ERROR")));
120
+ await expect(collectAsyncGenerator(fakeSync)).rejects.toThrow(
121
+ "Error uploading TEST_LABEL: TEST_ERROR",
122
+ );
123
+ });
124
+
125
+ test("Throws if markSynced fails", async () => {
126
+ const fakeSync = buildFakeSync();
127
+ fakeSync.markSynced = vi
128
+ .fn()
129
+ .mockReturnValue(Promise.reject(new Error("TEST_ERROR")));
130
+ await expect(collectAsyncGenerator(fakeSync)).rejects.toThrow(
131
+ "Error marking TEST_LABEL as synced: TEST_ERROR",
132
+ );
133
+ });
134
+ });
@@ -0,0 +1,62 @@
1
+ import type { SubAssetSync } from "./SubAssetSync.ts";
2
+
3
+ export const doAssetSync = async function* (
4
+ assetSync: SubAssetSync<unknown>,
5
+ ): AsyncGenerator<{
6
+ status: "info" | "success";
7
+ message: string;
8
+ }> {
9
+ if (await assetSync.syncStatus.isSynced()) {
10
+ yield {
11
+ status: "info",
12
+ message: `Sub-asset has already been synced: ${assetSync.path}`,
13
+ };
14
+ return;
15
+ }
16
+
17
+ try {
18
+ await assetSync.prepare();
19
+ await assetSync.validate();
20
+ } catch (error) {
21
+ const message = error instanceof Error ? error.message : "Unknown error";
22
+
23
+ throw new Error(`Error validating ${assetSync.label}: ${message}`);
24
+ }
25
+
26
+ yield {
27
+ status: "info",
28
+ message: `${assetSync.icon} Syncing ${assetSync.label}: ${assetSync.path}`,
29
+ };
30
+
31
+ try {
32
+ await assetSync.create();
33
+ } catch (error) {
34
+ const message = error instanceof Error ? error.message : "Unknown error";
35
+
36
+ throw new Error(`Error creating ${assetSync.label}: ${message}`);
37
+ }
38
+
39
+ if (!assetSync.isComplete()) {
40
+ try {
41
+ await assetSync.upload();
42
+ } catch (error) {
43
+ const message = error instanceof Error ? error.message : "Unknown error";
44
+
45
+ throw new Error(`Error uploading ${assetSync.label}: ${message}`);
46
+ }
47
+ }
48
+
49
+ try {
50
+ await assetSync.markSynced();
51
+ } catch (error) {
52
+ const message = error instanceof Error ? error.message : "Unknown error";
53
+
54
+ throw new Error(`Error marking ${assetSync.label} as synced: ${message}`);
55
+ }
56
+
57
+ yield {
58
+ status: "success",
59
+ message: `Synced ${assetSync.label}: ${assetSync.path}`,
60
+ };
61
+ return;
62
+ };
@@ -0,0 +1,482 @@
1
+ import { describe, it } from "vitest";
2
+
3
+ import { fixture, withFixtures } from "../../test-fixtures/fixture.ts";
4
+ import {
5
+ mockCreateImageFile,
6
+ mockCreateIsobmffFile,
7
+ mockCreateIsobmffTrack,
8
+ mockGetUploadImageFile,
9
+ mockUploadIsobmffFileIndex,
10
+ useMSW,
11
+ } from "../../test-fixtures/network.ts";
12
+
13
+ describe("syncAssetsDirectory", () => {
14
+ const server = useMSW();
15
+
16
+ describe("Image sync", () => {
17
+ it("Syncs assets directory when file is already uploaded", async () => {
18
+ await withFixtures(
19
+ [fixture("test.png", "test.png")],
20
+ async ({
21
+ files: [testPng],
22
+ expectCacheFiles,
23
+ expectInfoFileContent,
24
+ syncAssetsDirectory,
25
+ cacheImage,
26
+ }) => {
27
+ server.use(
28
+ mockCreateImageFile({
29
+ complete: true,
30
+ id: "123",
31
+ filename: "test.png",
32
+ fixture: testPng!,
33
+ }),
34
+ );
35
+ await cacheImage(testPng!);
36
+ await syncAssetsDirectory();
37
+ await expectCacheFiles(testPng!, ["test.png", "test.png.info"]);
38
+
39
+ await expectInfoFileContent("test.png.info", testPng!, {
40
+ complete: true,
41
+ id: "123",
42
+ });
43
+ },
44
+ );
45
+ });
46
+
47
+ it("Syncs assets directory when file is not uploaded", async () => {
48
+ await withFixtures(
49
+ [fixture("test.png", "test.png")],
50
+ async ({
51
+ files: [testPng],
52
+ expectCacheFiles,
53
+ expectInfoFileContent,
54
+ cacheImage,
55
+ syncAssetsDirectory,
56
+ }) => {
57
+ server.use(
58
+ mockCreateImageFile({
59
+ complete: false,
60
+ id: "123",
61
+ filename: "test.png",
62
+ fixture: testPng!,
63
+ }),
64
+ mockGetUploadImageFile({
65
+ complete: true,
66
+ id: "123",
67
+ filename: "test.png",
68
+ fixture: testPng!,
69
+ }),
70
+ );
71
+ await cacheImage(testPng!);
72
+ await syncAssetsDirectory();
73
+ await expectCacheFiles(testPng!, ["test.png", "test.png.info"]);
74
+
75
+ await expectInfoFileContent("test.png.info", testPng!, {
76
+ complete: true,
77
+ id: "123",
78
+ });
79
+ },
80
+ );
81
+ });
82
+
83
+ it("Syncs assets directory when file is present with different name", async () => {
84
+ await withFixtures(
85
+ [fixture("test.png", "test.png"), fixture("test.png", "test2.png")],
86
+ async ({
87
+ files: [testPng, test2Png],
88
+ cacheImage,
89
+ syncAssetsDirectory,
90
+ expectCacheFiles,
91
+ expectInfoFileContent,
92
+ }) => {
93
+ server.use(
94
+ mockCreateImageFile({
95
+ complete: false,
96
+ id: "123",
97
+ filename: "test.png",
98
+ fixture: testPng!,
99
+ }),
100
+ mockGetUploadImageFile({
101
+ complete: true,
102
+ id: "123",
103
+ filename: "test.png",
104
+ fixture: testPng!,
105
+ }),
106
+ mockCreateImageFile({
107
+ complete: false,
108
+ id: "123",
109
+ filename: "test.png",
110
+ fixture: test2Png!,
111
+ }),
112
+ mockGetUploadImageFile({
113
+ complete: true,
114
+ id: "123",
115
+ filename: "test.png",
116
+ fixture: test2Png!,
117
+ }),
118
+ );
119
+
120
+ await cacheImage(testPng!);
121
+ await cacheImage(test2Png!);
122
+ await syncAssetsDirectory();
123
+ await expectCacheFiles(testPng!, [
124
+ "test.png",
125
+ "test.png.info",
126
+ "test2.png",
127
+ "test2.png.info",
128
+ ]);
129
+
130
+ await expectInfoFileContent("test.png.info", testPng!, {
131
+ complete: true,
132
+ id: "123",
133
+ });
134
+
135
+ await expectInfoFileContent("test2.png.info", testPng!, {
136
+ complete: true,
137
+ id: "123",
138
+ });
139
+ },
140
+ );
141
+ });
142
+ });
143
+
144
+ describe("A/V Sync", () => {
145
+ it("Syncs assets directory when fragment index is already uploaded", async () => {
146
+ await withFixtures(
147
+ [fixture("test.mp4", "test.mp4")],
148
+ async ({
149
+ files: [testMp4],
150
+ generateTrack,
151
+ generateTrackFragmentIndex,
152
+ syncAssetsDirectory,
153
+ expectInfoFileContent,
154
+ expectCacheFiles,
155
+ }) => {
156
+ const creationArgs = {
157
+ complete: true,
158
+ id: "123",
159
+ filename: "test.mp4",
160
+ fixture: testMp4!,
161
+ };
162
+ server.use(
163
+ mockCreateIsobmffFile(creationArgs),
164
+
165
+ mockCreateIsobmffTrack({
166
+ complete: true,
167
+ id: "track-1",
168
+ fileId: "123",
169
+ filename: "test.mp4",
170
+ fixture: testMp4!,
171
+ }),
172
+
173
+ mockCreateIsobmffFile(creationArgs),
174
+ mockCreateIsobmffTrack({
175
+ complete: true,
176
+ fileId: "123",
177
+ id: "track-2",
178
+ filename: "test.mp4",
179
+ fixture: testMp4!,
180
+ }),
181
+
182
+ mockCreateIsobmffFile(creationArgs),
183
+ mockUploadIsobmffFileIndex({
184
+ id: "123",
185
+ complete: true,
186
+ }),
187
+ );
188
+ await generateTrack(testMp4!, 1);
189
+ await generateTrack(testMp4!, 2);
190
+ await generateTrackFragmentIndex(testMp4!);
191
+
192
+ await syncAssetsDirectory();
193
+
194
+ await expectCacheFiles(testMp4!, [
195
+ "isobmff.info",
196
+ "test.mp4.track-1.mp4",
197
+ "test.mp4.track-1.mp4.info",
198
+ "test.mp4.track-2.mp4",
199
+ "test.mp4.track-2.mp4.info",
200
+ "test.mp4.tracks.json",
201
+ "test.mp4.tracks.json.info",
202
+ ]);
203
+
204
+ await expectInfoFileContent("isobmff.info", testMp4!, {
205
+ complete: true,
206
+ id: "123",
207
+ byte_size: 31,
208
+ });
209
+
210
+ await expectInfoFileContent("test.mp4.tracks.json.info", testMp4!, {
211
+ complete: true,
212
+ id: "123",
213
+ byte_size: 31,
214
+ });
215
+
216
+ await expectInfoFileContent("test.mp4.track-1.mp4.info", testMp4!, {
217
+ complete: true,
218
+ id: "123:track-1",
219
+ byte_size: 26434,
220
+ });
221
+
222
+ await expectInfoFileContent("test.mp4.track-2.mp4.info", testMp4!, {
223
+ complete: true,
224
+ id: "123:track-2",
225
+ byte_size: 26434,
226
+ });
227
+ },
228
+ );
229
+ });
230
+
231
+ it("Syncs assets directory when fragment index is not uploaded", async () => {
232
+ await withFixtures(
233
+ [fixture("test.mp4", "test.mp4")],
234
+ async ({
235
+ files: [testMp4],
236
+
237
+ syncAssetsDirectory,
238
+ expectCacheFiles,
239
+ expectInfoFileContent,
240
+ generateTrackFragmentIndex,
241
+ generateTrack,
242
+ }) => {
243
+ const creationArgs = {
244
+ complete: false,
245
+ id: "123",
246
+ filename: "test.mp4",
247
+ fixture: testMp4!,
248
+ };
249
+ server.use(
250
+ mockCreateIsobmffFile(creationArgs),
251
+ mockUploadIsobmffFileIndex({
252
+ id: "123",
253
+ complete: true,
254
+ }),
255
+
256
+ mockCreateIsobmffFile(creationArgs),
257
+ mockCreateIsobmffTrack({
258
+ complete: true,
259
+ id: "track-1",
260
+ fileId: "123",
261
+ filename: "test.mp4",
262
+ fixture: testMp4!,
263
+ }),
264
+
265
+ mockCreateIsobmffFile(creationArgs),
266
+ mockCreateIsobmffTrack({
267
+ complete: true,
268
+ fileId: "123",
269
+ id: "track-2",
270
+ filename: "test.mp4",
271
+ fixture: testMp4!,
272
+ }),
273
+ );
274
+ await generateTrackFragmentIndex(testMp4!);
275
+ await generateTrack(testMp4!, 1);
276
+ await generateTrack(testMp4!, 2);
277
+
278
+ await syncAssetsDirectory();
279
+
280
+ await expectCacheFiles(testMp4!, [
281
+ "isobmff.info",
282
+ "test.mp4.track-1.mp4",
283
+ "test.mp4.track-1.mp4.info",
284
+ "test.mp4.track-2.mp4",
285
+ "test.mp4.track-2.mp4.info",
286
+ "test.mp4.tracks.json",
287
+ "test.mp4.tracks.json.info",
288
+ ]);
289
+
290
+ await expectInfoFileContent("isobmff.info", testMp4!, {
291
+ complete: true,
292
+ id: "123",
293
+ byte_size: 31,
294
+ });
295
+
296
+ await expectInfoFileContent("test.mp4.tracks.json.info", testMp4!, {
297
+ byte_size: 31,
298
+ complete: true,
299
+ id: "123",
300
+ });
301
+
302
+ await expectInfoFileContent("test.mp4.track-1.mp4.info", testMp4!, {
303
+ byte_size: 26434,
304
+ complete: true,
305
+ id: "123:track-1",
306
+ });
307
+
308
+ await expectInfoFileContent("test.mp4.track-2.mp4.info", testMp4!, {
309
+ byte_size: 26434,
310
+ complete: true,
311
+ id: "123:track-2",
312
+ });
313
+ },
314
+ );
315
+ });
316
+
317
+ it("Syncs assets when file has already been synced with a different name", async () => {
318
+ await withFixtures(
319
+ [fixture("test.mp4", "test.mp4"), fixture("test.mp4", "test2.mp4")],
320
+ async ({
321
+ files: [testMp4, test2Mp4],
322
+ syncAssetsDirectory,
323
+ generateTrackFragmentIndex,
324
+ generateTrack,
325
+ expectInfoFileContent,
326
+ expectCacheFiles,
327
+ }) => {
328
+ server.use(
329
+ mockCreateIsobmffFile({
330
+ complete: true,
331
+ id: "123",
332
+ filename: "test.mp4",
333
+ fixture: testMp4!,
334
+ }),
335
+ mockCreateIsobmffFile({
336
+ complete: true,
337
+ id: "123",
338
+ filename: "test.mp4",
339
+ fixture: testMp4!,
340
+ }),
341
+ mockCreateIsobmffFile({
342
+ complete: true,
343
+ id: "123",
344
+ filename: "test.mp4",
345
+ fixture: testMp4!,
346
+ }),
347
+
348
+ mockCreateIsobmffTrack({
349
+ complete: true,
350
+ id: "track-1",
351
+ fileId: "123",
352
+ filename: "test.mp4",
353
+ fixture: test2Mp4!,
354
+ }),
355
+
356
+ mockCreateIsobmffTrack({
357
+ complete: true,
358
+ id: "track-2",
359
+ fileId: "123",
360
+ filename: "test.mp4",
361
+ fixture: test2Mp4!,
362
+ }),
363
+
364
+ mockUploadIsobmffFileIndex({
365
+ id: "123",
366
+ complete: true,
367
+ }),
368
+ );
369
+ server.use(
370
+ mockCreateIsobmffFile({
371
+ complete: true,
372
+ id: "123",
373
+ filename: "test.mp4",
374
+ fixture: testMp4!,
375
+ }),
376
+ mockCreateIsobmffFile({
377
+ complete: true,
378
+ id: "123",
379
+ filename: "test.mp4",
380
+ fixture: testMp4!,
381
+ }),
382
+ mockCreateIsobmffFile({
383
+ complete: true,
384
+ id: "123",
385
+ filename: "test.mp4",
386
+ fixture: testMp4!,
387
+ }),
388
+
389
+ mockCreateIsobmffTrack({
390
+ complete: true,
391
+ id: "track-1",
392
+ fileId: "123",
393
+ filename: "test.mp4",
394
+ fixture: test2Mp4!,
395
+ }),
396
+
397
+ mockCreateIsobmffTrack({
398
+ complete: true,
399
+ id: "track-2",
400
+ fileId: "123",
401
+ filename: "test.mp4",
402
+ fixture: test2Mp4!,
403
+ }),
404
+
405
+ mockUploadIsobmffFileIndex({
406
+ id: "123",
407
+ complete: true,
408
+ }),
409
+ );
410
+
411
+ await generateTrackFragmentIndex(testMp4!);
412
+ await generateTrack(testMp4!, 1);
413
+ await generateTrack(testMp4!, 2);
414
+
415
+ await generateTrackFragmentIndex(test2Mp4!);
416
+ await generateTrack(test2Mp4!, 1);
417
+ await generateTrack(test2Mp4!, 2);
418
+ await syncAssetsDirectory();
419
+
420
+ await expectCacheFiles(test2Mp4!, [
421
+ "isobmff.info",
422
+ "test.mp4.track-1.mp4",
423
+ "test.mp4.track-1.mp4.info",
424
+ "test.mp4.track-2.mp4",
425
+ "test.mp4.track-2.mp4.info",
426
+ "test.mp4.tracks.json",
427
+
428
+ "test.mp4.tracks.json.info",
429
+ "test2.mp4.track-1.mp4",
430
+ "test2.mp4.track-1.mp4.info",
431
+ "test2.mp4.track-2.mp4",
432
+ "test2.mp4.track-2.mp4.info",
433
+ "test2.mp4.tracks.json",
434
+ "test2.mp4.tracks.json.info",
435
+ ]);
436
+
437
+ await expectInfoFileContent("isobmff.info", testMp4!, {
438
+ byte_size: 31,
439
+ complete: true,
440
+ id: "123",
441
+ });
442
+
443
+ await expectInfoFileContent("test2.mp4.tracks.json.info", testMp4!, {
444
+ byte_size: 31,
445
+ complete: true,
446
+ id: "123",
447
+ });
448
+
449
+ await expectInfoFileContent("test2.mp4.track-1.mp4.info", testMp4!, {
450
+ byte_size: 26434,
451
+ complete: true,
452
+ id: "123:track-1",
453
+ });
454
+
455
+ await expectInfoFileContent("test2.mp4.track-2.mp4.info", testMp4!, {
456
+ byte_size: 26434,
457
+ complete: true,
458
+ id: "123:track-2",
459
+ });
460
+
461
+ await expectInfoFileContent("test.mp4.tracks.json.info", testMp4!, {
462
+ byte_size: 31,
463
+ complete: true,
464
+ id: "123",
465
+ });
466
+
467
+ await expectInfoFileContent("test.mp4.track-1.mp4.info", testMp4!, {
468
+ byte_size: 26434,
469
+ complete: true,
470
+ id: "123:track-1",
471
+ });
472
+
473
+ await expectInfoFileContent("test.mp4.track-2.mp4.info", testMp4!, {
474
+ byte_size: 26434,
475
+ complete: true,
476
+ id: "123:track-2",
477
+ });
478
+ },
479
+ );
480
+ });
481
+ });
482
+ });