@liqhtworks/sophon-sdk 0.1.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/.github/workflows/publish.yml +56 -0
- package/.openapi-generator/FILES +73 -0
- package/.openapi-generator/VERSION +1 -0
- package/.openapi-generator-ignore +23 -0
- package/LICENSE +12 -0
- package/README.md +164 -0
- package/dist/apis/DownloadsApi.d.ts +63 -0
- package/dist/apis/DownloadsApi.js +58 -0
- package/dist/apis/HealthApi.d.ts +92 -0
- package/dist/apis/HealthApi.js +85 -0
- package/dist/apis/JobsApi.d.ts +225 -0
- package/dist/apis/JobsApi.js +245 -0
- package/dist/apis/UploadsApi.d.ts +228 -0
- package/dist/apis/UploadsApi.js +255 -0
- package/dist/apis/WebhooksApi.d.ts +138 -0
- package/dist/apis/WebhooksApi.js +152 -0
- package/dist/apis/index.d.ts +5 -0
- package/dist/apis/index.js +23 -0
- package/dist/esm/apis/DownloadsApi.d.ts +63 -0
- package/dist/esm/apis/DownloadsApi.js +54 -0
- package/dist/esm/apis/HealthApi.d.ts +92 -0
- package/dist/esm/apis/HealthApi.js +81 -0
- package/dist/esm/apis/JobsApi.d.ts +225 -0
- package/dist/esm/apis/JobsApi.js +241 -0
- package/dist/esm/apis/UploadsApi.d.ts +228 -0
- package/dist/esm/apis/UploadsApi.js +251 -0
- package/dist/esm/apis/WebhooksApi.d.ts +138 -0
- package/dist/esm/apis/WebhooksApi.js +148 -0
- package/dist/esm/apis/index.d.ts +5 -0
- package/dist/esm/apis/index.js +7 -0
- package/dist/esm/helpers/index.d.ts +3 -0
- package/dist/esm/helpers/index.js +3 -0
- package/dist/esm/helpers/jobs.d.ts +48 -0
- package/dist/esm/helpers/jobs.js +61 -0
- package/dist/esm/helpers/uploads.d.ts +71 -0
- package/dist/esm/helpers/uploads.js +146 -0
- package/dist/esm/helpers/webhooks.d.ts +23 -0
- package/dist/esm/helpers/webhooks.js +84 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/models/CompleteUploadResponse.d.ts +57 -0
- package/dist/esm/models/CompleteUploadResponse.js +63 -0
- package/dist/esm/models/CreateJobOutputOptions.d.ts +55 -0
- package/dist/esm/models/CreateJobOutputOptions.js +46 -0
- package/dist/esm/models/CreateJobRequest.d.ts +61 -0
- package/dist/esm/models/CreateJobRequest.js +56 -0
- package/dist/esm/models/CreateUploadRequest.d.ts +44 -0
- package/dist/esm/models/CreateUploadRequest.js +51 -0
- package/dist/esm/models/CreateUploadResponse.d.ts +52 -0
- package/dist/esm/models/CreateUploadResponse.js +55 -0
- package/dist/esm/models/CreateWebhookRequest.d.ts +40 -0
- package/dist/esm/models/CreateWebhookRequest.js +45 -0
- package/dist/esm/models/ErrorBody.d.ts +72 -0
- package/dist/esm/models/ErrorBody.js +74 -0
- package/dist/esm/models/ErrorEnvelope.d.ts +33 -0
- package/dist/esm/models/ErrorEnvelope.js +44 -0
- package/dist/esm/models/JobOutputInfo.d.ts +95 -0
- package/dist/esm/models/JobOutputInfo.js +72 -0
- package/dist/esm/models/JobProfile.d.ts +49 -0
- package/dist/esm/models/JobProfile.js +69 -0
- package/dist/esm/models/JobProgress.d.ts +75 -0
- package/dist/esm/models/JobProgress.js +60 -0
- package/dist/esm/models/JobResponse.d.ts +134 -0
- package/dist/esm/models/JobResponse.js +94 -0
- package/dist/esm/models/JobSourceInfo.d.ts +62 -0
- package/dist/esm/models/JobSourceInfo.js +53 -0
- package/dist/esm/models/JobSourceType.d.ts +24 -0
- package/dist/esm/models/JobSourceType.js +44 -0
- package/dist/esm/models/JobStatus.d.ts +31 -0
- package/dist/esm/models/JobStatus.js +51 -0
- package/dist/esm/models/ListJobsResponse.d.ts +45 -0
- package/dist/esm/models/ListJobsResponse.js +50 -0
- package/dist/esm/models/OutputContainer.d.ts +27 -0
- package/dist/esm/models/OutputContainer.js +47 -0
- package/dist/esm/models/ReadyResponse.d.ts +38 -0
- package/dist/esm/models/ReadyResponse.js +45 -0
- package/dist/esm/models/UploadJobSource.d.ts +39 -0
- package/dist/esm/models/UploadJobSource.js +48 -0
- package/dist/esm/models/UploadPartResponse.d.ts +38 -0
- package/dist/esm/models/UploadPartResponse.js +47 -0
- package/dist/esm/models/UploadStatusResponse.d.ts +96 -0
- package/dist/esm/models/UploadStatusResponse.js +80 -0
- package/dist/esm/models/WebhookDeliveryPayload.d.ts +85 -0
- package/dist/esm/models/WebhookDeliveryPayload.js +83 -0
- package/dist/esm/models/WebhookListItem.d.ts +50 -0
- package/dist/esm/models/WebhookListItem.js +55 -0
- package/dist/esm/models/WebhookListResponse.d.ts +33 -0
- package/dist/esm/models/WebhookListResponse.js +44 -0
- package/dist/esm/models/WebhookResponse.d.ts +58 -0
- package/dist/esm/models/WebhookResponse.js +59 -0
- package/dist/esm/models/index.d.ts +25 -0
- package/dist/esm/models/index.js +27 -0
- package/dist/esm/runtime.d.ts +184 -0
- package/dist/esm/runtime.js +348 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.js +19 -0
- package/dist/helpers/jobs.d.ts +48 -0
- package/dist/helpers/jobs.js +67 -0
- package/dist/helpers/uploads.d.ts +71 -0
- package/dist/helpers/uploads.js +149 -0
- package/dist/helpers/webhooks.d.ts +23 -0
- package/dist/helpers/webhooks.js +89 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +22 -0
- package/dist/models/CompleteUploadResponse.d.ts +57 -0
- package/dist/models/CompleteUploadResponse.js +71 -0
- package/dist/models/CreateJobOutputOptions.d.ts +55 -0
- package/dist/models/CreateJobOutputOptions.js +53 -0
- package/dist/models/CreateJobRequest.d.ts +61 -0
- package/dist/models/CreateJobRequest.js +63 -0
- package/dist/models/CreateUploadRequest.d.ts +44 -0
- package/dist/models/CreateUploadRequest.js +58 -0
- package/dist/models/CreateUploadResponse.d.ts +52 -0
- package/dist/models/CreateUploadResponse.js +62 -0
- package/dist/models/CreateWebhookRequest.d.ts +40 -0
- package/dist/models/CreateWebhookRequest.js +52 -0
- package/dist/models/ErrorBody.d.ts +72 -0
- package/dist/models/ErrorBody.js +82 -0
- package/dist/models/ErrorEnvelope.d.ts +33 -0
- package/dist/models/ErrorEnvelope.js +51 -0
- package/dist/models/JobOutputInfo.d.ts +95 -0
- package/dist/models/JobOutputInfo.js +80 -0
- package/dist/models/JobProfile.d.ts +49 -0
- package/dist/models/JobProfile.js +77 -0
- package/dist/models/JobProgress.d.ts +75 -0
- package/dist/models/JobProgress.js +67 -0
- package/dist/models/JobResponse.d.ts +134 -0
- package/dist/models/JobResponse.js +101 -0
- package/dist/models/JobSourceInfo.d.ts +62 -0
- package/dist/models/JobSourceInfo.js +60 -0
- package/dist/models/JobSourceType.d.ts +24 -0
- package/dist/models/JobSourceType.js +52 -0
- package/dist/models/JobStatus.d.ts +31 -0
- package/dist/models/JobStatus.js +59 -0
- package/dist/models/ListJobsResponse.d.ts +45 -0
- package/dist/models/ListJobsResponse.js +57 -0
- package/dist/models/OutputContainer.d.ts +27 -0
- package/dist/models/OutputContainer.js +55 -0
- package/dist/models/ReadyResponse.d.ts +38 -0
- package/dist/models/ReadyResponse.js +52 -0
- package/dist/models/UploadJobSource.d.ts +39 -0
- package/dist/models/UploadJobSource.js +55 -0
- package/dist/models/UploadPartResponse.d.ts +38 -0
- package/dist/models/UploadPartResponse.js +54 -0
- package/dist/models/UploadStatusResponse.d.ts +96 -0
- package/dist/models/UploadStatusResponse.js +88 -0
- package/dist/models/WebhookDeliveryPayload.d.ts +85 -0
- package/dist/models/WebhookDeliveryPayload.js +91 -0
- package/dist/models/WebhookListItem.d.ts +50 -0
- package/dist/models/WebhookListItem.js +62 -0
- package/dist/models/WebhookListResponse.d.ts +33 -0
- package/dist/models/WebhookListResponse.js +51 -0
- package/dist/models/WebhookResponse.d.ts +58 -0
- package/dist/models/WebhookResponse.js +66 -0
- package/dist/models/index.d.ts +25 -0
- package/dist/models/index.js +43 -0
- package/dist/runtime.d.ts +184 -0
- package/dist/runtime.js +364 -0
- package/docs/CompleteUploadResponse.md +40 -0
- package/docs/CreateJobOutputOptions.md +39 -0
- package/docs/CreateJobRequest.md +42 -0
- package/docs/CreateUploadRequest.md +38 -0
- package/docs/CreateUploadResponse.md +40 -0
- package/docs/CreateWebhookRequest.md +36 -0
- package/docs/DownloadsApi.md +78 -0
- package/docs/ErrorBody.md +40 -0
- package/docs/ErrorEnvelope.md +34 -0
- package/docs/HealthApi.md +129 -0
- package/docs/JobOutputInfo.md +50 -0
- package/docs/JobProfile.md +33 -0
- package/docs/JobProgress.md +48 -0
- package/docs/JobResponse.md +62 -0
- package/docs/JobSourceInfo.md +44 -0
- package/docs/JobSourceType.md +33 -0
- package/docs/JobStatus.md +33 -0
- package/docs/JobsApi.md +407 -0
- package/docs/ListJobsResponse.md +38 -0
- package/docs/OutputContainer.md +33 -0
- package/docs/ReadyResponse.md +36 -0
- package/docs/UploadJobSource.md +37 -0
- package/docs/UploadPartResponse.md +36 -0
- package/docs/UploadStatusResponse.md +50 -0
- package/docs/UploadsApi.md +415 -0
- package/docs/WebhookDeliveryPayload.md +45 -0
- package/docs/WebhookEventsApi.md +91 -0
- package/docs/WebhookListItem.md +40 -0
- package/docs/WebhookListResponse.md +34 -0
- package/docs/WebhookResponse.md +42 -0
- package/docs/WebhooksApi.md +235 -0
- package/package.json +24 -0
- package/src/apis/DownloadsApi.ts +114 -0
- package/src/apis/HealthApi.ts +160 -0
- package/src/apis/JobsApi.ts +491 -0
- package/src/apis/UploadsApi.ts +522 -0
- package/src/apis/WebhooksApi.ts +298 -0
- package/src/apis/index.ts +7 -0
- package/src/helpers/index.ts +3 -0
- package/src/helpers/jobs.ts +112 -0
- package/src/helpers/uploads.ts +243 -0
- package/src/helpers/webhooks.ts +134 -0
- package/src/index.ts +7 -0
- package/src/models/CompleteUploadResponse.ts +102 -0
- package/src/models/CreateJobOutputOptions.ts +101 -0
- package/src/models/CreateJobRequest.ts +123 -0
- package/src/models/CreateUploadRequest.ts +84 -0
- package/src/models/CreateUploadResponse.ts +95 -0
- package/src/models/CreateWebhookRequest.ts +76 -0
- package/src/models/ErrorBody.ts +116 -0
- package/src/models/ErrorEnvelope.ts +74 -0
- package/src/models/JobOutputInfo.ts +149 -0
- package/src/models/JobProfile.ts +76 -0
- package/src/models/JobProgress.ts +133 -0
- package/src/models/JobResponse.ts +236 -0
- package/src/models/JobSourceInfo.ts +106 -0
- package/src/models/JobSourceType.ts +51 -0
- package/src/models/JobStatus.ts +58 -0
- package/src/models/ListJobsResponse.ts +91 -0
- package/src/models/OutputContainer.ts +54 -0
- package/src/models/ReadyResponse.ts +74 -0
- package/src/models/UploadJobSource.ts +85 -0
- package/src/models/UploadPartResponse.ts +75 -0
- package/src/models/UploadStatusResponse.ts +153 -0
- package/src/models/WebhookDeliveryPayload.ts +134 -0
- package/src/models/WebhookListItem.ts +93 -0
- package/src/models/WebhookListResponse.ts +74 -0
- package/src/models/WebhookResponse.ts +104 -0
- package/src/models/index.ts +27 -0
- package/src/runtime.ts +450 -0
- package/tsconfig.esm.json +7 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Webhook signature verification for inbound terminal-job deliveries.
|
|
2
|
+
//
|
|
3
|
+
// SOPHON signs each delivery with HMAC-SHA256 over `"{timestamp}.{raw_body}"`
|
|
4
|
+
// using the per-webhook secret. The hex digest is sent as
|
|
5
|
+
// `X-Turbo-Signature-256: sha256=<hex>`.
|
|
6
|
+
//
|
|
7
|
+
// Isomorphic: uses the Web Crypto API (`crypto.subtle`), available globally in
|
|
8
|
+
// Node 18+ and modern browsers. No Node-specific imports.
|
|
9
|
+
//
|
|
10
|
+
// Consumers call `verifyWebhookSignature` with the RAW request body (string or
|
|
11
|
+
// Uint8Array — NOT a parsed JSON object), the signature header, the timestamp
|
|
12
|
+
// header, and the webhook secret. The helper does a constant-time comparison
|
|
13
|
+
// and enforces a replay window by default.
|
|
14
|
+
|
|
15
|
+
export interface VerifyWebhookSignatureParams {
|
|
16
|
+
/** Raw HTTP body exactly as received, before any JSON parsing. */
|
|
17
|
+
rawBody: string | Uint8Array;
|
|
18
|
+
/** Value of `X-Turbo-Signature-256`, e.g. `"sha256=abc..."`. */
|
|
19
|
+
signatureHeader: string | null | undefined;
|
|
20
|
+
/** Value of `X-Turbo-Timestamp`. */
|
|
21
|
+
timestampHeader: string | null | undefined;
|
|
22
|
+
/** Webhook secret returned by `POST /v1/webhooks`. */
|
|
23
|
+
secret: string;
|
|
24
|
+
/** Maximum acceptable clock skew in ms. Default 5 min. Set 0 to disable. */
|
|
25
|
+
replayWindowMs?: number;
|
|
26
|
+
/** Override "now" for deterministic tests. */
|
|
27
|
+
now?: () => number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export class WebhookSignatureError extends Error {
|
|
31
|
+
readonly reason:
|
|
32
|
+
| "missing_signature"
|
|
33
|
+
| "missing_timestamp"
|
|
34
|
+
| "invalid_timestamp"
|
|
35
|
+
| "replay_window_exceeded"
|
|
36
|
+
| "bad_prefix"
|
|
37
|
+
| "bad_signature_encoding"
|
|
38
|
+
| "signature_mismatch";
|
|
39
|
+
constructor(reason: WebhookSignatureError["reason"], message?: string) {
|
|
40
|
+
super(message ?? reason);
|
|
41
|
+
this.name = "WebhookSignatureError";
|
|
42
|
+
this.reason = reason;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Throws `WebhookSignatureError` if the delivery is not authentic. Returns
|
|
48
|
+
* a resolved promise on success.
|
|
49
|
+
*/
|
|
50
|
+
export async function verifyWebhookSignature(
|
|
51
|
+
params: VerifyWebhookSignatureParams,
|
|
52
|
+
): Promise<void> {
|
|
53
|
+
const {
|
|
54
|
+
rawBody,
|
|
55
|
+
signatureHeader,
|
|
56
|
+
timestampHeader,
|
|
57
|
+
secret,
|
|
58
|
+
replayWindowMs = 5 * 60 * 1000,
|
|
59
|
+
now = Date.now,
|
|
60
|
+
} = params;
|
|
61
|
+
|
|
62
|
+
if (!signatureHeader) throw new WebhookSignatureError("missing_signature");
|
|
63
|
+
if (!timestampHeader) throw new WebhookSignatureError("missing_timestamp");
|
|
64
|
+
|
|
65
|
+
const deliveredTs = Date.parse(timestampHeader);
|
|
66
|
+
if (Number.isNaN(deliveredTs)) {
|
|
67
|
+
throw new WebhookSignatureError("invalid_timestamp");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (replayWindowMs > 0) {
|
|
71
|
+
const drift = Math.abs(now() - deliveredTs);
|
|
72
|
+
if (drift > replayWindowMs) {
|
|
73
|
+
throw new WebhookSignatureError("replay_window_exceeded");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!signatureHeader.startsWith("sha256=")) {
|
|
78
|
+
throw new WebhookSignatureError("bad_prefix");
|
|
79
|
+
}
|
|
80
|
+
const deliveredHex = signatureHeader.slice("sha256=".length).trim();
|
|
81
|
+
const delivered = hexToBytes(deliveredHex);
|
|
82
|
+
if (!delivered) {
|
|
83
|
+
throw new WebhookSignatureError("bad_signature_encoding");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const bodyBytes =
|
|
87
|
+
typeof rawBody === "string" ? new TextEncoder().encode(rawBody) : rawBody;
|
|
88
|
+
const payload = concatBytes(
|
|
89
|
+
new TextEncoder().encode(`${timestampHeader}.`),
|
|
90
|
+
bodyBytes,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const key = await crypto.subtle.importKey(
|
|
94
|
+
"raw",
|
|
95
|
+
new TextEncoder().encode(secret),
|
|
96
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
97
|
+
false,
|
|
98
|
+
["sign"],
|
|
99
|
+
);
|
|
100
|
+
const expected = new Uint8Array(
|
|
101
|
+
// TS 5.7+ tightened BufferSource to require ArrayBufferView<ArrayBuffer>;
|
|
102
|
+
// our concatenated Uint8Array is backed by an ArrayBuffer at runtime.
|
|
103
|
+
await crypto.subtle.sign("HMAC", key, payload as BufferSource),
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
if (!constantTimeEqual(delivered, expected)) {
|
|
107
|
+
throw new WebhookSignatureError("signature_mismatch");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function hexToBytes(hex: string): Uint8Array | null {
|
|
112
|
+
if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) return null;
|
|
113
|
+
const out = new Uint8Array(hex.length / 2);
|
|
114
|
+
for (let i = 0; i < out.length; i++) {
|
|
115
|
+
out[i] = parseInt(hex.substr(i * 2, 2), 16);
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function concatBytes(a: Uint8Array, b: Uint8Array): Uint8Array {
|
|
121
|
+
const out = new Uint8Array(a.length + b.length);
|
|
122
|
+
out.set(a, 0);
|
|
123
|
+
out.set(b, a.length);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {
|
|
128
|
+
if (a.length !== b.length) return false;
|
|
129
|
+
let diff = 0;
|
|
130
|
+
for (let i = 0; i < a.length; i++) {
|
|
131
|
+
diff |= (a[i] ?? 0) ^ (b[i] ?? 0);
|
|
132
|
+
}
|
|
133
|
+
return diff === 0;
|
|
134
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* SOPHON Encoding API
|
|
5
|
+
* REST API for submitting, monitoring, and retrieving SOPHON encoding jobs. Authentication is via Bearer API key or session cookie. All POST endpoints require an Idempotency-Key header. List endpoints use opaque cursor-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 1.0.0
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { mapValues } from '../runtime';
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @export
|
|
19
|
+
* @interface CompleteUploadResponse
|
|
20
|
+
*/
|
|
21
|
+
export interface CompleteUploadResponse {
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @type {string}
|
|
25
|
+
* @memberof CompleteUploadResponse
|
|
26
|
+
*/
|
|
27
|
+
id: string;
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @type {CompleteUploadResponseStatusEnum}
|
|
31
|
+
* @memberof CompleteUploadResponse
|
|
32
|
+
*/
|
|
33
|
+
status: CompleteUploadResponseStatusEnum;
|
|
34
|
+
/**
|
|
35
|
+
* SHA-256 hex digest of the assembled file.
|
|
36
|
+
* @type {string}
|
|
37
|
+
* @memberof CompleteUploadResponse
|
|
38
|
+
*/
|
|
39
|
+
sha256: string;
|
|
40
|
+
/**
|
|
41
|
+
*
|
|
42
|
+
* @type {number}
|
|
43
|
+
* @memberof CompleteUploadResponse
|
|
44
|
+
*/
|
|
45
|
+
bytes: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @export
|
|
50
|
+
* @enum {string}
|
|
51
|
+
*/
|
|
52
|
+
export enum CompleteUploadResponseStatusEnum {
|
|
53
|
+
COMPLETED = 'completed'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Check if a given object implements the CompleteUploadResponse interface.
|
|
59
|
+
*/
|
|
60
|
+
export function instanceOfCompleteUploadResponse(value: object): value is CompleteUploadResponse {
|
|
61
|
+
if (!('id' in value) || value['id'] === undefined) return false;
|
|
62
|
+
if (!('status' in value) || value['status'] === undefined) return false;
|
|
63
|
+
if (!('sha256' in value) || value['sha256'] === undefined) return false;
|
|
64
|
+
if (!('bytes' in value) || value['bytes'] === undefined) return false;
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function CompleteUploadResponseFromJSON(json: any): CompleteUploadResponse {
|
|
69
|
+
return CompleteUploadResponseFromJSONTyped(json, false);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function CompleteUploadResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): CompleteUploadResponse {
|
|
73
|
+
if (json == null) {
|
|
74
|
+
return json;
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
|
|
78
|
+
'id': json['id'],
|
|
79
|
+
'status': json['status'],
|
|
80
|
+
'sha256': json['sha256'],
|
|
81
|
+
'bytes': json['bytes'],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function CompleteUploadResponseToJSON(json: any): CompleteUploadResponse {
|
|
86
|
+
return CompleteUploadResponseToJSONTyped(json, false);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function CompleteUploadResponseToJSONTyped(value?: CompleteUploadResponse | null, ignoreDiscriminator: boolean = false): any {
|
|
90
|
+
if (value == null) {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
|
|
96
|
+
'id': value['id'],
|
|
97
|
+
'status': value['status'],
|
|
98
|
+
'sha256': value['sha256'],
|
|
99
|
+
'bytes': value['bytes'],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* SOPHON Encoding API
|
|
5
|
+
* REST API for submitting, monitoring, and retrieving SOPHON encoding jobs. Authentication is via Bearer API key or session cookie. All POST endpoints require an Idempotency-Key header. List endpoints use opaque cursor-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 1.0.0
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { mapValues } from '../runtime';
|
|
16
|
+
import type { OutputContainer } from './OutputContainer';
|
|
17
|
+
import {
|
|
18
|
+
OutputContainerFromJSON,
|
|
19
|
+
OutputContainerFromJSONTyped,
|
|
20
|
+
OutputContainerToJSON,
|
|
21
|
+
OutputContainerToJSONTyped,
|
|
22
|
+
} from './OutputContainer';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Optional output shaping knobs for a new job.
|
|
26
|
+
* @export
|
|
27
|
+
* @interface CreateJobOutputOptions
|
|
28
|
+
*/
|
|
29
|
+
export interface CreateJobOutputOptions {
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @type {OutputContainer}
|
|
33
|
+
* @memberof CreateJobOutputOptions
|
|
34
|
+
*/
|
|
35
|
+
container?: OutputContainer;
|
|
36
|
+
/**
|
|
37
|
+
* When true, audio is included in the output. MKV preserves
|
|
38
|
+
* source audio streams unchanged. MP4 preserves broadly compatible
|
|
39
|
+
* source audio codecs when possible, and may normalize
|
|
40
|
+
* incompatible codecs to AAC for playback compatibility.
|
|
41
|
+
* When false, the output is video only.
|
|
42
|
+
*
|
|
43
|
+
* @type {boolean}
|
|
44
|
+
* @memberof CreateJobOutputOptions
|
|
45
|
+
*/
|
|
46
|
+
audio?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Target output height in pixels. When set, output is scaled down
|
|
49
|
+
* (aspect ratio preserved, width derived from source, both dims
|
|
50
|
+
* rounded to even). If absent or larger than source height, output
|
|
51
|
+
* uses source dimensions. Billing tier is determined by the actual
|
|
52
|
+
* encoded output, not by this requested value.
|
|
53
|
+
*
|
|
54
|
+
* @type {number}
|
|
55
|
+
* @memberof CreateJobOutputOptions
|
|
56
|
+
*/
|
|
57
|
+
target_height?: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Check if a given object implements the CreateJobOutputOptions interface.
|
|
64
|
+
*/
|
|
65
|
+
export function instanceOfCreateJobOutputOptions(value: object): value is CreateJobOutputOptions {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function CreateJobOutputOptionsFromJSON(json: any): CreateJobOutputOptions {
|
|
70
|
+
return CreateJobOutputOptionsFromJSONTyped(json, false);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function CreateJobOutputOptionsFromJSONTyped(json: any, ignoreDiscriminator: boolean): CreateJobOutputOptions {
|
|
74
|
+
if (json == null) {
|
|
75
|
+
return json;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
|
|
79
|
+
'container': json['container'] == null ? undefined : OutputContainerFromJSON(json['container']),
|
|
80
|
+
'audio': json['audio'] == null ? undefined : json['audio'],
|
|
81
|
+
'target_height': json['target_height'] == null ? undefined : json['target_height'],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function CreateJobOutputOptionsToJSON(json: any): CreateJobOutputOptions {
|
|
86
|
+
return CreateJobOutputOptionsToJSONTyped(json, false);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function CreateJobOutputOptionsToJSONTyped(value?: CreateJobOutputOptions | null, ignoreDiscriminator: boolean = false): any {
|
|
90
|
+
if (value == null) {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
|
|
96
|
+
'container': OutputContainerToJSON(value['container']),
|
|
97
|
+
'audio': value['audio'],
|
|
98
|
+
'target_height': value['target_height'],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* SOPHON Encoding API
|
|
5
|
+
* REST API for submitting, monitoring, and retrieving SOPHON encoding jobs. Authentication is via Bearer API key or session cookie. All POST endpoints require an Idempotency-Key header. List endpoints use opaque cursor-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 1.0.0
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { mapValues } from '../runtime';
|
|
16
|
+
import type { CreateJobOutputOptions } from './CreateJobOutputOptions';
|
|
17
|
+
import {
|
|
18
|
+
CreateJobOutputOptionsFromJSON,
|
|
19
|
+
CreateJobOutputOptionsFromJSONTyped,
|
|
20
|
+
CreateJobOutputOptionsToJSON,
|
|
21
|
+
CreateJobOutputOptionsToJSONTyped,
|
|
22
|
+
} from './CreateJobOutputOptions';
|
|
23
|
+
import type { JobProfile } from './JobProfile';
|
|
24
|
+
import {
|
|
25
|
+
JobProfileFromJSON,
|
|
26
|
+
JobProfileFromJSONTyped,
|
|
27
|
+
JobProfileToJSON,
|
|
28
|
+
JobProfileToJSONTyped,
|
|
29
|
+
} from './JobProfile';
|
|
30
|
+
import type { UploadJobSource } from './UploadJobSource';
|
|
31
|
+
import {
|
|
32
|
+
UploadJobSourceFromJSON,
|
|
33
|
+
UploadJobSourceFromJSONTyped,
|
|
34
|
+
UploadJobSourceToJSON,
|
|
35
|
+
UploadJobSourceToJSONTyped,
|
|
36
|
+
} from './UploadJobSource';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* @export
|
|
41
|
+
* @interface CreateJobRequest
|
|
42
|
+
*/
|
|
43
|
+
export interface CreateJobRequest {
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @type {UploadJobSource}
|
|
47
|
+
* @memberof CreateJobRequest
|
|
48
|
+
*/
|
|
49
|
+
source: UploadJobSource;
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
* @type {JobProfile}
|
|
53
|
+
* @memberof CreateJobRequest
|
|
54
|
+
*/
|
|
55
|
+
profile: JobProfile;
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
* @type {CreateJobOutputOptions}
|
|
59
|
+
* @memberof CreateJobRequest
|
|
60
|
+
*/
|
|
61
|
+
output?: CreateJobOutputOptions;
|
|
62
|
+
/**
|
|
63
|
+
* IDs of registered webhook endpoints to notify on job state changes.
|
|
64
|
+
* @type {Array<string>}
|
|
65
|
+
* @memberof CreateJobRequest
|
|
66
|
+
*/
|
|
67
|
+
webhook_ids?: Array<string>;
|
|
68
|
+
/**
|
|
69
|
+
* Arbitrary key-value metadata attached to the job. Max 16 KiB serialized.
|
|
70
|
+
* @type {{ [key: string]: any; }}
|
|
71
|
+
* @memberof CreateJobRequest
|
|
72
|
+
*/
|
|
73
|
+
metadata?: { [key: string]: any; };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Check if a given object implements the CreateJobRequest interface.
|
|
80
|
+
*/
|
|
81
|
+
export function instanceOfCreateJobRequest(value: object): value is CreateJobRequest {
|
|
82
|
+
if (!('source' in value) || value['source'] === undefined) return false;
|
|
83
|
+
if (!('profile' in value) || value['profile'] === undefined) return false;
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function CreateJobRequestFromJSON(json: any): CreateJobRequest {
|
|
88
|
+
return CreateJobRequestFromJSONTyped(json, false);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function CreateJobRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): CreateJobRequest {
|
|
92
|
+
if (json == null) {
|
|
93
|
+
return json;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
|
|
97
|
+
'source': UploadJobSourceFromJSON(json['source']),
|
|
98
|
+
'profile': JobProfileFromJSON(json['profile']),
|
|
99
|
+
'output': json['output'] == null ? undefined : CreateJobOutputOptionsFromJSON(json['output']),
|
|
100
|
+
'webhook_ids': json['webhook_ids'] == null ? undefined : json['webhook_ids'],
|
|
101
|
+
'metadata': json['metadata'] == null ? undefined : json['metadata'],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function CreateJobRequestToJSON(json: any): CreateJobRequest {
|
|
106
|
+
return CreateJobRequestToJSONTyped(json, false);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function CreateJobRequestToJSONTyped(value?: CreateJobRequest | null, ignoreDiscriminator: boolean = false): any {
|
|
110
|
+
if (value == null) {
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
|
|
116
|
+
'source': UploadJobSourceToJSON(value['source']),
|
|
117
|
+
'profile': JobProfileToJSON(value['profile']),
|
|
118
|
+
'output': CreateJobOutputOptionsToJSON(value['output']),
|
|
119
|
+
'webhook_ids': value['webhook_ids'],
|
|
120
|
+
'metadata': value['metadata'],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* SOPHON Encoding API
|
|
5
|
+
* REST API for submitting, monitoring, and retrieving SOPHON encoding jobs. Authentication is via Bearer API key or session cookie. All POST endpoints require an Idempotency-Key header. List endpoints use opaque cursor-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 1.0.0
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { mapValues } from '../runtime';
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @export
|
|
19
|
+
* @interface CreateUploadRequest
|
|
20
|
+
*/
|
|
21
|
+
export interface CreateUploadRequest {
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @type {string}
|
|
25
|
+
* @memberof CreateUploadRequest
|
|
26
|
+
*/
|
|
27
|
+
file_name: string;
|
|
28
|
+
/**
|
|
29
|
+
* Total file size in bytes.
|
|
30
|
+
* @type {number}
|
|
31
|
+
* @memberof CreateUploadRequest
|
|
32
|
+
*/
|
|
33
|
+
file_size: number;
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* @type {string}
|
|
37
|
+
* @memberof CreateUploadRequest
|
|
38
|
+
*/
|
|
39
|
+
mime_type: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Check if a given object implements the CreateUploadRequest interface.
|
|
44
|
+
*/
|
|
45
|
+
export function instanceOfCreateUploadRequest(value: object): value is CreateUploadRequest {
|
|
46
|
+
if (!('file_name' in value) || value['file_name'] === undefined) return false;
|
|
47
|
+
if (!('file_size' in value) || value['file_size'] === undefined) return false;
|
|
48
|
+
if (!('mime_type' in value) || value['mime_type'] === undefined) return false;
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function CreateUploadRequestFromJSON(json: any): CreateUploadRequest {
|
|
53
|
+
return CreateUploadRequestFromJSONTyped(json, false);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function CreateUploadRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): CreateUploadRequest {
|
|
57
|
+
if (json == null) {
|
|
58
|
+
return json;
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
|
|
62
|
+
'file_name': json['file_name'],
|
|
63
|
+
'file_size': json['file_size'],
|
|
64
|
+
'mime_type': json['mime_type'],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function CreateUploadRequestToJSON(json: any): CreateUploadRequest {
|
|
69
|
+
return CreateUploadRequestToJSONTyped(json, false);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function CreateUploadRequestToJSONTyped(value?: CreateUploadRequest | null, ignoreDiscriminator: boolean = false): any {
|
|
73
|
+
if (value == null) {
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
|
|
79
|
+
'file_name': value['file_name'],
|
|
80
|
+
'file_size': value['file_size'],
|
|
81
|
+
'mime_type': value['mime_type'],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* SOPHON Encoding API
|
|
5
|
+
* REST API for submitting, monitoring, and retrieving SOPHON encoding jobs. Authentication is via Bearer API key or session cookie. All POST endpoints require an Idempotency-Key header. List endpoints use opaque cursor-based pagination.
|
|
6
|
+
*
|
|
7
|
+
* The version of the OpenAPI document: 1.0.0
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
11
|
+
* https://openapi-generator.tech
|
|
12
|
+
* Do not edit the class manually.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { mapValues } from '../runtime';
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @export
|
|
19
|
+
* @interface CreateUploadResponse
|
|
20
|
+
*/
|
|
21
|
+
export interface CreateUploadResponse {
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @type {string}
|
|
25
|
+
* @memberof CreateUploadResponse
|
|
26
|
+
*/
|
|
27
|
+
id: string;
|
|
28
|
+
/**
|
|
29
|
+
* Size of each chunk in bytes. Tiered by file size:
|
|
30
|
+
* <64 MB = whole file, <=1 GB = 8 MB, <=10 GB = 16 MB, >10 GB = 32 MB.
|
|
31
|
+
*
|
|
32
|
+
* @type {number}
|
|
33
|
+
* @memberof CreateUploadResponse
|
|
34
|
+
*/
|
|
35
|
+
chunk_size: number;
|
|
36
|
+
/**
|
|
37
|
+
*
|
|
38
|
+
* @type {number}
|
|
39
|
+
* @memberof CreateUploadResponse
|
|
40
|
+
*/
|
|
41
|
+
total_chunks: number;
|
|
42
|
+
/**
|
|
43
|
+
* Upload session expiry (24 hours from creation).
|
|
44
|
+
* @type {Date}
|
|
45
|
+
* @memberof CreateUploadResponse
|
|
46
|
+
*/
|
|
47
|
+
expires_at: Date;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Check if a given object implements the CreateUploadResponse interface.
|
|
52
|
+
*/
|
|
53
|
+
export function instanceOfCreateUploadResponse(value: object): value is CreateUploadResponse {
|
|
54
|
+
if (!('id' in value) || value['id'] === undefined) return false;
|
|
55
|
+
if (!('chunk_size' in value) || value['chunk_size'] === undefined) return false;
|
|
56
|
+
if (!('total_chunks' in value) || value['total_chunks'] === undefined) return false;
|
|
57
|
+
if (!('expires_at' in value) || value['expires_at'] === undefined) return false;
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function CreateUploadResponseFromJSON(json: any): CreateUploadResponse {
|
|
62
|
+
return CreateUploadResponseFromJSONTyped(json, false);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function CreateUploadResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): CreateUploadResponse {
|
|
66
|
+
if (json == null) {
|
|
67
|
+
return json;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
|
|
71
|
+
'id': json['id'],
|
|
72
|
+
'chunk_size': json['chunk_size'],
|
|
73
|
+
'total_chunks': json['total_chunks'],
|
|
74
|
+
'expires_at': (new Date(json['expires_at'])),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function CreateUploadResponseToJSON(json: any): CreateUploadResponse {
|
|
79
|
+
return CreateUploadResponseToJSONTyped(json, false);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function CreateUploadResponseToJSONTyped(value?: CreateUploadResponse | null, ignoreDiscriminator: boolean = false): any {
|
|
83
|
+
if (value == null) {
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
|
|
89
|
+
'id': value['id'],
|
|
90
|
+
'chunk_size': value['chunk_size'],
|
|
91
|
+
'total_chunks': value['total_chunks'],
|
|
92
|
+
'expires_at': value['expires_at'].toISOString(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|