sanity-plugin-mux-input 1.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/LICENSE +21 -0
- package/README.md +86 -0
- package/build/actions/assets.js +37 -0
- package/build/actions/assets.js.map +1 -0
- package/build/actions/secrets.js +125 -0
- package/build/actions/secrets.js.map +1 -0
- package/build/actions/upload.js +280 -0
- package/build/actions/upload.js.map +1 -0
- package/build/clients/SanityClient.js +19 -0
- package/build/clients/SanityClient.js.map +1 -0
- package/build/clients/upChunkObservable.js +66 -0
- package/build/clients/upChunkObservable.js.map +1 -0
- package/build/components/FileInputButton.js +84 -0
- package/build/components/FileInputButton.js.map +1 -0
- package/build/components/Input.css +30 -0
- package/build/components/Input.js +823 -0
- package/build/components/Input.js.map +1 -0
- package/build/components/MuxLogo.js +19 -0
- package/build/components/MuxLogo.js.map +1 -0
- package/build/components/Preview.css +16 -0
- package/build/components/Preview.js +95 -0
- package/build/components/Preview.js.map +1 -0
- package/build/components/SelectAsset.css +56 -0
- package/build/components/SelectAsset.js +162 -0
- package/build/components/SelectAsset.js.map +1 -0
- package/build/components/Setup.css +7 -0
- package/build/components/Setup.js +311 -0
- package/build/components/Setup.js.map +1 -0
- package/build/components/UploadPlaceholder.css +81 -0
- package/build/components/UploadPlaceholder.js +92 -0
- package/build/components/UploadPlaceholder.js.map +1 -0
- package/build/components/Uploader.css +28 -0
- package/build/components/Uploader.js +534 -0
- package/build/components/Uploader.js.map +1 -0
- package/build/components/Video.css +21 -0
- package/build/components/Video.js +360 -0
- package/build/components/Video.js.map +1 -0
- package/build/config.js +17 -0
- package/build/config.js.map +1 -0
- package/build/index.js +22 -0
- package/build/index.js.map +1 -0
- package/build/schema/mux.video.js +41 -0
- package/build/schema/mux.video.js.map +1 -0
- package/build/schema/mux.videoAsset.js +29 -0
- package/build/schema/mux.videoAsset.js.map +1 -0
- package/build/util/extractFiles.js +70 -0
- package/build/util/extractFiles.js.map +1 -0
- package/build/util/formatTime.js +28 -0
- package/build/util/formatTime.js.map +1 -0
- package/build/util/generateJwt.js +30 -0
- package/build/util/generateJwt.js.map +1 -0
- package/build/util/getPosterSrc.js +46 -0
- package/build/util/getPosterSrc.js.map +1 -0
- package/build/util/getStoryboardSrc.js +26 -0
- package/build/util/getStoryboardSrc.js.map +1 -0
- package/build/util/getVideoSrc.js +23 -0
- package/build/util/getVideoSrc.js.map +1 -0
- package/config.dist.json +3 -0
- package/package.json +85 -0
- package/sanity.json +16 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Sanity.io
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Mux Video Input Sanity Plugin
|
|
2
|
+
|
|
3
|
+
This is a plugin which let you use [Mux](https://www.mux.com) video assets in your Sanity studio.
|
|
4
|
+
|
|
5
|
+
The Mux plugin for Sanity gives you a way to upload and preview videos easily.
|
|
6
|
+
|
|
7
|
+
[Read our blog post](https://www.sanity.io/blog/first-class-responsive-video-support-with-the-new-mux-plugin) about this plugin.
|
|
8
|
+
|
|
9
|
+
Not familiar with Sanity? [Visit www.sanity.io](https://www.sanity.io/)
|
|
10
|
+
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
- While in your project folder, run `sanity install mux-input`.
|
|
14
|
+
Read more about [using plugins in Sanity here](https://www.sanity.io/docs/plugins).
|
|
15
|
+
|
|
16
|
+
* Make a schema type that uses the plugin's type `mux.video`, for example:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
{
|
|
20
|
+
title: "Video blog post",
|
|
21
|
+
name: "videoBlogPost",
|
|
22
|
+
type: "document",
|
|
23
|
+
fields: [
|
|
24
|
+
{ title: "Title", name: "title", type: "string" },
|
|
25
|
+
{
|
|
26
|
+
title: "Video file",
|
|
27
|
+
name: "video",
|
|
28
|
+
type: "mux.video"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Read more about [schemas in Sanity here](https://www.sanity.io/docs/the-schema).
|
|
35
|
+
|
|
36
|
+
- Get an API Access Token and enter it into the setup screen
|
|
37
|
+
First time you use the plugin you will be asked to enter your Mux credentials.
|
|
38
|
+
|
|
39
|
+
The Mux Video API uses an Access Token and Secret Key for authentication.
|
|
40
|
+
|
|
41
|
+
If you haven't already, generate a new Access Token in the Access Token settings of your Mux account dashboard, and make sure it got permission to both read and write _video_ and read _data_.
|
|
42
|
+
|
|
43
|
+
The token is stored in the dataset as a document of the type `mux.apiKey` with the id `secrets.mux`.
|
|
44
|
+
Having the ID be non-root ensures that only editors are able to see it.
|
|
45
|
+
|
|
46
|
+
The Mux plugin will find it’s access tokens by fetching this document.
|
|
47
|
+
|
|
48
|
+
# Playing videos in the frontend
|
|
49
|
+
|
|
50
|
+
We have made an own player which supports poster images for the videos as set with this plugin, see [`sanity-mux-player`](https://github.com/sanity-io/sanity-mux-player)
|
|
51
|
+
|
|
52
|
+
You could use any player which supports HLS, just point the video source to:
|
|
53
|
+
|
|
54
|
+
`https://stream.mux.com/${assetDocument.playbackId}.m3u8`
|
|
55
|
+
|
|
56
|
+
# Enabling Signed Urls
|
|
57
|
+
|
|
58
|
+
To enable [signed urls](https://docs.mux.com/docs/security-signed-urls) with content uploaded to Mux, you will need to check the "Enable Signed Urls" option in the Mux Plugin configuration. Assuming that the API Access Token and Secret Key are set (as per the [Quick start](#quick-start) section).
|
|
59
|
+
|
|
60
|
+
More information for this feature of the plugin can be found on Mux's [documentation](https://docs.mux.com/docs/headless-cms-sanity#advanced-signed-urls)
|
|
61
|
+
|
|
62
|
+
# Enabling MP4 support
|
|
63
|
+
|
|
64
|
+
To enable [static MP4 renditions](https://docs.mux.com/guides/video/enable-static-mp4-renditions), create or open the config file found in `config/mux-input.json` in your studio folder. This file is automatically created the first time the studio starts after adding the plugin.
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
{
|
|
68
|
+
"mp4_support": "standard"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Currently `mp4_support` is the only supported MUX option and this supports a value of either `standard` or `none` (the default).
|
|
73
|
+
|
|
74
|
+
# Contributing
|
|
75
|
+
|
|
76
|
+
Issues are actively monitored and PRs are welcome. When developing this plugin the easiest setup is:
|
|
77
|
+
|
|
78
|
+
1. Fork this repo.
|
|
79
|
+
1. Install the sanity cli and create a sanity project: `npm install -g @sanity/cli && sanity init`. Follow the prompts, starting out with the blog template is a good way to go.
|
|
80
|
+
1. `cd` into your project directory, run `npm install && npm start` - your sanity studio should be running on http://localhost:3333.
|
|
81
|
+
1. `cd` into the `plugins` director of your project.
|
|
82
|
+
1. Fork this repo and clone your fork into the `plugins` directory inside your project `git clone git@github.com:your-fork/sanity-plugin-mux-input.git`.
|
|
83
|
+
1. Open `sanity.json`, go to the `plugins` array and add `mux-input`.
|
|
84
|
+
1. Re-start the sanity studio server with `npm start`.
|
|
85
|
+
1. Edit `schemas/post.js` and add follow the plugin documentation to add a `mux.video` type field.
|
|
86
|
+
1. Your studio should reload, and now when you edit the plugin code it should reload the studio, when you're done create a branch, put in a PR and a maintainer will review it. Thank you!
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.deleteAsset = deleteAsset;
|
|
7
|
+
exports.getAsset = getAsset;
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _SanityClient = _interopRequireDefault(require("../clients/SanityClient"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
function deleteAsset(assetId) {
|
|
15
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
16
|
+
return _SanityClient.default.request({
|
|
17
|
+
url: "/addons/mux/assets/".concat(dataset, "/").concat(assetId),
|
|
18
|
+
withCredentials: true,
|
|
19
|
+
method: 'DELETE'
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getAsset(assetId) {
|
|
24
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
25
|
+
return _SanityClient.default.request({
|
|
26
|
+
url: "/addons/mux/assets/".concat(dataset, "/data/").concat(assetId),
|
|
27
|
+
withCredentials: true,
|
|
28
|
+
method: 'GET'
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
var _default = {
|
|
33
|
+
getAsset,
|
|
34
|
+
deleteAsset
|
|
35
|
+
};
|
|
36
|
+
exports.default = _default;
|
|
37
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/assets.js"],"names":["deleteAsset","assetId","dataset","client","clientConfig","request","url","withCredentials","method","getAsset"],"mappings":";;;;;;;;;AAAA;;;;AAEO,SAASA,WAAT,CAAqBC,OAArB,EAA8B;AACnC,MAAMC,OAAO,GAAGC,sBAAOC,YAAP,CAAoBF,OAApC;AACA,SAAOC,sBAAOE,OAAP,CAAe;AACpBC,IAAAA,GAAG,+BAAwBJ,OAAxB,cAAmCD,OAAnC,CADiB;AAEpBM,IAAAA,eAAe,EAAE,IAFG;AAGpBC,IAAAA,MAAM,EAAE;AAHY,GAAf,CAAP;AAKD;;AAEM,SAASC,QAAT,CAAkBR,OAAlB,EAA2B;AAChC,MAAMC,OAAO,GAAGC,sBAAOC,YAAP,CAAoBF,OAApC;AACA,SAAOC,sBAAOE,OAAP,CAAe;AACpBC,IAAAA,GAAG,+BAAwBJ,OAAxB,mBAAwCD,OAAxC,CADiB;AAEpBM,IAAAA,eAAe,EAAE,IAFG;AAGpBC,IAAAA,MAAM,EAAE;AAHY,GAAf,CAAP;AAKD;;eAEc;AAACC,EAAAA,QAAD;AAAWT,EAAAA;AAAX,C","sourcesContent":["import client from '../clients/SanityClient'\r\n\r\nexport function deleteAsset(assetId) {\r\n const dataset = client.clientConfig.dataset\r\n return client.request({\r\n url: `/addons/mux/assets/${dataset}/${assetId}`,\r\n withCredentials: true,\r\n method: 'DELETE',\r\n })\r\n}\r\n\r\nexport function getAsset(assetId) {\r\n const dataset = client.clientConfig.dataset\r\n return client.request({\r\n url: `/addons/mux/assets/${dataset}/data/${assetId}`,\r\n withCredentials: true,\r\n method: 'GET',\r\n })\r\n}\r\n\r\nexport default {getAsset, deleteAsset}\r\n"],"file":"assets.js"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.fetchSecrets = fetchSecrets;
|
|
7
|
+
exports.saveSecrets = saveSecrets;
|
|
8
|
+
exports.createSigningKeys = createSigningKeys;
|
|
9
|
+
exports.testSecrets = testSecrets;
|
|
10
|
+
exports.haveValidSigningKeys = haveValidSigningKeys;
|
|
11
|
+
exports.testSecretsObservable = testSecretsObservable;
|
|
12
|
+
|
|
13
|
+
var _rxjs = require("rxjs");
|
|
14
|
+
|
|
15
|
+
var _SanityClient = _interopRequireDefault(require("../clients/SanityClient"));
|
|
16
|
+
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
|
|
19
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
20
|
+
|
|
21
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
22
|
+
|
|
23
|
+
var cache = {
|
|
24
|
+
secrets: null,
|
|
25
|
+
exists: false
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function fetchSecrets() {
|
|
29
|
+
if (cache.exists) {
|
|
30
|
+
return Promise.resolve(cache);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return _SanityClient.default.fetch('*[_id == "secrets.mux"][0]').then(secrets => {
|
|
34
|
+
cache.exists = Boolean(secrets);
|
|
35
|
+
cache.secrets = {
|
|
36
|
+
token: (secrets === null || secrets === void 0 ? void 0 : secrets.token) || null,
|
|
37
|
+
secretKey: (secrets === null || secrets === void 0 ? void 0 : secrets.secretKey) || null,
|
|
38
|
+
enableSignedUrls: (secrets === null || secrets === void 0 ? void 0 : secrets.enableSignedUrls) || false,
|
|
39
|
+
signingKeyId: (secrets === null || secrets === void 0 ? void 0 : secrets.signingKeyId) || null,
|
|
40
|
+
signingKeyPrivate: (secrets === null || secrets === void 0 ? void 0 : secrets.signingKeyPrivate) || null
|
|
41
|
+
};
|
|
42
|
+
return cache;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function saveSecrets(token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate) {
|
|
47
|
+
var doc = {
|
|
48
|
+
_id: 'secrets.mux',
|
|
49
|
+
_type: 'mux.apiKey',
|
|
50
|
+
token,
|
|
51
|
+
secretKey,
|
|
52
|
+
enableSignedUrls,
|
|
53
|
+
signingKeyId,
|
|
54
|
+
signingKeyPrivate
|
|
55
|
+
};
|
|
56
|
+
return _SanityClient.default.createOrReplace(doc).then(() => {
|
|
57
|
+
cache.exists = true;
|
|
58
|
+
cache.secrets = {
|
|
59
|
+
token,
|
|
60
|
+
secretKey,
|
|
61
|
+
enableSignedUrls,
|
|
62
|
+
signingKeyId,
|
|
63
|
+
signingKeyPrivate
|
|
64
|
+
};
|
|
65
|
+
return cache.secrets;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function createSigningKeys() {
|
|
70
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
71
|
+
return _SanityClient.default.request({
|
|
72
|
+
url: "/addons/mux/signing-keys/".concat(dataset),
|
|
73
|
+
withCredentials: true,
|
|
74
|
+
method: 'POST'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function testSecrets() {
|
|
79
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
80
|
+
return _SanityClient.default.request({
|
|
81
|
+
url: "/addons/mux/secrets/".concat(dataset, "/test"),
|
|
82
|
+
withCredentials: true,
|
|
83
|
+
method: 'GET'
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function haveValidSigningKeys(_x, _x2) {
|
|
88
|
+
return _haveValidSigningKeys.apply(this, arguments);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function _haveValidSigningKeys() {
|
|
92
|
+
_haveValidSigningKeys = _asyncToGenerator(function* (signingKeyId, signingKeyPrivate) {
|
|
93
|
+
if (!(signingKeyId && signingKeyPrivate)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
var res = yield _SanityClient.default.request({
|
|
101
|
+
url: "/addons/mux/signing-keys/".concat(dataset, "/").concat(signingKeyId),
|
|
102
|
+
withCredentials: true,
|
|
103
|
+
method: 'GET'
|
|
104
|
+
}); //
|
|
105
|
+
// if this signing key is valid it will return { data: { id: 'xxxx' } }
|
|
106
|
+
//
|
|
107
|
+
|
|
108
|
+
return !!(res.data && res.data.id);
|
|
109
|
+
} catch (e) {
|
|
110
|
+
console.error('Error fetching signingKeyId', signingKeyId, 'assuming it is not valid');
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return _haveValidSigningKeys.apply(this, arguments);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function testSecretsObservable() {
|
|
118
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
119
|
+
return (0, _rxjs.defer)(() => _SanityClient.default.observable.request({
|
|
120
|
+
url: "/addons/mux/secrets/".concat(dataset, "/test"),
|
|
121
|
+
withCredentials: true,
|
|
122
|
+
method: 'GET'
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/secrets.js"],"names":["cache","secrets","exists","fetchSecrets","Promise","resolve","client","fetch","then","Boolean","token","secretKey","enableSignedUrls","signingKeyId","signingKeyPrivate","saveSecrets","doc","_id","_type","createOrReplace","createSigningKeys","dataset","clientConfig","request","url","withCredentials","method","testSecrets","haveValidSigningKeys","res","data","id","e","console","error","testSecretsObservable","observable"],"mappings":"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","sourcesContent":["import {defer} from 'rxjs'\r\nimport client from '../clients/SanityClient'\r\n\r\nconst cache = {\r\n secrets: null,\r\n exists: false,\r\n}\r\n\r\nexport function fetchSecrets() {\r\n if (cache.exists) {\r\n return Promise.resolve(cache)\r\n }\r\n\r\n return client.fetch('*[_id == \"secrets.mux\"][0]').then((secrets) => {\r\n cache.exists = Boolean(secrets)\r\n cache.secrets = {\r\n token: secrets?.token || null,\r\n secretKey: secrets?.secretKey || null,\r\n enableSignedUrls: secrets?.enableSignedUrls || false,\r\n signingKeyId: secrets?.signingKeyId || null,\r\n signingKeyPrivate: secrets?.signingKeyPrivate || null,\r\n }\r\n return cache\r\n })\r\n}\r\n\r\nexport function saveSecrets(token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate) {\r\n const doc = {\r\n _id: 'secrets.mux',\r\n _type: 'mux.apiKey',\r\n token,\r\n secretKey,\r\n enableSignedUrls,\r\n signingKeyId,\r\n signingKeyPrivate,\r\n }\r\n\r\n return client.createOrReplace(doc).then(() => {\r\n cache.exists = true\r\n cache.secrets = {\r\n token,\r\n secretKey,\r\n enableSignedUrls,\r\n signingKeyId,\r\n signingKeyPrivate,\r\n }\r\n return cache.secrets\r\n })\r\n}\r\n\r\nexport function createSigningKeys() {\r\n const dataset = client.clientConfig.dataset\r\n return client.request({\r\n url: `/addons/mux/signing-keys/${dataset}`,\r\n withCredentials: true,\r\n method: 'POST',\r\n })\r\n}\r\n\r\nexport function testSecrets() {\r\n const dataset = client.clientConfig.dataset\r\n return client.request({\r\n url: `/addons/mux/secrets/${dataset}/test`,\r\n withCredentials: true,\r\n method: 'GET',\r\n })\r\n}\r\n\r\nexport async function haveValidSigningKeys(signingKeyId, signingKeyPrivate) {\r\n if (!(signingKeyId && signingKeyPrivate)) {\r\n return false\r\n }\r\n\r\n const dataset = client.clientConfig.dataset\r\n try {\r\n const res = await client.request({\r\n url: `/addons/mux/signing-keys/${dataset}/${signingKeyId}`,\r\n withCredentials: true,\r\n method: 'GET',\r\n })\r\n //\r\n // if this signing key is valid it will return { data: { id: 'xxxx' } }\r\n //\r\n return !!(res.data && res.data.id)\r\n } catch (e) {\r\n console.error('Error fetching signingKeyId', signingKeyId, 'assuming it is not valid')\r\n return false\r\n }\r\n}\r\n\r\nexport function testSecretsObservable() {\r\n const dataset = client.clientConfig.dataset\r\n return defer(() =>\r\n client.observable.request({\r\n url: `/addons/mux/secrets/${dataset}/test`,\r\n withCredentials: true,\r\n method: 'GET',\r\n })\r\n )\r\n}\r\n"],"file":"secrets.js"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.cancelUpload = cancelUpload;
|
|
7
|
+
exports.uploadUrl = uploadUrl;
|
|
8
|
+
exports.uploadFile = uploadFile;
|
|
9
|
+
exports.getUpload = getUpload;
|
|
10
|
+
exports.default = void 0;
|
|
11
|
+
|
|
12
|
+
var _uuid = require("@sanity/uuid");
|
|
13
|
+
|
|
14
|
+
var _config = _interopRequireDefault(require("../config"));
|
|
15
|
+
|
|
16
|
+
var _lodash = require("lodash");
|
|
17
|
+
|
|
18
|
+
var _rxjs = require("rxjs");
|
|
19
|
+
|
|
20
|
+
var _operators = require("rxjs/operators");
|
|
21
|
+
|
|
22
|
+
var _assets = require("../actions/assets");
|
|
23
|
+
|
|
24
|
+
var _secrets = require("../actions/secrets");
|
|
25
|
+
|
|
26
|
+
var _SanityClient = _interopRequireDefault(require("../clients/SanityClient"));
|
|
27
|
+
|
|
28
|
+
var _upChunkObservable = require("../clients/upChunkObservable");
|
|
29
|
+
|
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
31
|
+
|
|
32
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
33
|
+
|
|
34
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
35
|
+
|
|
36
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
37
|
+
|
|
38
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
39
|
+
|
|
40
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
41
|
+
|
|
42
|
+
function cancelUpload(uuid) {
|
|
43
|
+
return _SanityClient.default.observable.request({
|
|
44
|
+
url: "/addons/mux/uploads/".concat(_SanityClient.default.clientConfig.dataset, "/").concat(uuid),
|
|
45
|
+
withCredentials: true,
|
|
46
|
+
method: 'DELETE'
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function uploadUrl(url) {
|
|
51
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
52
|
+
return testUrl(url).pipe((0, _operators.switchMap)(validUrl => {
|
|
53
|
+
return (0, _rxjs.concat)((0, _rxjs.of)({
|
|
54
|
+
type: 'url',
|
|
55
|
+
url: validUrl
|
|
56
|
+
}), (0, _secrets.testSecretsObservable)().pipe((0, _operators.switchMap)(json => {
|
|
57
|
+
if (!json || !json.status) {
|
|
58
|
+
return (0, _rxjs.throwError)(new Error('Invalid credentials'));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
var uuid = (0, _uuid.uuid)();
|
|
62
|
+
var enableSignedUrls = options.enableSignedUrls;
|
|
63
|
+
var muxBody = {
|
|
64
|
+
input: validUrl,
|
|
65
|
+
playback_policy: [enableSignedUrls ? 'signed' : 'public'],
|
|
66
|
+
mp4_support: _config.default.mp4_support
|
|
67
|
+
};
|
|
68
|
+
var query = {
|
|
69
|
+
muxBody: JSON.stringify(muxBody),
|
|
70
|
+
filename: validUrl.split('/').slice(-1)[0]
|
|
71
|
+
};
|
|
72
|
+
var dataset = _SanityClient.default.clientConfig.dataset;
|
|
73
|
+
return (0, _rxjs.defer)(() => _SanityClient.default.observable.request({
|
|
74
|
+
url: "/addons/mux/assets/".concat(dataset),
|
|
75
|
+
withCredentials: true,
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: {
|
|
78
|
+
'MUX-Proxy-UUID': uuid,
|
|
79
|
+
'Content-Type': 'application/json'
|
|
80
|
+
},
|
|
81
|
+
query
|
|
82
|
+
})).pipe((0, _operators.mergeMap)(result => {
|
|
83
|
+
var asset = result && result.results && result.results[0] && result.results[0].document || null;
|
|
84
|
+
|
|
85
|
+
if (!asset) {
|
|
86
|
+
return (0, _rxjs.throwError)(new Error('No asset document returned'));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return (0, _rxjs.of)({
|
|
90
|
+
type: 'success',
|
|
91
|
+
id: uuid,
|
|
92
|
+
asset
|
|
93
|
+
});
|
|
94
|
+
}));
|
|
95
|
+
})));
|
|
96
|
+
}));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function uploadFile(file) {
|
|
100
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
101
|
+
return testFile(file).pipe((0, _operators.switchMap)(fileOptions => {
|
|
102
|
+
return (0, _rxjs.concat)((0, _rxjs.of)({
|
|
103
|
+
type: 'file',
|
|
104
|
+
file: fileOptions
|
|
105
|
+
}), (0, _secrets.testSecretsObservable)().pipe((0, _operators.switchMap)(json => {
|
|
106
|
+
if (!json || !json.status) {
|
|
107
|
+
return (0, _rxjs.throwError)(new Error('Invalid credentials'));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
var uuid = (0, _uuid.uuid)();
|
|
111
|
+
var enableSignedUrls = options.enableSignedUrls;
|
|
112
|
+
var body = {
|
|
113
|
+
mp4_support: _config.default.mp4_support,
|
|
114
|
+
playback_policy: [enableSignedUrls ? 'signed' : 'public']
|
|
115
|
+
};
|
|
116
|
+
return (0, _rxjs.concat)((0, _rxjs.of)({
|
|
117
|
+
type: 'uuid',
|
|
118
|
+
uuid
|
|
119
|
+
}), (0, _rxjs.defer)(() => _SanityClient.default.observable.request({
|
|
120
|
+
url: "/addons/mux/uploads/".concat(_SanityClient.default.clientConfig.dataset),
|
|
121
|
+
withCredentials: true,
|
|
122
|
+
method: 'POST',
|
|
123
|
+
headers: {
|
|
124
|
+
'MUX-Proxy-UUID': uuid,
|
|
125
|
+
'Content-Type': 'application/json'
|
|
126
|
+
},
|
|
127
|
+
body
|
|
128
|
+
})).pipe((0, _operators.mergeMap)(result => {
|
|
129
|
+
return (0, _upChunkObservable.createUpChunkObservable)(uuid, result.upload.url, file).pipe( // eslint-disable-next-line max-nested-callbacks
|
|
130
|
+
(0, _operators.mergeMap)(event => {
|
|
131
|
+
if (event.type !== 'success') {
|
|
132
|
+
return (0, _rxjs.of)(event);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return (0, _rxjs.from)(updateAssetDocumentFromUpload(uuid)).pipe( // eslint-disable-next-line max-nested-callbacks
|
|
136
|
+
(0, _operators.mergeMap)(doc => (0, _rxjs.of)(_objectSpread(_objectSpread({}, event), {}, {
|
|
137
|
+
asset: doc
|
|
138
|
+
}))));
|
|
139
|
+
}), // eslint-disable-next-line max-nested-callbacks
|
|
140
|
+
(0, _operators.catchError)(err => {
|
|
141
|
+
// Delete asset document
|
|
142
|
+
return cancelUpload(uuid).pipe((0, _operators.mergeMapTo)((0, _rxjs.throwError)(err)));
|
|
143
|
+
}));
|
|
144
|
+
})));
|
|
145
|
+
})));
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function getUpload(assetId) {
|
|
150
|
+
return _SanityClient.default.request({
|
|
151
|
+
url: "/addons/mux/uploads/".concat(_SanityClient.default.clientConfig.dataset, "/").concat(assetId),
|
|
152
|
+
withCredentials: true,
|
|
153
|
+
method: 'GET'
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
var _default = {
|
|
158
|
+
uploadUrl,
|
|
159
|
+
uploadFile,
|
|
160
|
+
getUpload
|
|
161
|
+
};
|
|
162
|
+
exports.default = _default;
|
|
163
|
+
|
|
164
|
+
function pollUpload(uuid) {
|
|
165
|
+
var maxTries = 10;
|
|
166
|
+
var pollInterval;
|
|
167
|
+
var tries = 0;
|
|
168
|
+
var assetId;
|
|
169
|
+
var upload;
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
pollInterval = setInterval( /*#__PURE__*/_asyncToGenerator(function* () {
|
|
172
|
+
try {
|
|
173
|
+
upload = yield getUpload(uuid);
|
|
174
|
+
} catch (err) {
|
|
175
|
+
reject(err);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
assetId = upload && upload.data && upload.data.asset_id;
|
|
180
|
+
|
|
181
|
+
if (assetId) {
|
|
182
|
+
clearInterval(pollInterval);
|
|
183
|
+
resolve(upload);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (tries > maxTries) {
|
|
187
|
+
clearInterval(pollInterval);
|
|
188
|
+
reject(new Error('Upload did not finish'));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
tries++;
|
|
192
|
+
}), 2000);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function updateAssetDocumentFromUpload(_x) {
|
|
197
|
+
return _updateAssetDocumentFromUpload.apply(this, arguments);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function _updateAssetDocumentFromUpload() {
|
|
201
|
+
_updateAssetDocumentFromUpload = _asyncToGenerator(function* (uuid) {
|
|
202
|
+
var upload;
|
|
203
|
+
var asset;
|
|
204
|
+
|
|
205
|
+
try {
|
|
206
|
+
upload = yield pollUpload(uuid);
|
|
207
|
+
} catch (err) {
|
|
208
|
+
return Promise.reject(err);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
try {
|
|
212
|
+
asset = yield (0, _assets.getAsset)(upload.data.asset_id);
|
|
213
|
+
} catch (err) {
|
|
214
|
+
return Promise.reject(err);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
var doc = {
|
|
218
|
+
_id: uuid,
|
|
219
|
+
_type: 'mux.videoAsset',
|
|
220
|
+
status: asset.data.status,
|
|
221
|
+
data: asset.data,
|
|
222
|
+
assetId: asset.data.id,
|
|
223
|
+
playbackId: asset.data.playback_ids[0].id,
|
|
224
|
+
uploadId: upload.data.id
|
|
225
|
+
};
|
|
226
|
+
return _SanityClient.default.createOrReplace(doc).then(() => {
|
|
227
|
+
return doc;
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
return _updateAssetDocumentFromUpload.apply(this, arguments);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function testFile(file) {
|
|
234
|
+
if (typeof window !== 'undefined' && file instanceof window.File) {
|
|
235
|
+
var fileOptions = optionsFromFile(file);
|
|
236
|
+
return (0, _rxjs.of)(fileOptions);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return (0, _rxjs.throwError)(new Error('Invalid file'));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function testUrl(url) {
|
|
243
|
+
var error = new Error('Invalid URL');
|
|
244
|
+
|
|
245
|
+
if (!(0, _lodash.isString)(url)) {
|
|
246
|
+
return (0, _rxjs.throwError)(error);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
var parsed;
|
|
250
|
+
|
|
251
|
+
try {
|
|
252
|
+
parsed = new URL(url);
|
|
253
|
+
} catch (err) {
|
|
254
|
+
return (0, _rxjs.throwError)(error);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (parsed && !parsed.protocol.match(/http:|https:/)) {
|
|
258
|
+
return (0, _rxjs.throwError)(error);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return (0, _rxjs.of)(url);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function optionsFromFile(opts, file) {
|
|
265
|
+
if (typeof window === 'undefined' || !(file instanceof window.File)) {
|
|
266
|
+
return opts;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
var fileOpts = {
|
|
270
|
+
filename: opts.preserveFilename === false ? undefined : file.name,
|
|
271
|
+
contentType: file.type
|
|
272
|
+
};
|
|
273
|
+
return _objectSpread(_objectSpread({}, {
|
|
274
|
+
filename: opts.preserveFilename === false ? undefined : file.name,
|
|
275
|
+
contentType: file.type
|
|
276
|
+
}), {}, {
|
|
277
|
+
fileOpts
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/upload.js"],"names":["cancelUpload","uuid","client","observable","request","url","clientConfig","dataset","withCredentials","method","uploadUrl","options","testUrl","pipe","validUrl","type","json","status","Error","enableSignedUrls","muxBody","input","playback_policy","mp4_support","config","query","JSON","stringify","filename","split","slice","headers","result","asset","results","document","id","uploadFile","file","testFile","fileOptions","body","upload","event","updateAssetDocumentFromUpload","doc","err","getUpload","assetId","pollUpload","maxTries","pollInterval","tries","Promise","resolve","reject","setInterval","data","asset_id","clearInterval","_id","_type","playbackId","playback_ids","uploadId","createOrReplace","then","window","File","optionsFromFile","error","parsed","URL","protocol","match","opts","fileOpts","preserveFilename","undefined","name","contentType"],"mappings":";;;;;;;;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;AAEO,SAASA,YAAT,CAAsBC,IAAtB,EAA4B;AACjC,SAAOC,sBAAOC,UAAP,CAAkBC,OAAlB,CAA0B;AAC/BC,IAAAA,GAAG,gCAAyBH,sBAAOI,YAAP,CAAoBC,OAA7C,cAAwDN,IAAxD,CAD4B;AAE/BO,IAAAA,eAAe,EAAE,IAFc;AAG/BC,IAAAA,MAAM,EAAE;AAHuB,GAA1B,CAAP;AAKD;;AAEM,SAASC,SAAT,CAAmBL,GAAnB,EAAsC;AAAA,MAAdM,OAAc,uEAAJ,EAAI;AAC3C,SAAOC,OAAO,CAACP,GAAD,CAAP,CAAaQ,IAAb,CACL,0BAAWC,QAAD,IAAc;AACtB,WAAO,kBACL,cAAG;AAACC,MAAAA,IAAI,EAAE,KAAP;AAAcV,MAAAA,GAAG,EAAES;AAAnB,KAAH,CADK,EAEL,sCAAwBD,IAAxB,CACE,0BAAWG,IAAD,IAAU;AAClB,UAAI,CAACA,IAAD,IAAS,CAACA,IAAI,CAACC,MAAnB,EAA2B;AACzB,eAAO,sBAAW,IAAIC,KAAJ,CAAU,qBAAV,CAAX,CAAP;AACD;;AACD,UAAMjB,IAAI,GAAG,iBAAb;AACA,UAAOkB,gBAAP,GAA2BR,OAA3B,CAAOQ,gBAAP;AACA,UAAMC,OAAO,GAAG;AACdC,QAAAA,KAAK,EAAEP,QADO;AAEdQ,QAAAA,eAAe,EAAE,CAACH,gBAAgB,GAAG,QAAH,GAAc,QAA/B,CAFH;AAGdI,QAAAA,WAAW,EAAEC,gBAAOD;AAHN,OAAhB;AAKA,UAAME,KAAK,GAAG;AACZL,QAAAA,OAAO,EAAEM,IAAI,CAACC,SAAL,CAAeP,OAAf,CADG;AAEZQ,QAAAA,QAAQ,EAAEd,QAAQ,CAACe,KAAT,CAAe,GAAf,EAAoBC,KAApB,CAA0B,CAAC,CAA3B,EAA8B,CAA9B;AAFE,OAAd;AAKA,UAAMvB,OAAO,GAAGL,sBAAOI,YAAP,CAAoBC,OAApC;AACA,aAAO,iBAAM,MACXL,sBAAOC,UAAP,CAAkBC,OAAlB,CAA0B;AACxBC,QAAAA,GAAG,+BAAwBE,OAAxB,CADqB;AAExBC,QAAAA,eAAe,EAAE,IAFO;AAGxBC,QAAAA,MAAM,EAAE,MAHgB;AAIxBsB,QAAAA,OAAO,EAAE;AACP,4BAAkB9B,IADX;AAEP,0BAAgB;AAFT,SAJe;AAQxBwB,QAAAA;AARwB,OAA1B,CADK,EAWLZ,IAXK,CAYL,yBAAUmB,MAAD,IAAY;AACnB,YAAMC,KAAK,GACRD,MAAM,IAAIA,MAAM,CAACE,OAAjB,IAA4BF,MAAM,CAACE,OAAP,CAAe,CAAf,CAA5B,IAAiDF,MAAM,CAACE,OAAP,CAAe,CAAf,EAAkBC,QAApE,IACA,IAFF;;AAIA,YAAI,CAACF,KAAL,EAAY;AACV,iBAAO,sBAAW,IAAIf,KAAJ,CAAU,4BAAV,CAAX,CAAP;AACD;;AACD,eAAO,cAAG;AAACH,UAAAA,IAAI,EAAE,SAAP;AAAkBqB,UAAAA,EAAE,EAAEnC,IAAtB;AAA4BgC,UAAAA;AAA5B,SAAH,CAAP;AACD,OATD,CAZK,CAAP;AAuBD,KAxCD,CADF,CAFK,CAAP;AA8CD,GA/CD,CADK,CAAP;AAkDD;;AAEM,SAASI,UAAT,CAAoBC,IAApB,EAAwC;AAAA,MAAd3B,OAAc,uEAAJ,EAAI;AAC7C,SAAO4B,QAAQ,CAACD,IAAD,CAAR,CAAezB,IAAf,CACL,0BAAW2B,WAAD,IAAiB;AACzB,WAAO,kBACL,cAAG;AAACzB,MAAAA,IAAI,EAAE,MAAP;AAAeuB,MAAAA,IAAI,EAAEE;AAArB,KAAH,CADK,EAEL,sCAAwB3B,IAAxB,CACE,0BAAWG,IAAD,IAAU;AAClB,UAAI,CAACA,IAAD,IAAS,CAACA,IAAI,CAACC,MAAnB,EAA2B;AACzB,eAAO,sBAAW,IAAIC,KAAJ,CAAU,qBAAV,CAAX,CAAP;AACD;;AACD,UAAMjB,IAAI,GAAG,iBAAb;AACA,UAAOkB,gBAAP,GAA2BR,OAA3B,CAAOQ,gBAAP;AACA,UAAMsB,IAAI,GAAG;AACXlB,QAAAA,WAAW,EAAEC,gBAAOD,WADT;AAEXD,QAAAA,eAAe,EAAE,CAACH,gBAAgB,GAAG,QAAH,GAAc,QAA/B;AAFN,OAAb;AAKA,aAAO,kBACL,cAAG;AAACJ,QAAAA,IAAI,EAAE,MAAP;AAAed,QAAAA;AAAf,OAAH,CADK,EAEL,iBAAM,MACJC,sBAAOC,UAAP,CAAkBC,OAAlB,CAA0B;AACxBC,QAAAA,GAAG,gCAAyBH,sBAAOI,YAAP,CAAoBC,OAA7C,CADqB;AAExBC,QAAAA,eAAe,EAAE,IAFO;AAGxBC,QAAAA,MAAM,EAAE,MAHgB;AAIxBsB,QAAAA,OAAO,EAAE;AACP,4BAAkB9B,IADX;AAEP,0BAAgB;AAFT,SAJe;AAQxBwC,QAAAA;AARwB,OAA1B,CADF,EAWE5B,IAXF,CAYE,yBAAUmB,MAAD,IAAY;AACnB,eAAO,gDAAwB/B,IAAxB,EAA8B+B,MAAM,CAACU,MAAP,CAAcrC,GAA5C,EAAiDiC,IAAjD,EAAuDzB,IAAvD,EACL;AACA,iCAAU8B,KAAD,IAAW;AAClB,cAAIA,KAAK,CAAC5B,IAAN,KAAe,SAAnB,EAA8B;AAC5B,mBAAO,cAAG4B,KAAH,CAAP;AACD;;AACD,iBAAO,gBAAKC,6BAA6B,CAAC3C,IAAD,CAAlC,EAA0CY,IAA1C,EACL;AACA,mCAAUgC,GAAD,IAAS,8CAAOF,KAAP;AAAcV,YAAAA,KAAK,EAAEY;AAArB,aAAlB,CAFK,CAAP;AAID,SARD,CAFK,EAWL;AACA,mCAAYC,GAAD,IAAS;AAClB;AACA,iBAAO9C,YAAY,CAACC,IAAD,CAAZ,CAAmBY,IAAnB,CAAwB,2BAAW,sBAAWiC,GAAX,CAAX,CAAxB,CAAP;AACD,SAHD,CAZK,CAAP;AAiBD,OAlBD,CAZF,CAFK,CAAP;AAmCD,KA9CD,CADF,CAFK,CAAP;AAoDD,GArDD,CADK,CAAP;AAwDD;;AAEM,SAASC,SAAT,CAAmBC,OAAnB,EAA4B;AACjC,SAAO9C,sBAAOE,OAAP,CAAe;AACpBC,IAAAA,GAAG,gCAAyBH,sBAAOI,YAAP,CAAoBC,OAA7C,cAAwDyC,OAAxD,CADiB;AAEpBxC,IAAAA,eAAe,EAAE,IAFG;AAGpBC,IAAAA,MAAM,EAAE;AAHY,GAAf,CAAP;AAKD;;eAEc;AAACC,EAAAA,SAAD;AAAY2B,EAAAA,UAAZ;AAAwBU,EAAAA;AAAxB,C;;;AAEf,SAASE,UAAT,CAAoBhD,IAApB,EAA0B;AACxB,MAAMiD,QAAQ,GAAG,EAAjB;AACA,MAAIC,YAAJ;AACA,MAAIC,KAAK,GAAG,CAAZ;AACA,MAAIJ,OAAJ;AACA,MAAIN,MAAJ;AACA,SAAO,IAAIW,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtCJ,IAAAA,YAAY,GAAGK,WAAW,iCAAC,aAAY;AACrC,UAAI;AACFd,QAAAA,MAAM,SAASK,SAAS,CAAC9C,IAAD,CAAxB;AACD,OAFD,CAEE,OAAO6C,GAAP,EAAY;AACZS,QAAAA,MAAM,CAACT,GAAD,CAAN;AACA;AACD;;AACDE,MAAAA,OAAO,GAAGN,MAAM,IAAIA,MAAM,CAACe,IAAjB,IAAyBf,MAAM,CAACe,IAAP,CAAYC,QAA/C;;AACA,UAAIV,OAAJ,EAAa;AACXW,QAAAA,aAAa,CAACR,YAAD,CAAb;AACAG,QAAAA,OAAO,CAACZ,MAAD,CAAP;AACD;;AACD,UAAIU,KAAK,GAAGF,QAAZ,EAAsB;AACpBS,QAAAA,aAAa,CAACR,YAAD,CAAb;AACAI,QAAAA,MAAM,CAAC,IAAIrC,KAAJ,CAAU,uBAAV,CAAD,CAAN;AACD;;AACDkC,MAAAA,KAAK;AACN,KAjByB,GAiBvB,IAjBuB,CAA1B;AAkBD,GAnBM,CAAP;AAoBD;;SAEcR,6B;;;;;qDAAf,WAA6C3C,IAA7C,EAAmD;AACjD,QAAIyC,MAAJ;AACA,QAAIT,KAAJ;;AACA,QAAI;AACFS,MAAAA,MAAM,SAASO,UAAU,CAAChD,IAAD,CAAzB;AACD,KAFD,CAEE,OAAO6C,GAAP,EAAY;AACZ,aAAOO,OAAO,CAACE,MAAR,CAAeT,GAAf,CAAP;AACD;;AACD,QAAI;AACFb,MAAAA,KAAK,SAAS,sBAASS,MAAM,CAACe,IAAP,CAAYC,QAArB,CAAd;AACD,KAFD,CAEE,OAAOZ,GAAP,EAAY;AACZ,aAAOO,OAAO,CAACE,MAAR,CAAeT,GAAf,CAAP;AACD;;AAED,QAAMD,GAAG,GAAG;AACVe,MAAAA,GAAG,EAAE3D,IADK;AAEV4D,MAAAA,KAAK,EAAE,gBAFG;AAGV5C,MAAAA,MAAM,EAAEgB,KAAK,CAACwB,IAAN,CAAWxC,MAHT;AAIVwC,MAAAA,IAAI,EAAExB,KAAK,CAACwB,IAJF;AAKVT,MAAAA,OAAO,EAAEf,KAAK,CAACwB,IAAN,CAAWrB,EALV;AAMV0B,MAAAA,UAAU,EAAE7B,KAAK,CAACwB,IAAN,CAAWM,YAAX,CAAwB,CAAxB,EAA2B3B,EAN7B;AAOV4B,MAAAA,QAAQ,EAAEtB,MAAM,CAACe,IAAP,CAAYrB;AAPZ,KAAZ;AASA,WAAOlC,sBAAO+D,eAAP,CAAuBpB,GAAvB,EAA4BqB,IAA5B,CAAiC,MAAM;AAC5C,aAAOrB,GAAP;AACD,KAFM,CAAP;AAGD,G;;;;AAED,SAASN,QAAT,CAAkBD,IAAlB,EAAwB;AACtB,MAAI,OAAO6B,MAAP,KAAkB,WAAlB,IAAiC7B,IAAI,YAAY6B,MAAM,CAACC,IAA5D,EAAkE;AAChE,QAAM5B,WAAW,GAAG6B,eAAe,CAAC/B,IAAD,CAAnC;AACA,WAAO,cAAGE,WAAH,CAAP;AACD;;AACD,SAAO,sBAAW,IAAItB,KAAJ,CAAU,cAAV,CAAX,CAAP;AACD;;AAED,SAASN,OAAT,CAAiBP,GAAjB,EAAsB;AACpB,MAAMiE,KAAK,GAAG,IAAIpD,KAAJ,CAAU,aAAV,CAAd;;AACA,MAAI,CAAC,sBAASb,GAAT,CAAL,EAAoB;AAClB,WAAO,sBAAWiE,KAAX,CAAP;AACD;;AACD,MAAIC,MAAJ;;AACA,MAAI;AACFA,IAAAA,MAAM,GAAG,IAAIC,GAAJ,CAAQnE,GAAR,CAAT;AACD,GAFD,CAEE,OAAOyC,GAAP,EAAY;AACZ,WAAO,sBAAWwB,KAAX,CAAP;AACD;;AACD,MAAIC,MAAM,IAAI,CAACA,MAAM,CAACE,QAAP,CAAgBC,KAAhB,CAAsB,cAAtB,CAAf,EAAsD;AACpD,WAAO,sBAAWJ,KAAX,CAAP;AACD;;AACD,SAAO,cAAGjE,GAAH,CAAP;AACD;;AAED,SAASgE,eAAT,CAAyBM,IAAzB,EAA+BrC,IAA/B,EAAqC;AACnC,MAAI,OAAO6B,MAAP,KAAkB,WAAlB,IAAiC,EAAE7B,IAAI,YAAY6B,MAAM,CAACC,IAAzB,CAArC,EAAqE;AACnE,WAAOO,IAAP;AACD;;AACD,MAAMC,QAAQ,GAAG;AACfhD,IAAAA,QAAQ,EAAE+C,IAAI,CAACE,gBAAL,KAA0B,KAA1B,GAAkCC,SAAlC,GAA8CxC,IAAI,CAACyC,IAD9C;AAEfC,IAAAA,WAAW,EAAE1C,IAAI,CAACvB;AAFH,GAAjB;AAKA,yCACK;AACDa,IAAAA,QAAQ,EAAE+C,IAAI,CAACE,gBAAL,KAA0B,KAA1B,GAAkCC,SAAlC,GAA8CxC,IAAI,CAACyC,IAD5D;AAEDC,IAAAA,WAAW,EAAE1C,IAAI,CAACvB;AAFjB,GADL;AAKE6D,IAAAA;AALF;AAOD","sourcesContent":["/* eslint-disable camelcase */\r\nimport {uuid as generateUuid} from '@sanity/uuid'\r\nimport config from '../config'\r\nimport {isString} from 'lodash'\r\nimport {concat, defer, from, of, throwError} from 'rxjs'\r\nimport {catchError, mergeMap, mergeMapTo, switchMap} from 'rxjs/operators'\r\nimport {getAsset} from '../actions/assets'\r\nimport {testSecretsObservable} from '../actions/secrets'\r\nimport client from '../clients/SanityClient'\r\nimport {createUpChunkObservable} from '../clients/upChunkObservable'\r\n\r\nexport function cancelUpload(uuid) {\r\n return client.observable.request({\r\n url: `/addons/mux/uploads/${client.clientConfig.dataset}/${uuid}`,\r\n withCredentials: true,\r\n method: 'DELETE',\r\n })\r\n}\r\n\r\nexport function uploadUrl(url, options = {}) {\r\n return testUrl(url).pipe(\r\n switchMap((validUrl) => {\r\n return concat(\r\n of({type: 'url', url: validUrl}),\r\n testSecretsObservable().pipe(\r\n switchMap((json) => {\r\n if (!json || !json.status) {\r\n return throwError(new Error('Invalid credentials'))\r\n }\r\n const uuid = generateUuid()\r\n const {enableSignedUrls} = options\r\n const muxBody = {\r\n input: validUrl,\r\n playback_policy: [enableSignedUrls ? 'signed' : 'public'],\r\n mp4_support: config.mp4_support,\r\n }\r\n const query = {\r\n muxBody: JSON.stringify(muxBody),\r\n filename: validUrl.split('/').slice(-1)[0],\r\n }\r\n\r\n const dataset = client.clientConfig.dataset\r\n return defer(() =>\r\n client.observable.request({\r\n url: `/addons/mux/assets/${dataset}`,\r\n withCredentials: true,\r\n method: 'POST',\r\n headers: {\r\n 'MUX-Proxy-UUID': uuid,\r\n 'Content-Type': 'application/json',\r\n },\r\n query,\r\n })\r\n ).pipe(\r\n mergeMap((result) => {\r\n const asset =\r\n (result && result.results && result.results[0] && result.results[0].document) ||\r\n null\r\n\r\n if (!asset) {\r\n return throwError(new Error('No asset document returned'))\r\n }\r\n return of({type: 'success', id: uuid, asset})\r\n })\r\n )\r\n })\r\n )\r\n )\r\n })\r\n )\r\n}\r\n\r\nexport function uploadFile(file, options = {}) {\r\n return testFile(file).pipe(\r\n switchMap((fileOptions) => {\r\n return concat(\r\n of({type: 'file', file: fileOptions}),\r\n testSecretsObservable().pipe(\r\n switchMap((json) => {\r\n if (!json || !json.status) {\r\n return throwError(new Error('Invalid credentials'))\r\n }\r\n const uuid = generateUuid()\r\n const {enableSignedUrls} = options\r\n const body = {\r\n mp4_support: config.mp4_support,\r\n playback_policy: [enableSignedUrls ? 'signed' : 'public'],\r\n }\r\n\r\n return concat(\r\n of({type: 'uuid', uuid}),\r\n defer(() =>\r\n client.observable.request({\r\n url: `/addons/mux/uploads/${client.clientConfig.dataset}`,\r\n withCredentials: true,\r\n method: 'POST',\r\n headers: {\r\n 'MUX-Proxy-UUID': uuid,\r\n 'Content-Type': 'application/json',\r\n },\r\n body,\r\n })\r\n ).pipe(\r\n mergeMap((result) => {\r\n return createUpChunkObservable(uuid, result.upload.url, file).pipe(\r\n // eslint-disable-next-line max-nested-callbacks\r\n mergeMap((event) => {\r\n if (event.type !== 'success') {\r\n return of(event)\r\n }\r\n return from(updateAssetDocumentFromUpload(uuid)).pipe(\r\n // eslint-disable-next-line max-nested-callbacks\r\n mergeMap((doc) => of({...event, asset: doc}))\r\n )\r\n }),\r\n // eslint-disable-next-line max-nested-callbacks\r\n catchError((err) => {\r\n // Delete asset document\r\n return cancelUpload(uuid).pipe(mergeMapTo(throwError(err)))\r\n })\r\n )\r\n })\r\n )\r\n )\r\n })\r\n )\r\n )\r\n })\r\n )\r\n}\r\n\r\nexport function getUpload(assetId) {\r\n return client.request({\r\n url: `/addons/mux/uploads/${client.clientConfig.dataset}/${assetId}`,\r\n withCredentials: true,\r\n method: 'GET',\r\n })\r\n}\r\n\r\nexport default {uploadUrl, uploadFile, getUpload}\r\n\r\nfunction pollUpload(uuid) {\r\n const maxTries = 10\r\n let pollInterval\r\n let tries = 0\r\n let assetId\r\n let upload\r\n return new Promise((resolve, reject) => {\r\n pollInterval = setInterval(async () => {\r\n try {\r\n upload = await getUpload(uuid)\r\n } catch (err) {\r\n reject(err)\r\n return\r\n }\r\n assetId = upload && upload.data && upload.data.asset_id\r\n if (assetId) {\r\n clearInterval(pollInterval)\r\n resolve(upload)\r\n }\r\n if (tries > maxTries) {\r\n clearInterval(pollInterval)\r\n reject(new Error('Upload did not finish'))\r\n }\r\n tries++\r\n }, 2000)\r\n })\r\n}\r\n\r\nasync function updateAssetDocumentFromUpload(uuid) {\r\n let upload\r\n let asset\r\n try {\r\n upload = await pollUpload(uuid)\r\n } catch (err) {\r\n return Promise.reject(err)\r\n }\r\n try {\r\n asset = await getAsset(upload.data.asset_id)\r\n } catch (err) {\r\n return Promise.reject(err)\r\n }\r\n\r\n const doc = {\r\n _id: uuid,\r\n _type: 'mux.videoAsset',\r\n status: asset.data.status,\r\n data: asset.data,\r\n assetId: asset.data.id,\r\n playbackId: asset.data.playback_ids[0].id,\r\n uploadId: upload.data.id,\r\n }\r\n return client.createOrReplace(doc).then(() => {\r\n return doc\r\n })\r\n}\r\n\r\nfunction testFile(file) {\r\n if (typeof window !== 'undefined' && file instanceof window.File) {\r\n const fileOptions = optionsFromFile(file)\r\n return of(fileOptions)\r\n }\r\n return throwError(new Error('Invalid file'))\r\n}\r\n\r\nfunction testUrl(url) {\r\n const error = new Error('Invalid URL')\r\n if (!isString(url)) {\r\n return throwError(error)\r\n }\r\n let parsed\r\n try {\r\n parsed = new URL(url)\r\n } catch (err) {\r\n return throwError(error)\r\n }\r\n if (parsed && !parsed.protocol.match(/http:|https:/)) {\r\n return throwError(error)\r\n }\r\n return of(url)\r\n}\r\n\r\nfunction optionsFromFile(opts, file) {\r\n if (typeof window === 'undefined' || !(file instanceof window.File)) {\r\n return opts\r\n }\r\n const fileOpts = {\r\n filename: opts.preserveFilename === false ? undefined : file.name,\r\n contentType: file.type,\r\n }\r\n\r\n return {\r\n ...{\r\n filename: opts.preserveFilename === false ? undefined : file.name,\r\n contentType: file.type,\r\n },\r\n fileOpts,\r\n }\r\n}\r\n"],"file":"upload.js"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.client = void 0;
|
|
7
|
+
|
|
8
|
+
var _client = _interopRequireDefault(require("part:@sanity/base/client"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
var isContentLakeSupported = typeof _client.default.withConfig === 'function';
|
|
13
|
+
var client = isContentLakeSupported ? _client.default.withConfig({
|
|
14
|
+
apiVersion: '2021-05-17'
|
|
15
|
+
}) : _client.default;
|
|
16
|
+
exports.client = client;
|
|
17
|
+
var _default = client;
|
|
18
|
+
exports.default = _default;
|
|
19
|
+
//# sourceMappingURL=SanityClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/clients/SanityClient.js"],"names":["isContentLakeSupported","sanityClient","withConfig","client","apiVersion"],"mappings":";;;;;;;AAAA;;;;AAEA,IAAMA,sBAAsB,GAAG,OAAOC,gBAAaC,UAApB,KAAmC,UAAlE;AAEO,IAAMC,MAAM,GAAGH,sBAAsB,GACxCC,gBAAaC,UAAb,CAAwB;AAACE,EAAAA,UAAU,EAAE;AAAb,CAAxB,CADwC,GAExCH,eAFG;;eAIQE,M","sourcesContent":["import sanityClient from 'part:@sanity/base/client'\r\n\r\nconst isContentLakeSupported = typeof sanityClient.withConfig === 'function'\r\n\r\nexport const client = isContentLakeSupported\r\n ? sanityClient.withConfig({apiVersion: '2021-05-17'})\r\n : sanityClient\r\n\r\nexport default client\r\n"],"file":"SanityClient.js"}
|