@editframe/cli 0.26.3-beta.0 → 0.26.4-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/VERSION.js +1 -1
- package/dist/VERSION.js.map +1 -1
- package/package.json +5 -5
- package/src/commands/auth.ts +0 -46
- package/src/commands/check.ts +0 -129
- package/src/commands/mux.ts +0 -10
- package/src/commands/preview.ts +0 -9
- package/src/commands/process-file.ts +0 -55
- package/src/commands/process.ts +0 -41
- package/src/commands/render.ts +0 -190
- package/src/commands/sync.ts +0 -13
- package/src/commands/test-asset.file +0 -0
- package/src/commands/webhook.ts +0 -76
- package/src/operations/processRenderInfo.ts +0 -40
- package/src/operations/syncAssetsDirectory/SubAssetSync.ts +0 -45
- package/src/operations/syncAssetsDirectory/SyncCaption.test.ts +0 -180
- package/src/operations/syncAssetsDirectory/SyncCaption.ts +0 -87
- package/src/operations/syncAssetsDirectory/SyncFragmentIndex.test.ts +0 -185
- package/src/operations/syncAssetsDirectory/SyncFragmentIndex.ts +0 -101
- package/src/operations/syncAssetsDirectory/SyncImage.test.ts +0 -162
- package/src/operations/syncAssetsDirectory/SyncImage.ts +0 -123
- package/src/operations/syncAssetsDirectory/SyncStatus.ts +0 -50
- package/src/operations/syncAssetsDirectory/SyncTrack.test.ts +0 -265
- package/src/operations/syncAssetsDirectory/SyncTrack.ts +0 -175
- package/src/operations/syncAssetsDirectory/doAssetSync.test.ts +0 -134
- package/src/operations/syncAssetsDirectory/doAssetSync.ts +0 -62
- package/src/operations/syncAssetsDirectory.test.ts +0 -510
- package/src/operations/syncAssetsDirectory.ts +0 -91
- package/src/utils/attachWorkbench.ts +0 -16
- package/src/utils/createReadableStreamFromReadable.ts +0 -113
- package/src/utils/getFolderSize.ts +0 -20
- package/src/utils/index.ts +0 -20
- package/src/utils/launchBrowserAndWaitForSDK.ts +0 -64
- package/src/utils/startDevServer.ts +0 -61
- package/src/utils/startPreviewServer.ts +0 -38
- package/src/utils/validateVideoResolution.ts +0 -36
- package/src/utils/withSpinner.ts +0 -16
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { setupServer } from "msw/node";
|
|
2
|
-
import { afterAll, afterEach, beforeAll, describe, expect, test } from "vitest";
|
|
3
|
-
import { fixture, withFixtures } from "../../../test-fixtures/fixture.js";
|
|
4
|
-
import {
|
|
5
|
-
mockCreateImageFile,
|
|
6
|
-
mockGetUploadImageFile,
|
|
7
|
-
mockLookupImageFileByMd5,
|
|
8
|
-
mockLookupImageFileByMd5NotFound,
|
|
9
|
-
} from "../../../test-fixtures/network.js";
|
|
10
|
-
import { SyncImage } from "./SyncImage.js";
|
|
11
|
-
|
|
12
|
-
const server = setupServer();
|
|
13
|
-
|
|
14
|
-
describe("SyncImage", async () => {
|
|
15
|
-
beforeAll(() => {
|
|
16
|
-
server.listen();
|
|
17
|
-
process.env.EF_TOKEN = "ef_SECRET_TOKEN";
|
|
18
|
-
process.env.EF_HOST = "http://localhost:3000";
|
|
19
|
-
});
|
|
20
|
-
afterAll(() => server.close());
|
|
21
|
-
afterEach(() => server.resetHandlers());
|
|
22
|
-
await withFixtures(
|
|
23
|
-
[fixture("test.png", "test.png")],
|
|
24
|
-
async ({ files: [image], cacheImage }) => {
|
|
25
|
-
test("Reads byte size", async () => {
|
|
26
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
27
|
-
await expect(syncImage.byteSize()).resolves.toEqual(276);
|
|
28
|
-
});
|
|
29
|
-
test("prepare() probes image", async () => {
|
|
30
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
31
|
-
await expect(syncImage.prepare()).resolves.toBeUndefined();
|
|
32
|
-
console.log(syncImage.probeResult);
|
|
33
|
-
expect(syncImage.probeResult.data.format).toMatchObject({
|
|
34
|
-
format_name: "png_pipe",
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe("validate()", () => {
|
|
38
|
-
test("Throws when prepare() is not called", async () => {
|
|
39
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
40
|
-
await expect(syncImage.validate()).rejects.toThrow();
|
|
41
|
-
});
|
|
42
|
-
test.skip("throws when probe is not a supported image", async () => {});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
describe(".create()", () => {
|
|
46
|
-
test("Throws when prepare() is not called", async () => {
|
|
47
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
48
|
-
await expect(syncImage.create()).rejects.toThrow();
|
|
49
|
-
});
|
|
50
|
-
test("Skips creation if image file matches md5", async () => {
|
|
51
|
-
server.use(
|
|
52
|
-
mockLookupImageFileByMd5({
|
|
53
|
-
md5: image!.md5,
|
|
54
|
-
fixture: image!,
|
|
55
|
-
}),
|
|
56
|
-
);
|
|
57
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
58
|
-
await syncImage.prepare();
|
|
59
|
-
await syncImage.create();
|
|
60
|
-
expect(syncImage.isComplete()).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
test("isComplete() returns false when not created", async () => {
|
|
63
|
-
server.use(
|
|
64
|
-
mockLookupImageFileByMd5NotFound({
|
|
65
|
-
md5: image!.md5,
|
|
66
|
-
}),
|
|
67
|
-
mockCreateImageFile({
|
|
68
|
-
complete: false,
|
|
69
|
-
id: "123",
|
|
70
|
-
filename: "test.mp4",
|
|
71
|
-
fixture: image!,
|
|
72
|
-
}),
|
|
73
|
-
);
|
|
74
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
75
|
-
await syncImage.prepare();
|
|
76
|
-
await syncImage.create();
|
|
77
|
-
expect(syncImage.isComplete()).toBe(false);
|
|
78
|
-
});
|
|
79
|
-
test("isComplete() returns true when created", async () => {
|
|
80
|
-
server.use(
|
|
81
|
-
mockLookupImageFileByMd5NotFound({
|
|
82
|
-
md5: image!.md5,
|
|
83
|
-
}),
|
|
84
|
-
mockCreateImageFile({
|
|
85
|
-
complete: true,
|
|
86
|
-
id: "123",
|
|
87
|
-
filename: "test.mp4",
|
|
88
|
-
fixture: image!,
|
|
89
|
-
}),
|
|
90
|
-
);
|
|
91
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
92
|
-
await syncImage.prepare();
|
|
93
|
-
await syncImage.create();
|
|
94
|
-
expect(syncImage.isComplete()).toBe(true);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
describe(".upload()", () => {
|
|
98
|
-
test("throws when not created", async () => {
|
|
99
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
100
|
-
await syncImage.prepare();
|
|
101
|
-
await expect(() => syncImage.upload()).rejects.toThrow();
|
|
102
|
-
});
|
|
103
|
-
test("uploads image", async () => {
|
|
104
|
-
server.use(
|
|
105
|
-
mockLookupImageFileByMd5NotFound({
|
|
106
|
-
md5: image!.md5,
|
|
107
|
-
}),
|
|
108
|
-
mockCreateImageFile({
|
|
109
|
-
complete: false,
|
|
110
|
-
id: "123",
|
|
111
|
-
filename: "test.mp4",
|
|
112
|
-
fixture: image!,
|
|
113
|
-
}),
|
|
114
|
-
mockGetUploadImageFile({
|
|
115
|
-
id: "123",
|
|
116
|
-
fixture: image!,
|
|
117
|
-
}),
|
|
118
|
-
);
|
|
119
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
120
|
-
await syncImage.prepare();
|
|
121
|
-
await syncImage.create();
|
|
122
|
-
await expect(syncImage.upload()).resolves.toBeUndefined();
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
describe(".markSynced()", () => {
|
|
126
|
-
test("throws when not created", async () => {
|
|
127
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
128
|
-
await expect(syncImage.markSynced()).rejects.toThrow();
|
|
129
|
-
});
|
|
130
|
-
test("marks synced", async () => {
|
|
131
|
-
server.use(
|
|
132
|
-
mockLookupImageFileByMd5NotFound({
|
|
133
|
-
md5: image!.md5,
|
|
134
|
-
}),
|
|
135
|
-
mockCreateImageFile({
|
|
136
|
-
complete: true,
|
|
137
|
-
id: "123",
|
|
138
|
-
fixture: image!,
|
|
139
|
-
}),
|
|
140
|
-
mockGetUploadImageFile({
|
|
141
|
-
id: "123",
|
|
142
|
-
fixture: image!,
|
|
143
|
-
}),
|
|
144
|
-
);
|
|
145
|
-
const syncImage = new SyncImage(await cacheImage(image!), image!.md5);
|
|
146
|
-
await syncImage.prepare();
|
|
147
|
-
await syncImage.create();
|
|
148
|
-
await syncImage.upload();
|
|
149
|
-
await syncImage.markSynced();
|
|
150
|
-
await expect(syncImage.syncStatus.isSynced()).resolves.toBe(true);
|
|
151
|
-
await expect(syncImage.syncStatus.readInfo()).resolves.toEqual({
|
|
152
|
-
version: "1",
|
|
153
|
-
complete: true,
|
|
154
|
-
id: "123",
|
|
155
|
-
md5: image!.md5,
|
|
156
|
-
byte_size: 276,
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
},
|
|
161
|
-
);
|
|
162
|
-
});
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { createReadStream } from "node:fs";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import path, { basename } from "node:path";
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
type CreateImageFileResult,
|
|
7
|
-
createImageFile,
|
|
8
|
-
type LookupImageFileByMd5Result,
|
|
9
|
-
lookupImageFileByMd5,
|
|
10
|
-
uploadImageFile,
|
|
11
|
-
} from "@editframe/api";
|
|
12
|
-
|
|
13
|
-
import { Probe } from "@editframe/assets";
|
|
14
|
-
|
|
15
|
-
import { createReadableStreamFromReadable } from "../../utils/createReadableStreamFromReadable.js";
|
|
16
|
-
import { getClient } from "../../utils/index.js";
|
|
17
|
-
import type { SubAssetSync } from "./SubAssetSync.js";
|
|
18
|
-
import { SyncStatus } from "./SyncStatus.js";
|
|
19
|
-
|
|
20
|
-
export class SyncImage implements SubAssetSync<CreateImageFileResult> {
|
|
21
|
-
icon = "🖼️";
|
|
22
|
-
label = "image";
|
|
23
|
-
syncStatus: SyncStatus = new SyncStatus(this.path);
|
|
24
|
-
created: CreateImageFileResult | LookupImageFileByMd5Result | null = null;
|
|
25
|
-
|
|
26
|
-
constructor(
|
|
27
|
-
public path: string,
|
|
28
|
-
public md5: string,
|
|
29
|
-
) {}
|
|
30
|
-
|
|
31
|
-
private _probeResult: Probe | null = null;
|
|
32
|
-
|
|
33
|
-
async prepare() {
|
|
34
|
-
this._probeResult = await Probe.probePath(this.path);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get probeResult() {
|
|
38
|
-
if (!this._probeResult) {
|
|
39
|
-
throw new Error("Probe result not found. Call prepare() first.");
|
|
40
|
-
}
|
|
41
|
-
return this._probeResult;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
get extension() {
|
|
45
|
-
return path.extname(this.path).slice(1);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async byteSize() {
|
|
49
|
-
return (await fs.stat(this.path)).size;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async validate() {
|
|
53
|
-
const [videoProbe] = this.probeResult.videoStreams;
|
|
54
|
-
if (!videoProbe) {
|
|
55
|
-
throw new Error(`No media info found in image: ${this.path}`);
|
|
56
|
-
}
|
|
57
|
-
const ext = this.extension;
|
|
58
|
-
if (!(ext === "jpg" || ext === "jpeg" || ext === "png" || ext === "webp")) {
|
|
59
|
-
throw new Error(`Invalid image format: ${this.path}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async create() {
|
|
63
|
-
const byteSize = (await fs.stat(this.path)).size;
|
|
64
|
-
const [videoProbe] = this.probeResult.videoStreams;
|
|
65
|
-
if (!videoProbe) {
|
|
66
|
-
throw new Error(
|
|
67
|
-
"No video stream found in image. Should have been prevented by .validate()",
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const maybeImageFile = await lookupImageFileByMd5(getClient(), this.md5);
|
|
72
|
-
if (maybeImageFile) {
|
|
73
|
-
this.created = maybeImageFile;
|
|
74
|
-
} else {
|
|
75
|
-
this.created = await createImageFile(getClient(), {
|
|
76
|
-
md5: this.md5,
|
|
77
|
-
filename: basename(this.path),
|
|
78
|
-
width: videoProbe.width,
|
|
79
|
-
height: videoProbe.height,
|
|
80
|
-
mime_type: `image/${this.extension}` as
|
|
81
|
-
| "image/jpeg"
|
|
82
|
-
| "image/png"
|
|
83
|
-
| "image/jpg"
|
|
84
|
-
| "image/webp"
|
|
85
|
-
| "image/svg+xml",
|
|
86
|
-
byte_size: byteSize,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
isComplete() {
|
|
91
|
-
return !!this.created?.complete;
|
|
92
|
-
}
|
|
93
|
-
async upload() {
|
|
94
|
-
if (!this.created) {
|
|
95
|
-
throw new Error(
|
|
96
|
-
"Image not created. Should have been prevented by .isComplete()",
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
await uploadImageFile(
|
|
100
|
-
getClient(),
|
|
101
|
-
{
|
|
102
|
-
id: this.created.id,
|
|
103
|
-
byte_size: Number.parseInt(this.probeResult.format.size || "0", 10),
|
|
104
|
-
},
|
|
105
|
-
createReadableStreamFromReadable(createReadStream(this.path)),
|
|
106
|
-
).whenUploaded();
|
|
107
|
-
}
|
|
108
|
-
async markSynced() {
|
|
109
|
-
if (!this.created) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
"Image not created. Should have been prevented by .isComplete()",
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
const byteSize = await this.byteSize();
|
|
115
|
-
return this.syncStatus.markSynced({
|
|
116
|
-
version: "1",
|
|
117
|
-
complete: true,
|
|
118
|
-
id: this.created.id,
|
|
119
|
-
md5: this.md5,
|
|
120
|
-
byte_size: byteSize,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
|
|
5
|
-
const SYNC_VERSION = "1";
|
|
6
|
-
|
|
7
|
-
const SyncStatusSchema = z.object({
|
|
8
|
-
version: z.string(),
|
|
9
|
-
complete: z.boolean(),
|
|
10
|
-
id: z.string(),
|
|
11
|
-
md5: z.string(),
|
|
12
|
-
byte_size: z.number(),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export interface SyncStatusInfo extends z.infer<typeof SyncStatusSchema> {}
|
|
16
|
-
|
|
17
|
-
export class SyncStatus {
|
|
18
|
-
infoPath = `${this.basePath}.info`;
|
|
19
|
-
|
|
20
|
-
constructor(private basePath: string) {}
|
|
21
|
-
|
|
22
|
-
async isSynced() {
|
|
23
|
-
const syncInfo = await this.readInfo();
|
|
24
|
-
if (!syncInfo) {
|
|
25
|
-
return false;
|
|
26
|
-
}
|
|
27
|
-
return syncInfo.version === SYNC_VERSION && syncInfo.complete;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async readInfo() {
|
|
31
|
-
try {
|
|
32
|
-
const info = await fs.readFile(this.infoPath, "utf-8");
|
|
33
|
-
return SyncStatusSchema.parse(JSON.parse(info));
|
|
34
|
-
} catch (error) {
|
|
35
|
-
if (
|
|
36
|
-
error instanceof Error &&
|
|
37
|
-
"code" in error &&
|
|
38
|
-
error.code === "ENOENT"
|
|
39
|
-
) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
throw error;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
async markSynced(info: SyncStatusInfo) {
|
|
47
|
-
process.stderr.write(`✏️ Marking asset as synced: ${this.basePath}\n`);
|
|
48
|
-
await fs.writeFile(this.infoPath, JSON.stringify(info, null, 2), "utf-8");
|
|
49
|
-
}
|
|
50
|
-
}
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import { setupServer } from "msw/node";
|
|
2
|
-
import { afterAll, afterEach, beforeAll, describe, expect, test } from "vitest";
|
|
3
|
-
import { fixture, withFixtures } from "../../../test-fixtures/fixture.js";
|
|
4
|
-
import {
|
|
5
|
-
mockCreateIsobmffFile,
|
|
6
|
-
mockCreateIsobmffTrack,
|
|
7
|
-
mockGetIsobmffTrackUpload,
|
|
8
|
-
mockLookupISOBMFFFileByMd5,
|
|
9
|
-
mockLookupISOBMFFFileByMd5NotFound,
|
|
10
|
-
} from "../../../test-fixtures/network.js";
|
|
11
|
-
import { SyncTrack } from "./SyncTrack.js";
|
|
12
|
-
|
|
13
|
-
const server = setupServer();
|
|
14
|
-
|
|
15
|
-
describe("SyncTrack", async () => {
|
|
16
|
-
beforeAll(() => {
|
|
17
|
-
server.listen();
|
|
18
|
-
process.env.EF_TOKEN = "ef_SECRET_TOKEN";
|
|
19
|
-
process.env.EF_HOST = "http://localhost:3000";
|
|
20
|
-
});
|
|
21
|
-
afterAll(() => server.close());
|
|
22
|
-
afterEach(() => server.resetHandlers());
|
|
23
|
-
await withFixtures(
|
|
24
|
-
[fixture("test.mp4", "test.mp4")],
|
|
25
|
-
async ({ files: [video], generateTrack }) => {
|
|
26
|
-
test("Reads byte size", async () => {
|
|
27
|
-
const syncTrack = new SyncTrack(
|
|
28
|
-
await generateTrack(video!, 1),
|
|
29
|
-
video!.md5,
|
|
30
|
-
);
|
|
31
|
-
await expect(syncTrack.byteSize()).resolves.toEqual(26434);
|
|
32
|
-
});
|
|
33
|
-
describe("prepare()", () => {
|
|
34
|
-
test("Uses existing ISOBMFF file if md5 matches", async () => {
|
|
35
|
-
server.use(
|
|
36
|
-
mockLookupISOBMFFFileByMd5({
|
|
37
|
-
complete: true,
|
|
38
|
-
id: "123",
|
|
39
|
-
md5: video!.md5,
|
|
40
|
-
fixture: video!,
|
|
41
|
-
}),
|
|
42
|
-
);
|
|
43
|
-
const syncTrack = new SyncTrack(
|
|
44
|
-
await generateTrack(video!, 1),
|
|
45
|
-
video!.md5,
|
|
46
|
-
);
|
|
47
|
-
await syncTrack.prepare();
|
|
48
|
-
expect(syncTrack.isoFile).toBeDefined();
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test("Creates ISOBMFF file", async () => {
|
|
52
|
-
server.use(
|
|
53
|
-
mockLookupISOBMFFFileByMd5NotFound({
|
|
54
|
-
md5: video!.md5,
|
|
55
|
-
}),
|
|
56
|
-
mockCreateIsobmffFile({
|
|
57
|
-
complete: true,
|
|
58
|
-
id: "123",
|
|
59
|
-
filename: "test.mp4",
|
|
60
|
-
fixture: video!,
|
|
61
|
-
}),
|
|
62
|
-
);
|
|
63
|
-
const syncTrack = new SyncTrack(
|
|
64
|
-
await generateTrack(video!, 1),
|
|
65
|
-
video!.md5,
|
|
66
|
-
);
|
|
67
|
-
await syncTrack.prepare();
|
|
68
|
-
expect(syncTrack.isoFile).toBeDefined();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("Probes track", async () => {
|
|
72
|
-
server.use(
|
|
73
|
-
mockLookupISOBMFFFileByMd5NotFound({
|
|
74
|
-
md5: video!.md5,
|
|
75
|
-
}),
|
|
76
|
-
mockCreateIsobmffFile({
|
|
77
|
-
complete: true,
|
|
78
|
-
id: "123",
|
|
79
|
-
filename: "test.mp4",
|
|
80
|
-
fixture: video!,
|
|
81
|
-
}),
|
|
82
|
-
);
|
|
83
|
-
const syncTrack = new SyncTrack(
|
|
84
|
-
await generateTrack(video!, 1),
|
|
85
|
-
video!.md5,
|
|
86
|
-
);
|
|
87
|
-
await syncTrack.prepare();
|
|
88
|
-
expect(syncTrack.probeResult).toBeDefined();
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
describe("validate()", () => {
|
|
93
|
-
test("throws when prepare() is not called", async () => {
|
|
94
|
-
const syncTrack = new SyncTrack(
|
|
95
|
-
await generateTrack(video!, 1),
|
|
96
|
-
video!.md5,
|
|
97
|
-
);
|
|
98
|
-
await expect(syncTrack.validate()).rejects.toThrow();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test.skip("throws when track has bad duration", async () => {});
|
|
102
|
-
test.skip("throws when track has bad codec_type", async () => {});
|
|
103
|
-
test.skip("throws when no isoFile exists", async () => {});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
describe(".create()", () => {
|
|
107
|
-
test("throws if prepare() is not called", async () => {
|
|
108
|
-
const syncTrack = new SyncTrack(
|
|
109
|
-
await generateTrack(video!, 1),
|
|
110
|
-
video!.md5,
|
|
111
|
-
);
|
|
112
|
-
await expect(syncTrack.create()).rejects.toThrow();
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test("isComplete() returns false when not complete", async () => {
|
|
116
|
-
server.use(
|
|
117
|
-
mockLookupISOBMFFFileByMd5NotFound({
|
|
118
|
-
md5: video!.md5,
|
|
119
|
-
}),
|
|
120
|
-
mockCreateIsobmffFile({
|
|
121
|
-
complete: true,
|
|
122
|
-
id: "123",
|
|
123
|
-
filename: "test.mp4",
|
|
124
|
-
fixture: video!,
|
|
125
|
-
}),
|
|
126
|
-
mockCreateIsobmffTrack({
|
|
127
|
-
complete: false,
|
|
128
|
-
id: "track-1",
|
|
129
|
-
fileId: "123",
|
|
130
|
-
fixture: video!,
|
|
131
|
-
}),
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
const syncTrack = new SyncTrack(
|
|
135
|
-
await generateTrack(video!, 1),
|
|
136
|
-
video!.md5,
|
|
137
|
-
);
|
|
138
|
-
await syncTrack.prepare();
|
|
139
|
-
await syncTrack.create();
|
|
140
|
-
expect(syncTrack.isComplete()).toBe(false);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
test("isComplete() returns true when complete", async () => {
|
|
144
|
-
server.use(
|
|
145
|
-
mockLookupISOBMFFFileByMd5NotFound({
|
|
146
|
-
md5: video!.md5,
|
|
147
|
-
}),
|
|
148
|
-
mockCreateIsobmffFile({
|
|
149
|
-
complete: true,
|
|
150
|
-
id: "123",
|
|
151
|
-
filename: "test.mp4",
|
|
152
|
-
fixture: video!,
|
|
153
|
-
}),
|
|
154
|
-
mockCreateIsobmffTrack({
|
|
155
|
-
complete: true,
|
|
156
|
-
id: "track-1",
|
|
157
|
-
fileId: "123",
|
|
158
|
-
fixture: video!,
|
|
159
|
-
}),
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
const syncTrack = new SyncTrack(
|
|
163
|
-
await generateTrack(video!, 1),
|
|
164
|
-
video!.md5,
|
|
165
|
-
);
|
|
166
|
-
await syncTrack.prepare();
|
|
167
|
-
await syncTrack.create();
|
|
168
|
-
expect(syncTrack.isComplete()).toBe(true);
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
describe(".upload()", () => {
|
|
173
|
-
test("throws when not created", async () => {
|
|
174
|
-
const syncTrack = new SyncTrack(
|
|
175
|
-
await generateTrack(video!, 1),
|
|
176
|
-
video!.md5,
|
|
177
|
-
);
|
|
178
|
-
await expect(syncTrack.upload()).rejects.toThrow();
|
|
179
|
-
});
|
|
180
|
-
test("uploads track", async () => {
|
|
181
|
-
server.use(
|
|
182
|
-
mockLookupISOBMFFFileByMd5NotFound({
|
|
183
|
-
md5: video!.md5,
|
|
184
|
-
}),
|
|
185
|
-
mockCreateIsobmffFile({
|
|
186
|
-
complete: true,
|
|
187
|
-
id: "123",
|
|
188
|
-
filename: "test.mp4",
|
|
189
|
-
fixture: video!,
|
|
190
|
-
}),
|
|
191
|
-
mockCreateIsobmffTrack({
|
|
192
|
-
complete: true,
|
|
193
|
-
id: "track-1",
|
|
194
|
-
fileId: "123",
|
|
195
|
-
fixture: video!,
|
|
196
|
-
}),
|
|
197
|
-
mockGetIsobmffTrackUpload({
|
|
198
|
-
complete: true,
|
|
199
|
-
id: "track-1",
|
|
200
|
-
trackId: 1,
|
|
201
|
-
fileId: "123",
|
|
202
|
-
}),
|
|
203
|
-
);
|
|
204
|
-
const syncTrack = new SyncTrack(
|
|
205
|
-
await generateTrack(video!, 1),
|
|
206
|
-
video!.md5,
|
|
207
|
-
);
|
|
208
|
-
await syncTrack.prepare();
|
|
209
|
-
await syncTrack.create();
|
|
210
|
-
await expect(syncTrack.upload()).resolves.toBeUndefined();
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
describe(".markSynced()", () => {
|
|
214
|
-
test("throws when not created", async () => {
|
|
215
|
-
const syncTrack = new SyncTrack(
|
|
216
|
-
await generateTrack(video!, 1),
|
|
217
|
-
video!.md5,
|
|
218
|
-
);
|
|
219
|
-
await expect(syncTrack.markSynced()).rejects.toThrow();
|
|
220
|
-
});
|
|
221
|
-
test("marks synced", async () => {
|
|
222
|
-
server.use(
|
|
223
|
-
mockLookupISOBMFFFileByMd5NotFound({
|
|
224
|
-
md5: video!.md5,
|
|
225
|
-
}),
|
|
226
|
-
mockCreateIsobmffFile({
|
|
227
|
-
complete: true,
|
|
228
|
-
id: "123",
|
|
229
|
-
fixture: video!,
|
|
230
|
-
}),
|
|
231
|
-
mockCreateIsobmffTrack({
|
|
232
|
-
complete: true,
|
|
233
|
-
id: "track-1",
|
|
234
|
-
fileId: "123",
|
|
235
|
-
fixture: video!,
|
|
236
|
-
}),
|
|
237
|
-
);
|
|
238
|
-
const syncTrack = new SyncTrack(
|
|
239
|
-
await generateTrack(video!, 1),
|
|
240
|
-
video!.md5,
|
|
241
|
-
);
|
|
242
|
-
await syncTrack.prepare();
|
|
243
|
-
await syncTrack.create();
|
|
244
|
-
await syncTrack.markSynced();
|
|
245
|
-
await expect(syncTrack.syncStatus.isSynced()).resolves.toBe(true);
|
|
246
|
-
await expect(syncTrack.syncStatus.readInfo()).resolves.toEqual({
|
|
247
|
-
version: "1",
|
|
248
|
-
complete: true,
|
|
249
|
-
id: "123:track-1",
|
|
250
|
-
md5: video!.md5,
|
|
251
|
-
byte_size: 26434,
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
await expect(syncTrack.fileSyncStatus.readInfo()).resolves.toEqual({
|
|
255
|
-
version: "1",
|
|
256
|
-
complete: true,
|
|
257
|
-
id: "123",
|
|
258
|
-
md5: video!.md5,
|
|
259
|
-
byte_size: 26434,
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
},
|
|
264
|
-
);
|
|
265
|
-
});
|