@mieweb/pulsevault 0.4.2 → 0.6.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/CHANGELOG.md +216 -1
- package/OPERATIONS.md +135 -44
- package/PROTOCOL.md +63 -4
- package/README.md +186 -34
- package/dist/app.d.ts +30 -5
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +24 -5
- package/dist/app.js.map +1 -1
- package/dist/augment.d.ts +3 -0
- package/dist/augment.d.ts.map +1 -1
- package/dist/augment.js.map +1 -1
- package/dist/core.d.ts +107 -8
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +381 -47
- package/dist/core.js.map +1 -1
- package/dist/lib/authorize.d.ts +28 -6
- package/dist/lib/authorize.d.ts.map +1 -1
- package/dist/lib/capability-token.d.ts +26 -0
- package/dist/lib/capability-token.d.ts.map +1 -1
- package/dist/lib/capability-token.js +73 -5
- package/dist/lib/capability-token.js.map +1 -1
- package/dist/lib/completion.d.ts +138 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +375 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/deeplinks.d.ts +18 -2
- package/dist/lib/deeplinks.d.ts.map +1 -1
- package/dist/lib/deeplinks.js +13 -2
- package/dist/lib/deeplinks.js.map +1 -1
- package/dist/lib/magic.d.ts +41 -1
- package/dist/lib/magic.d.ts.map +1 -1
- package/dist/lib/magic.js +104 -0
- package/dist/lib/magic.js.map +1 -1
- package/dist/lib/options.d.ts +2 -0
- package/dist/lib/options.d.ts.map +1 -1
- package/dist/lib/options.js +8 -2
- package/dist/lib/options.js.map +1 -1
- package/dist/lib/protocol-version.gen.js +1 -1
- package/dist/lib/pulsevaultTus.d.ts +28 -26
- package/dist/lib/pulsevaultTus.d.ts.map +1 -1
- package/dist/lib/pulsevaultTus.js +149 -32
- package/dist/lib/pulsevaultTus.js.map +1 -1
- package/dist/lib/web-ready.d.ts +138 -18
- package/dist/lib/web-ready.d.ts.map +1 -1
- package/dist/lib/web-ready.js +453 -91
- package/dist/lib/web-ready.js.map +1 -1
- package/dist/routes/pulsevault.d.ts +12 -1
- package/dist/routes/pulsevault.d.ts.map +1 -1
- package/dist/routes/pulsevault.js +92 -1
- package/dist/routes/pulsevault.js.map +1 -1
- package/dist/storage/local.d.ts +7 -1
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +408 -52
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/s3.d.ts +7 -1
- package/dist/storage/s3.d.ts.map +1 -1
- package/dist/storage/s3.js +256 -14
- package/dist/storage/s3.js.map +1 -1
- package/dist/storage/types.d.ts +126 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +7 -0
- package/dist/storage/types.js.map +1 -1
- package/package.json +2 -2
- package/protocol/openapi.json +270 -1
- package/protocol/schemas/artifact-status.schema.json +61 -0
- package/protocol/schemas/capability-token.schema.json +3 -0
- package/protocol/schemas/deep-link.schema.json +2 -2
- package/scripts/web-ready-migrate.mjs +35 -11
package/dist/core.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
import { type PulseVaultOnUploadComplete, type PulseVaultOnArtifactEvent } from './lib/pulsevaultTus.js';
|
|
3
|
+
import { type PulseVaultReplayOptions, type PulseVaultWebReadyOptions } from './lib/completion.js';
|
|
3
4
|
import type { PulseVaultValidatePayload } from './lib/magic.js';
|
|
4
5
|
import type { PulseVaultAuthorize } from './lib/authorize.js';
|
|
5
6
|
import type { PulseVaultIssueViewLink } from './lib/view-links.js';
|
|
6
7
|
import { type PulseVaultRetentionOptions } from './lib/retention.js';
|
|
8
|
+
import { type WebReadyResult } from './lib/web-ready.js';
|
|
7
9
|
import { type PulseVaultLogger } from './lib/request.js';
|
|
8
|
-
import type { PulseVaultStorage } from './storage/types.js';
|
|
10
|
+
import type { PulseVaultArtifactMeta, PulseVaultStorage, UploadKind } from './storage/types.js';
|
|
9
11
|
import { type PulseVaultAllowedExtensionsInput } from './lib/options.js';
|
|
10
12
|
import { PROTOCOL_VERSION } from './lib/capabilities.js';
|
|
11
13
|
export { PROTOCOL_VERSION };
|
|
@@ -56,6 +58,45 @@ export type PulseVaultCoreOptions = {
|
|
|
56
58
|
issueViewLink?: PulseVaultIssueViewLink;
|
|
57
59
|
/** Optional cleanup of abandoned uploads. See the Fastify plugin's `retention` option for semantics. */
|
|
58
60
|
retention?: PulseVaultRetentionOptions;
|
|
61
|
+
/**
|
|
62
|
+
* Hold every create to the shape of a pulse (PROTOCOL.md §8): a video is created with no
|
|
63
|
+
* `relatedTo`, and a thumbnail, beat manifest or captions under its own id, `relatedTo` the
|
|
64
|
+
* video. With `createCapabilityAuthorize` the ids are also tied to the token: the video only
|
|
65
|
+
* under the token's own artifactId, the rest only `relatedTo` it. Defaults to `true`; set
|
|
66
|
+
* `false` for uploads that aren't pulses.
|
|
67
|
+
*/
|
|
68
|
+
pulseShape?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Let a create take over an unfinished upload of the same artifactId once it has been idle
|
|
71
|
+
* this long, instead of answering `409` until `retention` removes it. Only an upload of the
|
|
72
|
+
* same kind and `relatedTo`, so the token that authorized the new create authorized the old
|
|
73
|
+
* one. Defaults to `{ idleSeconds: 300 }`; `false` turns it off.
|
|
74
|
+
*/
|
|
75
|
+
reclaim?: {
|
|
76
|
+
idleSeconds?: number;
|
|
77
|
+
} | false;
|
|
78
|
+
/**
|
|
79
|
+
* Once an artifact is finished, refuse to delete it — or anything `relatedTo` a finished
|
|
80
|
+
* video — through the routes (`DELETE /artifacts/:id` and the TUS `DELETE`): a pulse that
|
|
81
|
+
* landed stays. Removal then goes through `storage.remove` on the host's own terms. Off by
|
|
82
|
+
* default.
|
|
83
|
+
*/
|
|
84
|
+
lockWhenReady?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Conform every finished video to one web-playable format (`CONFORM_TARGET`) in the
|
|
87
|
+
* background, after the final `PATCH` is answered: nothing for a file already in it, a
|
|
88
|
+
* lossless remux, or one ffmpeg run (a WebM, MKV or MOV becomes an MP4 at the same artifact
|
|
89
|
+
* URL). `true` for the defaults, or `ensureWebReady`'s options plus `concurrency` and
|
|
90
|
+
* `completeAfter`. Needs the local storage adapter. Off by default.
|
|
91
|
+
*/
|
|
92
|
+
webReady?: PulseVaultWebReadyOptions | boolean;
|
|
93
|
+
/**
|
|
94
|
+
* How often a finished artifact whose `onUploadComplete` never finished is fired again, and a
|
|
95
|
+
* conversion a restart interrupted is resumed. On by default, every 300 seconds, with the
|
|
96
|
+
* first pass shortly after start; `false` turns it off. Needs `listArtifacts` and
|
|
97
|
+
* `describeArtifact` (both built-in adapters).
|
|
98
|
+
*/
|
|
99
|
+
replayCompletions?: PulseVaultReplayOptions | false;
|
|
59
100
|
/** Logger for internal diagnostics (authorize rejections, tus handler failures). Defaults to `console`. */
|
|
60
101
|
logger?: PulseVaultLogger;
|
|
61
102
|
/** @deprecated Use `validatePayload` instead — see the Fastify plugin's option of the same name. */
|
|
@@ -85,6 +126,61 @@ export type PulseVaultCore = {
|
|
|
85
126
|
handleViewLink: (req: IncomingMessage, res: ServerResponse, artifactId: string) => Promise<void>;
|
|
86
127
|
/** Handles `DELETE /artifacts/:artifactId`. */
|
|
87
128
|
handleArtifactDelete: (req: IncomingMessage, res: ServerResponse, artifactId: string) => Promise<void>;
|
|
129
|
+
/** Handles `GET /artifacts/:artifactId/status` (authorized as `status`). */
|
|
130
|
+
handleStatus: (req: IncomingMessage, res: ServerResponse, artifactId: string, token: string | undefined) => Promise<void>;
|
|
131
|
+
/** Handles `GET /artifacts/:artifactId/poster`: the video's thumbnail (authorized as `resolve` on the video). */
|
|
132
|
+
handlePoster: (req: IncomingMessage, res: ServerResponse, artifactId: string, token: string | undefined) => Promise<void>;
|
|
133
|
+
/** The state of one artifact, as the status route reports it — for a host that polls server-side. */
|
|
134
|
+
getStatus: (artifactId: string) => Promise<PulseVaultArtifactStatus>;
|
|
135
|
+
/** A video and the finished artifacts `relatedTo` it, by kind. `video` is `null` for an unknown id. */
|
|
136
|
+
getPulse: (artifactId: string) => Promise<PulseVaultPulse>;
|
|
137
|
+
/**
|
|
138
|
+
* Record where an upload went, or why it didn't (any JSON; `null` clears it). Reported by the
|
|
139
|
+
* status route as `outcome`, so a page waiting on an upload learns it from PulseVault alone.
|
|
140
|
+
* Resolves `false` for an unknown artifactId.
|
|
141
|
+
*/
|
|
142
|
+
recordOutcome: (artifactId: string, outcome: unknown) => Promise<boolean>;
|
|
143
|
+
/** Run one completion-replay pass now (see `replayCompletions`). Resolves the replayed artifactIds. */
|
|
144
|
+
replayCompletions: () => Promise<string[]>;
|
|
145
|
+
/**
|
|
146
|
+
* Whether finished videos are conformed: `webReady` is on and ffmpeg and ffprobe run on this
|
|
147
|
+
* host. `false` means uploads are served exactly as uploaded — for a host's health check.
|
|
148
|
+
*/
|
|
149
|
+
conformAvailable: () => Promise<boolean>;
|
|
150
|
+
};
|
|
151
|
+
/** What `GET /artifacts/:id/status` and `getStatus` report. */
|
|
152
|
+
export type PulseVaultArtifactStatus = {
|
|
153
|
+
artifactId: string;
|
|
154
|
+
/**
|
|
155
|
+
* `unknown` for an id storage has never seen; `uploading` until the final byte; `processing`
|
|
156
|
+
* while a web-ready conversion rewrites the bytes; `ready` once the artifact is served.
|
|
157
|
+
*/
|
|
158
|
+
state: 'unknown' | 'uploading' | 'processing' | 'ready';
|
|
159
|
+
kind?: UploadKind;
|
|
160
|
+
relatedTo?: string;
|
|
161
|
+
name?: string;
|
|
162
|
+
/** Bytes received so far (while `uploading`), or stored (once finished), when known. */
|
|
163
|
+
bytesReceived?: number;
|
|
164
|
+
/** The upload's declared length, when known. */
|
|
165
|
+
size?: number;
|
|
166
|
+
/** Whether the host's `onUploadComplete` has finished for this artifact. */
|
|
167
|
+
acknowledged?: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* What the web-ready conversion did, once it ran: `none`, `remuxed`, `transcoded`, `conformed`,
|
|
170
|
+
* or `skipped` with the reason (the original bytes serve).
|
|
171
|
+
*/
|
|
172
|
+
webReady?: WebReadyResult;
|
|
173
|
+
/** What the host recorded with `recordOutcome`, if anything. */
|
|
174
|
+
outcome?: unknown;
|
|
175
|
+
/** The capability token's context (`getStatus` only; the status route leaves it out). */
|
|
176
|
+
context?: unknown;
|
|
177
|
+
};
|
|
178
|
+
/** A pulse: its video and the finished artifacts `relatedTo` it, one per kind (the newest wins). */
|
|
179
|
+
export type PulseVaultPulse = {
|
|
180
|
+
video: PulseVaultArtifactMeta | null;
|
|
181
|
+
thumbnail?: PulseVaultArtifactMeta;
|
|
182
|
+
captions?: PulseVaultArtifactMeta;
|
|
183
|
+
manifest?: PulseVaultArtifactMeta;
|
|
88
184
|
};
|
|
89
185
|
/**
|
|
90
186
|
* Build the framework-agnostic core: the same authorize/validatePayload/
|
|
@@ -96,17 +192,20 @@ export type PulseVaultCore = {
|
|
|
96
192
|
*/
|
|
97
193
|
export declare function createPulseVaultCore(options: PulseVaultCoreOptions): PulseVaultCore;
|
|
98
194
|
export { createLocalStorage } from './storage/local.js';
|
|
195
|
+
export { uploadIdOf } from './storage/types.js';
|
|
99
196
|
export type { LocalStorage, LocalStorageOptions } from './storage/local.js';
|
|
100
197
|
export { createS3Storage } from './storage/s3.js';
|
|
101
198
|
export type { S3Storage, S3StorageOptions } from './storage/s3.js';
|
|
102
|
-
export type { PulseVaultArtifactRecord, PulseVaultResolution, PulseVaultStorage, ReserveUploadParams, UploadKind, } from './storage/types.js';
|
|
103
|
-
export type { PulseVaultAuthorize, PulseVaultAuthorizeContext, PulseVaultAuthorizePhase, } from './lib/authorize.js';
|
|
104
|
-
export type { PulseVaultOnUploadComplete, PulseVaultOnArtifactEvent, PulseVaultArtifactEvent, } from './lib/pulsevaultTus.js';
|
|
105
|
-
export {
|
|
199
|
+
export type { PulseVaultArtifactMeta, PulseVaultArtifactPatch, PulseVaultArtifactRecord, PulseVaultResolution, PulseVaultStorage, ReserveUploadParams, UploadKind, } from './storage/types.js';
|
|
200
|
+
export type { PulseVaultAuthorize, PulseVaultAuthorizeContext, PulseVaultAuthorizePhase, PulseVaultAuthorizeResult, } from './lib/authorize.js';
|
|
201
|
+
export type { PulseVaultOnUploadComplete, PulseVaultUploadCompleteContext, PulseVaultOnArtifactEvent, PulseVaultArtifactEvent, } from './lib/pulsevaultTus.js';
|
|
202
|
+
export type { PulseVaultWebReadyOptions, PulseVaultReplayOptions } from './lib/completion.js';
|
|
203
|
+
export { sniffMp4, createMp4Sniffer, createS3Mp4Sniffer, sniffVideo, createVideoValidator } from './lib/magic.js';
|
|
204
|
+
export type { VideoValidatorOptions } from './lib/magic.js';
|
|
106
205
|
export type { PulseVaultValidatePayload } from './lib/magic.js';
|
|
107
|
-
export { ensureWebReady, scanMoovPosition } from './lib/web-ready.js';
|
|
108
|
-
export type { WebReadyAction, WebReadyOptions, WebReadyResult, MoovPosition } from './lib/web-ready.js';
|
|
109
|
-
export { buildUploadLink } from './lib/deeplinks.js';
|
|
206
|
+
export { ensureWebReady, scanMoovPosition, probeVideo, webReadyAvailable, CONFORM_TARGET, CONFORM_VIDEO_EXTENSIONS, } from './lib/web-ready.js';
|
|
207
|
+
export type { WebReadyAction, WebReadyOptions, WebReadyResult, MoovPosition, VideoProbe } from './lib/web-ready.js';
|
|
208
|
+
export { buildUploadLink, PULSE_OPEN_URL } from './lib/deeplinks.js';
|
|
110
209
|
export type { UploadLinkOptions } from './lib/deeplinks.js';
|
|
111
210
|
export { issueCapabilityToken, verifyCapabilityToken, issueViewToken, verifyViewToken, createCapabilityAuthorize, } from './lib/capability-token.js';
|
|
112
211
|
export type { CapabilityTokenClaims, IssueCapabilityTokenOptions, IssueViewTokenOptions, VerifyCapabilityTokenOptions, LookupSecret, } from './lib/capability-token.js';
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|