sanity-plugin-mux-input 3.0.5 → 4.0.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/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/package.json +5 -15
- package/dist/index.cjs +0 -5746
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -288
- package/dist/index.d.cts.map +0 -1
- package/sanity.json +0 -8
- package/src/_exports/index.ts +0 -73
- package/src/actions/assets.ts +0 -152
- package/src/actions/secrets.ts +0 -110
- package/src/actions/upload.ts +0 -308
- package/src/clients/upChunkObservable.ts +0 -54
- package/src/components/AddCaptionDialog.tsx +0 -440
- package/src/components/CaptionsDialog.tsx +0 -23
- package/src/components/ConfigureApi.styled.tsx +0 -19
- package/src/components/ConfigureApi.tsx +0 -296
- package/src/components/DraggableWatermark.tsx +0 -885
- package/src/components/EditCaptionDialog.tsx +0 -511
- package/src/components/EditThumbnailDialog.tsx +0 -121
- package/src/components/ErrorBoundaryCard.tsx +0 -97
- package/src/components/FileInputButton.tsx +0 -54
- package/src/components/FileInputMenuItem.styled.tsx +0 -36
- package/src/components/FileInputMenuItem.tsx +0 -85
- package/src/components/FormField.tsx +0 -38
- package/src/components/IconInfo.tsx +0 -22
- package/src/components/ImportVideosFromMux.tsx +0 -339
- package/src/components/Input.styled.tsx +0 -22
- package/src/components/Input.tsx +0 -78
- package/src/components/InputBrowser.tsx +0 -41
- package/src/components/MuxLogo.tsx +0 -42
- package/src/components/Onboard.tsx +0 -65
- package/src/components/PageSelector.tsx +0 -54
- package/src/components/Player.styled.tsx +0 -11
- package/src/components/Player.tsx +0 -117
- package/src/components/PlayerActionsMenu.tsx +0 -191
- package/src/components/ResyncMetadata.tsx +0 -278
- package/src/components/SelectAsset.tsx +0 -39
- package/src/components/SelectSortOptions.tsx +0 -45
- package/src/components/SpinnerBox.tsx +0 -16
- package/src/components/StudioTool.tsx +0 -24
- package/src/components/TextTracksEditor.tsx +0 -117
- package/src/components/TextTracksManager.tsx +0 -738
- package/src/components/UploadConfiguration.tsx +0 -696
- package/src/components/UploadPlaceholder.tsx +0 -88
- package/src/components/UploadProgress.tsx +0 -80
- package/src/components/Uploader.styled.tsx +0 -65
- package/src/components/Uploader.tsx +0 -499
- package/src/components/VideoDetails/DeleteDialog.tsx +0 -148
- package/src/components/VideoDetails/VideoDetails.tsx +0 -358
- package/src/components/VideoDetails/VideoReferences.tsx +0 -63
- package/src/components/VideoDetails/useVideoDetails.ts +0 -103
- package/src/components/VideoInBrowser.tsx +0 -245
- package/src/components/VideoMetadata.tsx +0 -45
- package/src/components/VideoPlayer.tsx +0 -241
- package/src/components/VideoThumbnail.tsx +0 -139
- package/src/components/VideosBrowser.tsx +0 -100
- package/src/components/documentPreview/DocumentPreview.tsx +0 -84
- package/src/components/documentPreview/DraftStatus.tsx +0 -34
- package/src/components/documentPreview/MissingSchemaType.tsx +0 -32
- package/src/components/documentPreview/PaneItemPreview.tsx +0 -67
- package/src/components/documentPreview/PublishedStatus.tsx +0 -35
- package/src/components/documentPreview/TimeAgo.tsx +0 -12
- package/src/components/icons/Audio.tsx +0 -13
- package/src/components/icons/Resolution.tsx +0 -12
- package/src/components/icons/StopWatch.tsx +0 -20
- package/src/components/icons/ToolIcon.tsx +0 -19
- package/src/components/uploadConfiguration/PlaybackPolicy.tsx +0 -133
- package/src/components/uploadConfiguration/PlaybackPolicyOption.tsx +0 -76
- package/src/components/uploadConfiguration/PlaybackPolicyWarning.tsx +0 -29
- package/src/components/uploadConfiguration/ResolutionTierSelector.tsx +0 -72
- package/src/components/uploadConfiguration/StaticRenditionSelector.tsx +0 -180
- package/src/components/withFocusRing/helpers.ts +0 -24
- package/src/components/withFocusRing/index.ts +0 -1
- package/src/components/withFocusRing/withFocusRing.ts +0 -30
- package/src/context/DialogStateContext.tsx +0 -33
- package/src/context/DrmPlaybackWarningContext.tsx +0 -97
- package/src/hooks/useAccessControl.ts +0 -13
- package/src/hooks/useAssetDocumentValues.ts +0 -11
- package/src/hooks/useAssets.ts +0 -73
- package/src/hooks/useCancelUpload.ts +0 -22
- package/src/hooks/useClient.ts +0 -8
- package/src/hooks/useDialogState.ts +0 -11
- package/src/hooks/useDocReferences.ts +0 -21
- package/src/hooks/useFetchFileSize.ts +0 -55
- package/src/hooks/useImportMuxAssets.ts +0 -132
- package/src/hooks/useInView.ts +0 -41
- package/src/hooks/useMediaMetadata.ts +0 -104
- package/src/hooks/useMuxAssets.ts +0 -179
- package/src/hooks/useMuxPolling.ts +0 -52
- package/src/hooks/useResyncAsset.ts +0 -110
- package/src/hooks/useResyncMuxMetadata.ts +0 -169
- package/src/hooks/useSaveSecrets.ts +0 -78
- package/src/hooks/useSecretsDocumentValues.ts +0 -38
- package/src/hooks/useSecretsFormState.ts +0 -47
- package/src/plugin.tsx +0 -31
- package/src/sanity-ui.d.ts +0 -5
- package/src/schema.ts +0 -196
- package/src/util/addKeysToMuxData.ts +0 -30
- package/src/util/asserters.ts +0 -23
- package/src/util/assetTitlePlaceholder.ts +0 -31
- package/src/util/constants.ts +0 -15
- package/src/util/convertWatermarkToMux.ts +0 -160
- package/src/util/createSearchFilter.ts +0 -76
- package/src/util/createUrlParamsObject.ts +0 -29
- package/src/util/extractFiles.ts +0 -67
- package/src/util/formatBytes.ts +0 -31
- package/src/util/formatDriveShareLink.ts +0 -64
- package/src/util/formatSeconds.ts +0 -48
- package/src/util/generateJwt.ts +0 -57
- package/src/util/getAnimatedPosterSrc.ts +0 -26
- package/src/util/getPlaybackPolicy.ts +0 -69
- package/src/util/getPosterSrc.ts +0 -28
- package/src/util/getVideoMetadata.ts +0 -23
- package/src/util/getVideoSrc.ts +0 -23
- package/src/util/parsers.ts +0 -5
- package/src/util/pluginVersion.ts +0 -5
- package/src/util/readSecrets.ts +0 -38
- package/src/util/roundPxString.ts +0 -16
- package/src/util/textTracks.ts +0 -222
- package/src/util/tryWithSuspend.ts +0 -22
- package/src/util/types.ts +0 -566
- package/v2-incompatible.js +0 -11
package/src/actions/upload.ts
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import {uuid as generateUuid} from '@sanity/uuid'
|
|
2
|
-
import {concat, defer, from, type Observable, of, throwError} from 'rxjs'
|
|
3
|
-
import {catchError, mergeMap, mergeMapTo, switchMap} from 'rxjs/operators'
|
|
4
|
-
import type {SanityClient} from 'sanity'
|
|
5
|
-
|
|
6
|
-
import {createUpChunkObservable} from '../clients/upChunkObservable'
|
|
7
|
-
import {formatDriveShareLink} from '../util/formatDriveShareLink'
|
|
8
|
-
import {PLUGIN_VERSION_QUERY} from '../util/pluginVersion'
|
|
9
|
-
import {roundPxString} from '../util/roundPxString'
|
|
10
|
-
import type {MuxAsset, MuxNewAssetSettings, WatermarkConfig} from '../util/types'
|
|
11
|
-
import {getAsset} from './assets'
|
|
12
|
-
import {testSecretsObservable} from './secrets'
|
|
13
|
-
|
|
14
|
-
function sanitizeOverlaySettingsInPlace(settings: MuxNewAssetSettings) {
|
|
15
|
-
const inputs = settings.input
|
|
16
|
-
if (!inputs) return
|
|
17
|
-
for (const input of inputs) {
|
|
18
|
-
const overlay = (input as {overlay_settings?: Record<string, unknown>}).overlay_settings
|
|
19
|
-
if (!overlay) continue
|
|
20
|
-
|
|
21
|
-
const hm = roundPxString(overlay['horizontal_margin'])
|
|
22
|
-
const vm = roundPxString(overlay['vertical_margin'])
|
|
23
|
-
const w = roundPxString(overlay['width'])
|
|
24
|
-
|
|
25
|
-
if (hm) overlay['horizontal_margin'] = hm
|
|
26
|
-
if (vm) overlay['vertical_margin'] = vm
|
|
27
|
-
if (w) overlay['width'] = w
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function sanitizePxStringsInJson(json: string): string {
|
|
32
|
-
return json.replace(/"(-?\d+(?:\.\d+)?)px"/g, (_match, num) => {
|
|
33
|
-
const n = Number(num)
|
|
34
|
-
if (!Number.isFinite(n)) return _match
|
|
35
|
-
let rounded = Math.round(n)
|
|
36
|
-
if (rounded === 0) rounded = n < 0 ? -1 : 1
|
|
37
|
-
return `"${rounded}px"`
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function cancelUpload(client: SanityClient, uuid: string) {
|
|
42
|
-
return client.observable.request({
|
|
43
|
-
url: `/addons/mux/uploads/${client.config().dataset}/${uuid}`,
|
|
44
|
-
withCredentials: true,
|
|
45
|
-
method: 'DELETE',
|
|
46
|
-
query: PLUGIN_VERSION_QUERY,
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function uploadUrl({
|
|
51
|
-
url,
|
|
52
|
-
settings,
|
|
53
|
-
client,
|
|
54
|
-
}: {
|
|
55
|
-
url: string
|
|
56
|
-
settings: MuxNewAssetSettings
|
|
57
|
-
client: SanityClient
|
|
58
|
-
watermark?: WatermarkConfig
|
|
59
|
-
}) {
|
|
60
|
-
return testUrl(url).pipe(
|
|
61
|
-
switchMap((validUrl) => {
|
|
62
|
-
return concat(
|
|
63
|
-
of({type: 'url' as const, url: validUrl}),
|
|
64
|
-
testSecretsObservable(client).pipe(
|
|
65
|
-
switchMap((json) => {
|
|
66
|
-
if (!json || !json.status) {
|
|
67
|
-
return throwError(new Error('Invalid credentials'))
|
|
68
|
-
}
|
|
69
|
-
const uuid = generateUuid()
|
|
70
|
-
const muxBody = settings
|
|
71
|
-
if (!muxBody.input) muxBody.input = [{type: 'video'}]
|
|
72
|
-
muxBody.input[0]!.url = validUrl
|
|
73
|
-
sanitizeOverlaySettingsInPlace(muxBody)
|
|
74
|
-
|
|
75
|
-
const query: Record<string, string> = {
|
|
76
|
-
muxBody: sanitizePxStringsInJson(JSON.stringify(muxBody)),
|
|
77
|
-
}
|
|
78
|
-
const filename = validUrl.split('/').slice(-1)[0]
|
|
79
|
-
if (filename) {
|
|
80
|
-
query['filename'] = filename
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const dataset = client.config().dataset
|
|
84
|
-
return defer(() =>
|
|
85
|
-
client.observable.request({
|
|
86
|
-
url: `/addons/mux/assets/${dataset}`,
|
|
87
|
-
withCredentials: true,
|
|
88
|
-
method: 'POST',
|
|
89
|
-
headers: {
|
|
90
|
-
'MUX-Proxy-UUID': uuid,
|
|
91
|
-
'Content-Type': 'application/json',
|
|
92
|
-
},
|
|
93
|
-
query: {...query, ...PLUGIN_VERSION_QUERY},
|
|
94
|
-
}),
|
|
95
|
-
).pipe(
|
|
96
|
-
mergeMap((result) => {
|
|
97
|
-
const asset =
|
|
98
|
-
(result && result.results && result.results[0] && result.results[0].document) ||
|
|
99
|
-
null
|
|
100
|
-
|
|
101
|
-
if (!asset) {
|
|
102
|
-
return throwError(new Error('No asset document returned'))
|
|
103
|
-
}
|
|
104
|
-
return of({type: 'success' as const, id: uuid, asset})
|
|
105
|
-
}),
|
|
106
|
-
)
|
|
107
|
-
}),
|
|
108
|
-
),
|
|
109
|
-
)
|
|
110
|
-
}),
|
|
111
|
-
)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function uploadFile({
|
|
115
|
-
settings,
|
|
116
|
-
client,
|
|
117
|
-
file,
|
|
118
|
-
watermark,
|
|
119
|
-
}: {
|
|
120
|
-
settings: MuxNewAssetSettings
|
|
121
|
-
client: SanityClient
|
|
122
|
-
file: File
|
|
123
|
-
watermark?: WatermarkConfig
|
|
124
|
-
}) {
|
|
125
|
-
return testFile(file).pipe(
|
|
126
|
-
switchMap((fileOptions) => {
|
|
127
|
-
return concat(
|
|
128
|
-
of({type: 'file' as const, file: fileOptions}),
|
|
129
|
-
testSecretsObservable(client).pipe(
|
|
130
|
-
switchMap((json) => {
|
|
131
|
-
if (!json || !json.status) {
|
|
132
|
-
return throwError(() => new Error('Invalid credentials'))
|
|
133
|
-
}
|
|
134
|
-
const uuid = generateUuid()
|
|
135
|
-
const body = settings
|
|
136
|
-
sanitizeOverlaySettingsInPlace(body)
|
|
137
|
-
|
|
138
|
-
return concat(
|
|
139
|
-
of({type: 'uuid' as const, uuid}),
|
|
140
|
-
defer(() =>
|
|
141
|
-
client.observable.request<{
|
|
142
|
-
sanityAssetId: string
|
|
143
|
-
upload: {
|
|
144
|
-
cors_origin: string
|
|
145
|
-
id: string
|
|
146
|
-
new_asset_settings: MuxNewAssetSettings
|
|
147
|
-
status: 'waiting'
|
|
148
|
-
timeout: number
|
|
149
|
-
url: string
|
|
150
|
-
}
|
|
151
|
-
}>({
|
|
152
|
-
url: `/addons/mux/uploads/${client.config().dataset}`,
|
|
153
|
-
withCredentials: true,
|
|
154
|
-
method: 'POST',
|
|
155
|
-
headers: {
|
|
156
|
-
'MUX-Proxy-UUID': uuid,
|
|
157
|
-
'Content-Type': 'application/json',
|
|
158
|
-
},
|
|
159
|
-
body,
|
|
160
|
-
query: PLUGIN_VERSION_QUERY,
|
|
161
|
-
}),
|
|
162
|
-
).pipe(
|
|
163
|
-
mergeMap((result) => {
|
|
164
|
-
return createUpChunkObservable(uuid, result.upload.url, file).pipe(
|
|
165
|
-
// @TODO type the observable events
|
|
166
|
-
mergeMap((event) => {
|
|
167
|
-
if (event.type !== 'success') {
|
|
168
|
-
return of(event)
|
|
169
|
-
}
|
|
170
|
-
return from(updateAssetDocumentFromUpload(client, uuid, watermark)).pipe(
|
|
171
|
-
mergeMap((doc) => of({...event, asset: doc})),
|
|
172
|
-
)
|
|
173
|
-
}),
|
|
174
|
-
catchError((err) => {
|
|
175
|
-
// Delete asset document
|
|
176
|
-
return cancelUpload(client, uuid).pipe(mergeMapTo(throwError(err)))
|
|
177
|
-
}),
|
|
178
|
-
)
|
|
179
|
-
}),
|
|
180
|
-
),
|
|
181
|
-
)
|
|
182
|
-
}),
|
|
183
|
-
),
|
|
184
|
-
)
|
|
185
|
-
}),
|
|
186
|
-
)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
type UploadResponse = {
|
|
190
|
-
data: {
|
|
191
|
-
asset_id: string
|
|
192
|
-
cors_origin: string
|
|
193
|
-
id: string
|
|
194
|
-
new_asset_settings: {
|
|
195
|
-
static_renditions?: {resolution: string}[]
|
|
196
|
-
passthrough: string
|
|
197
|
-
playback_policies: ['public' | 'signed' | 'drm']
|
|
198
|
-
}
|
|
199
|
-
status: string
|
|
200
|
-
timeout: number
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
function getUpload(client: SanityClient, assetId: string) {
|
|
204
|
-
const {dataset} = client.config()
|
|
205
|
-
return client.request<UploadResponse>({
|
|
206
|
-
url: `/addons/mux/uploads/${dataset}/${assetId}`,
|
|
207
|
-
withCredentials: true,
|
|
208
|
-
method: 'GET',
|
|
209
|
-
query: PLUGIN_VERSION_QUERY,
|
|
210
|
-
})
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function pollUpload(client: SanityClient, uuid: string): Promise<UploadResponse> {
|
|
214
|
-
const maxTries = 10
|
|
215
|
-
let pollInterval: number
|
|
216
|
-
let tries = 0
|
|
217
|
-
let assetId: string
|
|
218
|
-
let upload: UploadResponse
|
|
219
|
-
return new Promise((resolve, reject) => {
|
|
220
|
-
pollInterval = (setInterval as typeof window.setInterval)(async () => {
|
|
221
|
-
try {
|
|
222
|
-
upload = await getUpload(client, uuid)
|
|
223
|
-
} catch (err) {
|
|
224
|
-
reject(err)
|
|
225
|
-
return
|
|
226
|
-
}
|
|
227
|
-
assetId = upload && upload.data && upload.data.asset_id
|
|
228
|
-
if (assetId) {
|
|
229
|
-
clearInterval(pollInterval)
|
|
230
|
-
resolve(upload)
|
|
231
|
-
}
|
|
232
|
-
if (tries > maxTries) {
|
|
233
|
-
clearInterval(pollInterval)
|
|
234
|
-
reject(new Error('Upload did not finish'))
|
|
235
|
-
}
|
|
236
|
-
tries++
|
|
237
|
-
}, 2000)
|
|
238
|
-
})
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
async function updateAssetDocumentFromUpload(
|
|
242
|
-
client: SanityClient,
|
|
243
|
-
uuid: string,
|
|
244
|
-
_watermark?: WatermarkConfig,
|
|
245
|
-
) {
|
|
246
|
-
let upload: UploadResponse
|
|
247
|
-
let asset: {data: MuxAsset}
|
|
248
|
-
try {
|
|
249
|
-
upload = await pollUpload(client, uuid)
|
|
250
|
-
} catch (err) {
|
|
251
|
-
return Promise.reject(err)
|
|
252
|
-
}
|
|
253
|
-
try {
|
|
254
|
-
asset = await getAsset(client, upload.data.asset_id)
|
|
255
|
-
} catch (err) {
|
|
256
|
-
return Promise.reject(err)
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const doc = {
|
|
260
|
-
_id: uuid,
|
|
261
|
-
_type: 'mux.videoAsset',
|
|
262
|
-
status: asset.data.status,
|
|
263
|
-
data: asset.data,
|
|
264
|
-
assetId: asset.data.id,
|
|
265
|
-
playbackId: asset.data.playback_ids[0]?.id,
|
|
266
|
-
uploadId: upload.data.id,
|
|
267
|
-
}
|
|
268
|
-
return client.createOrReplace(doc).then(() => {
|
|
269
|
-
return doc
|
|
270
|
-
})
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
function testFile(file: File) {
|
|
274
|
-
if (typeof window !== 'undefined' && file instanceof window.File) {
|
|
275
|
-
const fileOptions = optionsFromFile({}, file)
|
|
276
|
-
return of(fileOptions)
|
|
277
|
-
}
|
|
278
|
-
return throwError(new Error('Invalid file'))
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function testUrl(url: string): Observable<string> {
|
|
282
|
-
const error = new Error('Invalid URL')
|
|
283
|
-
if (typeof url !== 'string') {
|
|
284
|
-
return throwError(error)
|
|
285
|
-
}
|
|
286
|
-
let formattedUrl = url.trim()
|
|
287
|
-
formattedUrl = formatDriveShareLink(formattedUrl)
|
|
288
|
-
let parsed
|
|
289
|
-
try {
|
|
290
|
-
parsed = new URL(formattedUrl)
|
|
291
|
-
} catch {
|
|
292
|
-
return throwError(error)
|
|
293
|
-
}
|
|
294
|
-
if (parsed && !parsed.protocol.match(/http:|https:/)) {
|
|
295
|
-
return throwError(error)
|
|
296
|
-
}
|
|
297
|
-
return of(formattedUrl)
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
function optionsFromFile(opts: {preserveFilename?: boolean}, file: File) {
|
|
301
|
-
if (typeof window === 'undefined' || !(file instanceof window.File)) {
|
|
302
|
-
return undefined
|
|
303
|
-
}
|
|
304
|
-
return {
|
|
305
|
-
name: opts.preserveFilename === false ? undefined : file.name,
|
|
306
|
-
type: file.type,
|
|
307
|
-
}
|
|
308
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import {UpChunk} from '@mux/upchunk'
|
|
2
|
-
import {Observable} from 'rxjs'
|
|
3
|
-
|
|
4
|
-
export function createUpChunkObservable(uuid: string, uploadUrl: string, source: File) {
|
|
5
|
-
return new Observable<
|
|
6
|
-
| {type: 'pause' | 'resume'; id: string}
|
|
7
|
-
| {type: 'success'; id: string}
|
|
8
|
-
| {type: 'progress'; percent: number}
|
|
9
|
-
>((subscriber) => {
|
|
10
|
-
const upchunk = UpChunk.createUpload({
|
|
11
|
-
endpoint: uploadUrl,
|
|
12
|
-
file: source,
|
|
13
|
-
dynamicChunkSize: true, // changes the chunk size based on network speeds
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
const successHandler = () => {
|
|
17
|
-
subscriber.next({
|
|
18
|
-
type: 'success',
|
|
19
|
-
id: uuid,
|
|
20
|
-
})
|
|
21
|
-
subscriber.complete()
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const errorHandler = (data: CustomEvent) => subscriber.error(new Error(data.detail.message))
|
|
25
|
-
|
|
26
|
-
const progressHandler = (data: CustomEvent) => {
|
|
27
|
-
return subscriber.next({type: 'progress', percent: data.detail})
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const offlineHandler = () => {
|
|
31
|
-
upchunk.pause()
|
|
32
|
-
subscriber.next({
|
|
33
|
-
type: 'pause',
|
|
34
|
-
id: uuid,
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const onlineHandler = () => {
|
|
39
|
-
upchunk.resume()
|
|
40
|
-
subscriber.next({
|
|
41
|
-
type: 'resume',
|
|
42
|
-
id: uuid,
|
|
43
|
-
})
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
upchunk.on('success', successHandler)
|
|
47
|
-
upchunk.on('error', errorHandler)
|
|
48
|
-
upchunk.on('progress', progressHandler)
|
|
49
|
-
upchunk.on('offline', offlineHandler)
|
|
50
|
-
upchunk.on('online', onlineHandler)
|
|
51
|
-
|
|
52
|
-
return () => upchunk.abort()
|
|
53
|
-
})
|
|
54
|
-
}
|