bare-media 1.0.0 → 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/README.md +6 -3
- package/client/index.js +0 -1
- package/package.json +2 -1
- package/shared/spec/build.js +0 -6
- package/shared/spec/hrpc/hrpc.json +2 -15
- package/shared/spec/hrpc/index.js +2 -14
- package/shared/spec/hrpc/messages.js +39 -171
- package/shared/spec/schema/index.js +39 -171
- package/shared/spec/schema/schema.json +7 -108
- package/shared/spec/schema.js +2 -75
- package/worker/index.js +0 -1
- package/worker/media.js +30 -40
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ You can also call the utilities directly without using a worker:
|
|
|
45
45
|
```js
|
|
46
46
|
import { createPreview } from 'bare-media/worker/media.js'
|
|
47
47
|
|
|
48
|
-
const data = await
|
|
48
|
+
const data = await createPreview({ path, maxWidth, maxHeight })
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
## API
|
|
@@ -53,7 +53,10 @@ const data = await worker.createPreview({ path, maxWidth, maxHeight })
|
|
|
53
53
|
| Method | Parameters | Return Value | Description
|
|
54
54
|
|---------------------|---------------------------------------------------------|---------------------|----------------------------------------
|
|
55
55
|
| `createPreview` | `path, mimetype, maxWidth, maxHeight, format, encoding` | `metadata, preview` | Create a preview from a media file
|
|
56
|
-
| `
|
|
57
|
-
| `decodeImage` | `httpLink, mimetype` | `metadata, data` | Decode an image to RGBA
|
|
56
|
+
| `decodeImage` | `path`, `httpLink, mimetype` | `metadata, data` | Decode an image to RGBA
|
|
58
57
|
|
|
59
58
|
> See [schema.js](shared/spec/schema.js) for the complete reference of parameters
|
|
59
|
+
|
|
60
|
+
## License
|
|
61
|
+
|
|
62
|
+
Apache-2.0
|
package/client/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bare-media",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"bare-tiff": "^1.0.1",
|
|
25
25
|
"bare-webp": "^1.0.3",
|
|
26
26
|
"cross-worker": "^1.0.0",
|
|
27
|
+
"get-mime-type": "^2.0.1",
|
|
27
28
|
"hrpc": "^4.0.0",
|
|
28
29
|
"hyperschema": "^1.12.3",
|
|
29
30
|
"uncaughts": "^1.1.1"
|
package/shared/spec/build.js
CHANGED
|
@@ -19,12 +19,6 @@ ns.register({
|
|
|
19
19
|
response: { name: '@media/create-preview-response', stream: false }
|
|
20
20
|
})
|
|
21
21
|
|
|
22
|
-
ns.register({
|
|
23
|
-
name: 'create-preview-all',
|
|
24
|
-
request: { name: '@media/create-preview-all-request', stream: false },
|
|
25
|
-
response: { name: '@media/create-preview-all-response', stream: false }
|
|
26
|
-
})
|
|
27
|
-
|
|
28
22
|
ns.register({
|
|
29
23
|
name: 'decode-image',
|
|
30
24
|
request: { name: '@media/decode-image-request', stream: false },
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version":
|
|
2
|
+
"version": 1,
|
|
3
3
|
"schema": [
|
|
4
4
|
{
|
|
5
5
|
"id": 0,
|
|
@@ -16,19 +16,6 @@
|
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"id": 1,
|
|
19
|
-
"name": "@media/create-preview-all",
|
|
20
|
-
"request": {
|
|
21
|
-
"name": "@media/create-preview-all-request",
|
|
22
|
-
"stream": false
|
|
23
|
-
},
|
|
24
|
-
"response": {
|
|
25
|
-
"name": "@media/create-preview-all-response",
|
|
26
|
-
"stream": false
|
|
27
|
-
},
|
|
28
|
-
"version": 1
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"id": 2,
|
|
32
19
|
"name": "@media/decode-image",
|
|
33
20
|
"request": {
|
|
34
21
|
"name": "@media/decode-image-request",
|
|
@@ -38,7 +25,7 @@
|
|
|
38
25
|
"name": "@media/decode-image-response",
|
|
39
26
|
"stream": false
|
|
40
27
|
},
|
|
41
|
-
"version":
|
|
28
|
+
"version": 1
|
|
42
29
|
}
|
|
43
30
|
]
|
|
44
31
|
}
|
|
@@ -7,10 +7,8 @@ import { getEncoding } from './messages.js'
|
|
|
7
7
|
const methods = new Map([
|
|
8
8
|
['@media/create-preview', 0],
|
|
9
9
|
[0, '@media/create-preview'],
|
|
10
|
-
['@media/
|
|
11
|
-
[1, '@media/
|
|
12
|
-
['@media/decode-image', 2],
|
|
13
|
-
[2, '@media/decode-image']
|
|
10
|
+
['@media/decode-image', 1],
|
|
11
|
+
[1, '@media/decode-image']
|
|
14
12
|
])
|
|
15
13
|
|
|
16
14
|
class HRPC {
|
|
@@ -19,12 +17,10 @@ class HRPC {
|
|
|
19
17
|
this._handlers = []
|
|
20
18
|
this._requestEncodings = new Map([
|
|
21
19
|
['@media/create-preview', getEncoding('@media/create-preview-request')],
|
|
22
|
-
['@media/create-preview-all', getEncoding('@media/create-preview-all-request')],
|
|
23
20
|
['@media/decode-image', getEncoding('@media/decode-image-request')]
|
|
24
21
|
])
|
|
25
22
|
this._responseEncodings = new Map([
|
|
26
23
|
['@media/create-preview', getEncoding('@media/create-preview-response')],
|
|
27
|
-
['@media/create-preview-all', getEncoding('@media/create-preview-all-response')],
|
|
28
24
|
['@media/decode-image', getEncoding('@media/decode-image-response')]
|
|
29
25
|
])
|
|
30
26
|
this._rpc = new RPC(stream, async (req) => {
|
|
@@ -93,10 +89,6 @@ class HRPC {
|
|
|
93
89
|
return this._call('@media/create-preview', args)
|
|
94
90
|
}
|
|
95
91
|
|
|
96
|
-
async createPreviewAll (args) {
|
|
97
|
-
return this._call('@media/create-preview-all', args)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
92
|
async decodeImage (args) {
|
|
101
93
|
return this._call('@media/decode-image', args)
|
|
102
94
|
}
|
|
@@ -105,10 +97,6 @@ class HRPC {
|
|
|
105
97
|
this._handlers['@media/create-preview'] = responseFn
|
|
106
98
|
}
|
|
107
99
|
|
|
108
|
-
onCreatePreviewAll (responseFn) {
|
|
109
|
-
this._handlers['@media/create-preview-all'] = responseFn
|
|
110
|
-
}
|
|
111
|
-
|
|
112
100
|
onDecodeImage (responseFn) {
|
|
113
101
|
this._handlers['@media/decode-image'] = responseFn
|
|
114
102
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// This file is autogenerated by the hyperschema compiler
|
|
2
|
-
// Schema Version:
|
|
2
|
+
// Schema Version: 1
|
|
3
3
|
/* eslint-disable camelcase */
|
|
4
4
|
/* eslint-disable quotes */
|
|
5
5
|
|
|
6
6
|
import { c } from 'hyperschema/runtime'
|
|
7
7
|
|
|
8
|
-
const VERSION =
|
|
8
|
+
const VERSION = 1
|
|
9
9
|
|
|
10
10
|
// eslint-disable-next-line no-unused-vars
|
|
11
11
|
let version = VERSION
|
|
@@ -101,72 +101,8 @@ const encoding2 = {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
// @media/preview-by-size.small
|
|
105
|
-
const encoding3_0 = c.frame(encoding2)
|
|
106
|
-
// @media/preview-by-size.medium
|
|
107
|
-
const encoding3_1 = encoding3_0
|
|
108
|
-
// @media/preview-by-size.large
|
|
109
|
-
const encoding3_2 = encoding3_0
|
|
110
|
-
|
|
111
|
-
// @media/preview-by-size
|
|
112
|
-
const encoding3 = {
|
|
113
|
-
preencode (state, m) {
|
|
114
|
-
state.end++ // max flag is 4 so always one byte
|
|
115
|
-
|
|
116
|
-
if (m.small) encoding3_0.preencode(state, m.small)
|
|
117
|
-
if (m.medium) encoding3_1.preencode(state, m.medium)
|
|
118
|
-
if (m.large) encoding3_2.preencode(state, m.large)
|
|
119
|
-
},
|
|
120
|
-
encode (state, m) {
|
|
121
|
-
const flags =
|
|
122
|
-
(m.small ? 1 : 0) |
|
|
123
|
-
(m.medium ? 2 : 0) |
|
|
124
|
-
(m.large ? 4 : 0)
|
|
125
|
-
|
|
126
|
-
c.uint.encode(state, flags)
|
|
127
|
-
|
|
128
|
-
if (m.small) encoding3_0.encode(state, m.small)
|
|
129
|
-
if (m.medium) encoding3_1.encode(state, m.medium)
|
|
130
|
-
if (m.large) encoding3_2.encode(state, m.large)
|
|
131
|
-
},
|
|
132
|
-
decode (state) {
|
|
133
|
-
const flags = c.uint.decode(state)
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
small: (flags & 1) !== 0 ? encoding3_0.decode(state) : null,
|
|
137
|
-
medium: (flags & 2) !== 0 ? encoding3_1.decode(state) : null,
|
|
138
|
-
large: (flags & 4) !== 0 ? encoding3_2.decode(state) : null
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// @media/sizePreview
|
|
144
|
-
const encoding4 = {
|
|
145
|
-
preencode (state, m) {
|
|
146
|
-
c.uint.preencode(state, m.small)
|
|
147
|
-
c.uint.preencode(state, m.medium)
|
|
148
|
-
c.uint.preencode(state, m.large)
|
|
149
|
-
},
|
|
150
|
-
encode (state, m) {
|
|
151
|
-
c.uint.encode(state, m.small)
|
|
152
|
-
c.uint.encode(state, m.medium)
|
|
153
|
-
c.uint.encode(state, m.large)
|
|
154
|
-
},
|
|
155
|
-
decode (state) {
|
|
156
|
-
const r0 = c.uint.decode(state)
|
|
157
|
-
const r1 = c.uint.decode(state)
|
|
158
|
-
const r2 = c.uint.decode(state)
|
|
159
|
-
|
|
160
|
-
return {
|
|
161
|
-
small: r0,
|
|
162
|
-
medium: r1,
|
|
163
|
-
large: r2
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
104
|
// @media/create-preview-request
|
|
169
|
-
const
|
|
105
|
+
const encoding3 = {
|
|
170
106
|
preencode (state, m) {
|
|
171
107
|
c.string.preencode(state, m.path)
|
|
172
108
|
state.end++ // max flag is 16 so always one byte
|
|
@@ -210,23 +146,23 @@ const encoding5 = {
|
|
|
210
146
|
}
|
|
211
147
|
|
|
212
148
|
// @media/create-preview-response.metadata
|
|
213
|
-
const
|
|
149
|
+
const encoding4_0 = encoding2_0
|
|
214
150
|
// @media/create-preview-response.preview
|
|
215
|
-
const
|
|
151
|
+
const encoding4_1 = c.frame(encoding2)
|
|
216
152
|
|
|
217
153
|
// @media/create-preview-response
|
|
218
|
-
const
|
|
154
|
+
const encoding4 = {
|
|
219
155
|
preencode (state, m) {
|
|
220
|
-
|
|
221
|
-
|
|
156
|
+
encoding4_0.preencode(state, m.metadata)
|
|
157
|
+
encoding4_1.preencode(state, m.preview)
|
|
222
158
|
},
|
|
223
159
|
encode (state, m) {
|
|
224
|
-
|
|
225
|
-
|
|
160
|
+
encoding4_0.encode(state, m.metadata)
|
|
161
|
+
encoding4_1.encode(state, m.preview)
|
|
226
162
|
},
|
|
227
163
|
decode (state) {
|
|
228
|
-
const r0 =
|
|
229
|
-
const r1 =
|
|
164
|
+
const r0 = encoding4_0.decode(state)
|
|
165
|
+
const r1 = encoding4_1.decode(state)
|
|
230
166
|
|
|
231
167
|
return {
|
|
232
168
|
metadata: r0,
|
|
@@ -235,129 +171,65 @@ const encoding6 = {
|
|
|
235
171
|
}
|
|
236
172
|
}
|
|
237
173
|
|
|
238
|
-
// @media/
|
|
239
|
-
const
|
|
240
|
-
// @media/create-preview-all-request.maxHeight
|
|
241
|
-
const encoding7_3 = encoding7_2
|
|
242
|
-
|
|
243
|
-
// @media/create-preview-all-request
|
|
244
|
-
const encoding7 = {
|
|
174
|
+
// @media/decode-image-request
|
|
175
|
+
const encoding5 = {
|
|
245
176
|
preencode (state, m) {
|
|
246
|
-
|
|
247
|
-
state.end++ // max flag is 2 so always one byte
|
|
177
|
+
state.end++ // max flag is 4 so always one byte
|
|
248
178
|
|
|
179
|
+
if (m.path) c.string.preencode(state, m.path)
|
|
180
|
+
if (m.httpLink) c.string.preencode(state, m.httpLink)
|
|
249
181
|
if (m.mimetype) c.string.preencode(state, m.mimetype)
|
|
250
|
-
encoding7_2.preencode(state, m.maxWidth)
|
|
251
|
-
encoding7_3.preencode(state, m.maxHeight)
|
|
252
|
-
if (m.format) c.string.preencode(state, m.format)
|
|
253
182
|
},
|
|
254
183
|
encode (state, m) {
|
|
255
184
|
const flags =
|
|
256
|
-
(m.
|
|
257
|
-
(m.
|
|
185
|
+
(m.path ? 1 : 0) |
|
|
186
|
+
(m.httpLink ? 2 : 0) |
|
|
187
|
+
(m.mimetype ? 4 : 0)
|
|
258
188
|
|
|
259
|
-
c.string.encode(state, m.path)
|
|
260
189
|
c.uint.encode(state, flags)
|
|
261
190
|
|
|
191
|
+
if (m.path) c.string.encode(state, m.path)
|
|
192
|
+
if (m.httpLink) c.string.encode(state, m.httpLink)
|
|
262
193
|
if (m.mimetype) c.string.encode(state, m.mimetype)
|
|
263
|
-
encoding7_2.encode(state, m.maxWidth)
|
|
264
|
-
encoding7_3.encode(state, m.maxHeight)
|
|
265
|
-
if (m.format) c.string.encode(state, m.format)
|
|
266
194
|
},
|
|
267
195
|
decode (state) {
|
|
268
|
-
const r0 = c.string.decode(state)
|
|
269
196
|
const flags = c.uint.decode(state)
|
|
270
197
|
|
|
271
198
|
return {
|
|
272
|
-
path:
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
maxHeight: encoding7_3.decode(state),
|
|
276
|
-
format: (flags & 2) !== 0 ? c.string.decode(state) : null
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// @media/create-preview-all-response.metadata
|
|
282
|
-
const encoding8_0 = encoding2_0
|
|
283
|
-
// @media/create-preview-all-response.preview
|
|
284
|
-
const encoding8_1 = c.frame(encoding3)
|
|
285
|
-
|
|
286
|
-
// @media/create-preview-all-response
|
|
287
|
-
const encoding8 = {
|
|
288
|
-
preencode (state, m) {
|
|
289
|
-
encoding8_0.preencode(state, m.metadata)
|
|
290
|
-
encoding8_1.preencode(state, m.preview)
|
|
291
|
-
},
|
|
292
|
-
encode (state, m) {
|
|
293
|
-
encoding8_0.encode(state, m.metadata)
|
|
294
|
-
encoding8_1.encode(state, m.preview)
|
|
295
|
-
},
|
|
296
|
-
decode (state) {
|
|
297
|
-
const r0 = encoding8_0.decode(state)
|
|
298
|
-
const r1 = encoding8_1.decode(state)
|
|
299
|
-
|
|
300
|
-
return {
|
|
301
|
-
metadata: r0,
|
|
302
|
-
preview: r1
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// @media/decode-image-request
|
|
308
|
-
const encoding9 = {
|
|
309
|
-
preencode (state, m) {
|
|
310
|
-
c.string.preencode(state, m.httpLink)
|
|
311
|
-
state.end++ // max flag is 1 so always one byte
|
|
312
|
-
|
|
313
|
-
if (version >= 2 && m.mimetype) c.string.preencode(state, m.mimetype)
|
|
314
|
-
},
|
|
315
|
-
encode (state, m) {
|
|
316
|
-
const flags = (version >= 2 && m.mimetype) ? 1 : 0
|
|
317
|
-
|
|
318
|
-
c.string.encode(state, m.httpLink)
|
|
319
|
-
c.uint.encode(state, flags)
|
|
320
|
-
|
|
321
|
-
if (version >= 2 && m.mimetype) c.string.encode(state, m.mimetype)
|
|
322
|
-
},
|
|
323
|
-
decode (state) {
|
|
324
|
-
const r0 = c.string.decode(state)
|
|
325
|
-
const flags = c.uint.decode(state)
|
|
326
|
-
|
|
327
|
-
return {
|
|
328
|
-
httpLink: r0,
|
|
329
|
-
mimetype: (version >= 2 && (flags & 1) !== 0) ? c.string.decode(state) : null
|
|
199
|
+
path: (flags & 1) !== 0 ? c.string.decode(state) : null,
|
|
200
|
+
httpLink: (flags & 2) !== 0 ? c.string.decode(state) : null,
|
|
201
|
+
mimetype: (flags & 4) !== 0 ? c.string.decode(state) : null
|
|
330
202
|
}
|
|
331
203
|
}
|
|
332
204
|
}
|
|
333
205
|
|
|
334
206
|
// @media/decode-image-response.metadata
|
|
335
|
-
const
|
|
207
|
+
const encoding6_0 = encoding2_0
|
|
336
208
|
|
|
337
209
|
// @media/decode-image-response
|
|
338
|
-
const
|
|
210
|
+
const encoding6 = {
|
|
339
211
|
preencode (state, m) {
|
|
340
212
|
state.end++ // max flag is 2 so always one byte
|
|
341
213
|
|
|
342
|
-
if (
|
|
343
|
-
if (
|
|
214
|
+
if (m.metadata) encoding6_0.preencode(state, m.metadata)
|
|
215
|
+
if (m.data) c.buffer.preencode(state, m.data)
|
|
344
216
|
},
|
|
345
217
|
encode (state, m) {
|
|
346
218
|
const flags =
|
|
347
|
-
(
|
|
348
|
-
(
|
|
219
|
+
(m.metadata ? 1 : 0) |
|
|
220
|
+
(m.data ? 2 : 0)
|
|
349
221
|
|
|
350
222
|
c.uint.encode(state, flags)
|
|
351
223
|
|
|
352
|
-
if (
|
|
353
|
-
if (
|
|
224
|
+
if (m.metadata) encoding6_0.encode(state, m.metadata)
|
|
225
|
+
if (m.data) c.buffer.encode(state, m.data)
|
|
354
226
|
},
|
|
355
227
|
decode (state) {
|
|
356
228
|
const flags = c.uint.decode(state)
|
|
357
229
|
|
|
358
230
|
return {
|
|
359
|
-
metadata: (
|
|
360
|
-
data: (
|
|
231
|
+
metadata: (flags & 1) !== 0 ? encoding6_0.decode(state) : null,
|
|
232
|
+
data: (flags & 2) !== 0 ? c.buffer.decode(state) : null
|
|
361
233
|
}
|
|
362
234
|
}
|
|
363
235
|
}
|
|
@@ -387,14 +259,10 @@ function getEncoding (name) {
|
|
|
387
259
|
case '@media/dimensions': return encoding0
|
|
388
260
|
case '@media/metadata': return encoding1
|
|
389
261
|
case '@media/file': return encoding2
|
|
390
|
-
case '@media/preview-
|
|
391
|
-
case '@media/
|
|
392
|
-
case '@media/
|
|
393
|
-
case '@media/
|
|
394
|
-
case '@media/create-preview-all-request': return encoding7
|
|
395
|
-
case '@media/create-preview-all-response': return encoding8
|
|
396
|
-
case '@media/decode-image-request': return encoding9
|
|
397
|
-
case '@media/decode-image-response': return encoding10
|
|
262
|
+
case '@media/create-preview-request': return encoding3
|
|
263
|
+
case '@media/create-preview-response': return encoding4
|
|
264
|
+
case '@media/decode-image-request': return encoding5
|
|
265
|
+
case '@media/decode-image-response': return encoding6
|
|
398
266
|
default: throw new Error('Encoder not found ' + name)
|
|
399
267
|
}
|
|
400
268
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// This file is autogenerated by the hyperschema compiler
|
|
2
|
-
// Schema Version:
|
|
2
|
+
// Schema Version: 1
|
|
3
3
|
/* eslint-disable camelcase */
|
|
4
4
|
/* eslint-disable quotes */
|
|
5
5
|
|
|
6
6
|
import { c } from 'hyperschema/runtime'
|
|
7
7
|
|
|
8
|
-
const VERSION =
|
|
8
|
+
const VERSION = 1
|
|
9
9
|
|
|
10
10
|
// eslint-disable-next-line no-unused-vars
|
|
11
11
|
let version = VERSION
|
|
@@ -101,72 +101,8 @@ const encoding2 = {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
// @media/preview-by-size.small
|
|
105
|
-
const encoding3_0 = c.frame(encoding2)
|
|
106
|
-
// @media/preview-by-size.medium
|
|
107
|
-
const encoding3_1 = encoding3_0
|
|
108
|
-
// @media/preview-by-size.large
|
|
109
|
-
const encoding3_2 = encoding3_0
|
|
110
|
-
|
|
111
|
-
// @media/preview-by-size
|
|
112
|
-
const encoding3 = {
|
|
113
|
-
preencode (state, m) {
|
|
114
|
-
state.end++ // max flag is 4 so always one byte
|
|
115
|
-
|
|
116
|
-
if (m.small) encoding3_0.preencode(state, m.small)
|
|
117
|
-
if (m.medium) encoding3_1.preencode(state, m.medium)
|
|
118
|
-
if (m.large) encoding3_2.preencode(state, m.large)
|
|
119
|
-
},
|
|
120
|
-
encode (state, m) {
|
|
121
|
-
const flags =
|
|
122
|
-
(m.small ? 1 : 0) |
|
|
123
|
-
(m.medium ? 2 : 0) |
|
|
124
|
-
(m.large ? 4 : 0)
|
|
125
|
-
|
|
126
|
-
c.uint.encode(state, flags)
|
|
127
|
-
|
|
128
|
-
if (m.small) encoding3_0.encode(state, m.small)
|
|
129
|
-
if (m.medium) encoding3_1.encode(state, m.medium)
|
|
130
|
-
if (m.large) encoding3_2.encode(state, m.large)
|
|
131
|
-
},
|
|
132
|
-
decode (state) {
|
|
133
|
-
const flags = c.uint.decode(state)
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
small: (flags & 1) !== 0 ? encoding3_0.decode(state) : null,
|
|
137
|
-
medium: (flags & 2) !== 0 ? encoding3_1.decode(state) : null,
|
|
138
|
-
large: (flags & 4) !== 0 ? encoding3_2.decode(state) : null
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// @media/sizePreview
|
|
144
|
-
const encoding4 = {
|
|
145
|
-
preencode (state, m) {
|
|
146
|
-
c.uint.preencode(state, m.small)
|
|
147
|
-
c.uint.preencode(state, m.medium)
|
|
148
|
-
c.uint.preencode(state, m.large)
|
|
149
|
-
},
|
|
150
|
-
encode (state, m) {
|
|
151
|
-
c.uint.encode(state, m.small)
|
|
152
|
-
c.uint.encode(state, m.medium)
|
|
153
|
-
c.uint.encode(state, m.large)
|
|
154
|
-
},
|
|
155
|
-
decode (state) {
|
|
156
|
-
const r0 = c.uint.decode(state)
|
|
157
|
-
const r1 = c.uint.decode(state)
|
|
158
|
-
const r2 = c.uint.decode(state)
|
|
159
|
-
|
|
160
|
-
return {
|
|
161
|
-
small: r0,
|
|
162
|
-
medium: r1,
|
|
163
|
-
large: r2
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
104
|
// @media/create-preview-request
|
|
169
|
-
const
|
|
105
|
+
const encoding3 = {
|
|
170
106
|
preencode (state, m) {
|
|
171
107
|
c.string.preencode(state, m.path)
|
|
172
108
|
state.end++ // max flag is 16 so always one byte
|
|
@@ -210,23 +146,23 @@ const encoding5 = {
|
|
|
210
146
|
}
|
|
211
147
|
|
|
212
148
|
// @media/create-preview-response.metadata
|
|
213
|
-
const
|
|
149
|
+
const encoding4_0 = encoding2_0
|
|
214
150
|
// @media/create-preview-response.preview
|
|
215
|
-
const
|
|
151
|
+
const encoding4_1 = c.frame(encoding2)
|
|
216
152
|
|
|
217
153
|
// @media/create-preview-response
|
|
218
|
-
const
|
|
154
|
+
const encoding4 = {
|
|
219
155
|
preencode (state, m) {
|
|
220
|
-
|
|
221
|
-
|
|
156
|
+
encoding4_0.preencode(state, m.metadata)
|
|
157
|
+
encoding4_1.preencode(state, m.preview)
|
|
222
158
|
},
|
|
223
159
|
encode (state, m) {
|
|
224
|
-
|
|
225
|
-
|
|
160
|
+
encoding4_0.encode(state, m.metadata)
|
|
161
|
+
encoding4_1.encode(state, m.preview)
|
|
226
162
|
},
|
|
227
163
|
decode (state) {
|
|
228
|
-
const r0 =
|
|
229
|
-
const r1 =
|
|
164
|
+
const r0 = encoding4_0.decode(state)
|
|
165
|
+
const r1 = encoding4_1.decode(state)
|
|
230
166
|
|
|
231
167
|
return {
|
|
232
168
|
metadata: r0,
|
|
@@ -235,129 +171,65 @@ const encoding6 = {
|
|
|
235
171
|
}
|
|
236
172
|
}
|
|
237
173
|
|
|
238
|
-
// @media/
|
|
239
|
-
const
|
|
240
|
-
// @media/create-preview-all-request.maxHeight
|
|
241
|
-
const encoding7_3 = encoding7_2
|
|
242
|
-
|
|
243
|
-
// @media/create-preview-all-request
|
|
244
|
-
const encoding7 = {
|
|
174
|
+
// @media/decode-image-request
|
|
175
|
+
const encoding5 = {
|
|
245
176
|
preencode (state, m) {
|
|
246
|
-
|
|
247
|
-
state.end++ // max flag is 2 so always one byte
|
|
177
|
+
state.end++ // max flag is 4 so always one byte
|
|
248
178
|
|
|
179
|
+
if (m.path) c.string.preencode(state, m.path)
|
|
180
|
+
if (m.httpLink) c.string.preencode(state, m.httpLink)
|
|
249
181
|
if (m.mimetype) c.string.preencode(state, m.mimetype)
|
|
250
|
-
encoding7_2.preencode(state, m.maxWidth)
|
|
251
|
-
encoding7_3.preencode(state, m.maxHeight)
|
|
252
|
-
if (m.format) c.string.preencode(state, m.format)
|
|
253
182
|
},
|
|
254
183
|
encode (state, m) {
|
|
255
184
|
const flags =
|
|
256
|
-
(m.
|
|
257
|
-
(m.
|
|
185
|
+
(m.path ? 1 : 0) |
|
|
186
|
+
(m.httpLink ? 2 : 0) |
|
|
187
|
+
(m.mimetype ? 4 : 0)
|
|
258
188
|
|
|
259
|
-
c.string.encode(state, m.path)
|
|
260
189
|
c.uint.encode(state, flags)
|
|
261
190
|
|
|
191
|
+
if (m.path) c.string.encode(state, m.path)
|
|
192
|
+
if (m.httpLink) c.string.encode(state, m.httpLink)
|
|
262
193
|
if (m.mimetype) c.string.encode(state, m.mimetype)
|
|
263
|
-
encoding7_2.encode(state, m.maxWidth)
|
|
264
|
-
encoding7_3.encode(state, m.maxHeight)
|
|
265
|
-
if (m.format) c.string.encode(state, m.format)
|
|
266
194
|
},
|
|
267
195
|
decode (state) {
|
|
268
|
-
const r0 = c.string.decode(state)
|
|
269
196
|
const flags = c.uint.decode(state)
|
|
270
197
|
|
|
271
198
|
return {
|
|
272
|
-
path:
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
maxHeight: encoding7_3.decode(state),
|
|
276
|
-
format: (flags & 2) !== 0 ? c.string.decode(state) : null
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// @media/create-preview-all-response.metadata
|
|
282
|
-
const encoding8_0 = encoding2_0
|
|
283
|
-
// @media/create-preview-all-response.preview
|
|
284
|
-
const encoding8_1 = c.frame(encoding3)
|
|
285
|
-
|
|
286
|
-
// @media/create-preview-all-response
|
|
287
|
-
const encoding8 = {
|
|
288
|
-
preencode (state, m) {
|
|
289
|
-
encoding8_0.preencode(state, m.metadata)
|
|
290
|
-
encoding8_1.preencode(state, m.preview)
|
|
291
|
-
},
|
|
292
|
-
encode (state, m) {
|
|
293
|
-
encoding8_0.encode(state, m.metadata)
|
|
294
|
-
encoding8_1.encode(state, m.preview)
|
|
295
|
-
},
|
|
296
|
-
decode (state) {
|
|
297
|
-
const r0 = encoding8_0.decode(state)
|
|
298
|
-
const r1 = encoding8_1.decode(state)
|
|
299
|
-
|
|
300
|
-
return {
|
|
301
|
-
metadata: r0,
|
|
302
|
-
preview: r1
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// @media/decode-image-request
|
|
308
|
-
const encoding9 = {
|
|
309
|
-
preencode (state, m) {
|
|
310
|
-
c.string.preencode(state, m.httpLink)
|
|
311
|
-
state.end++ // max flag is 1 so always one byte
|
|
312
|
-
|
|
313
|
-
if (version >= 2 && m.mimetype) c.string.preencode(state, m.mimetype)
|
|
314
|
-
},
|
|
315
|
-
encode (state, m) {
|
|
316
|
-
const flags = (version >= 2 && m.mimetype) ? 1 : 0
|
|
317
|
-
|
|
318
|
-
c.string.encode(state, m.httpLink)
|
|
319
|
-
c.uint.encode(state, flags)
|
|
320
|
-
|
|
321
|
-
if (version >= 2 && m.mimetype) c.string.encode(state, m.mimetype)
|
|
322
|
-
},
|
|
323
|
-
decode (state) {
|
|
324
|
-
const r0 = c.string.decode(state)
|
|
325
|
-
const flags = c.uint.decode(state)
|
|
326
|
-
|
|
327
|
-
return {
|
|
328
|
-
httpLink: r0,
|
|
329
|
-
mimetype: (version >= 2 && (flags & 1) !== 0) ? c.string.decode(state) : null
|
|
199
|
+
path: (flags & 1) !== 0 ? c.string.decode(state) : null,
|
|
200
|
+
httpLink: (flags & 2) !== 0 ? c.string.decode(state) : null,
|
|
201
|
+
mimetype: (flags & 4) !== 0 ? c.string.decode(state) : null
|
|
330
202
|
}
|
|
331
203
|
}
|
|
332
204
|
}
|
|
333
205
|
|
|
334
206
|
// @media/decode-image-response.metadata
|
|
335
|
-
const
|
|
207
|
+
const encoding6_0 = encoding2_0
|
|
336
208
|
|
|
337
209
|
// @media/decode-image-response
|
|
338
|
-
const
|
|
210
|
+
const encoding6 = {
|
|
339
211
|
preencode (state, m) {
|
|
340
212
|
state.end++ // max flag is 2 so always one byte
|
|
341
213
|
|
|
342
|
-
if (
|
|
343
|
-
if (
|
|
214
|
+
if (m.metadata) encoding6_0.preencode(state, m.metadata)
|
|
215
|
+
if (m.data) c.buffer.preencode(state, m.data)
|
|
344
216
|
},
|
|
345
217
|
encode (state, m) {
|
|
346
218
|
const flags =
|
|
347
|
-
(
|
|
348
|
-
(
|
|
219
|
+
(m.metadata ? 1 : 0) |
|
|
220
|
+
(m.data ? 2 : 0)
|
|
349
221
|
|
|
350
222
|
c.uint.encode(state, flags)
|
|
351
223
|
|
|
352
|
-
if (
|
|
353
|
-
if (
|
|
224
|
+
if (m.metadata) encoding6_0.encode(state, m.metadata)
|
|
225
|
+
if (m.data) c.buffer.encode(state, m.data)
|
|
354
226
|
},
|
|
355
227
|
decode (state) {
|
|
356
228
|
const flags = c.uint.decode(state)
|
|
357
229
|
|
|
358
230
|
return {
|
|
359
|
-
metadata: (
|
|
360
|
-
data: (
|
|
231
|
+
metadata: (flags & 1) !== 0 ? encoding6_0.decode(state) : null,
|
|
232
|
+
data: (flags & 2) !== 0 ? c.buffer.decode(state) : null
|
|
361
233
|
}
|
|
362
234
|
}
|
|
363
235
|
}
|
|
@@ -387,14 +259,10 @@ function getEncoding (name) {
|
|
|
387
259
|
case '@media/dimensions': return encoding0
|
|
388
260
|
case '@media/metadata': return encoding1
|
|
389
261
|
case '@media/file': return encoding2
|
|
390
|
-
case '@media/preview-
|
|
391
|
-
case '@media/
|
|
392
|
-
case '@media/
|
|
393
|
-
case '@media/
|
|
394
|
-
case '@media/create-preview-all-request': return encoding7
|
|
395
|
-
case '@media/create-preview-all-response': return encoding8
|
|
396
|
-
case '@media/decode-image-request': return encoding9
|
|
397
|
-
case '@media/decode-image-response': return encoding10
|
|
262
|
+
case '@media/create-preview-request': return encoding3
|
|
263
|
+
case '@media/create-preview-response': return encoding4
|
|
264
|
+
case '@media/decode-image-request': return encoding5
|
|
265
|
+
case '@media/decode-image-response': return encoding6
|
|
398
266
|
default: throw new Error('Encoder not found ' + name)
|
|
399
267
|
}
|
|
400
268
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version":
|
|
2
|
+
"version": 1,
|
|
3
3
|
"schema": [
|
|
4
4
|
{
|
|
5
5
|
"name": "dimensions",
|
|
@@ -67,55 +67,6 @@
|
|
|
67
67
|
}
|
|
68
68
|
]
|
|
69
69
|
},
|
|
70
|
-
{
|
|
71
|
-
"name": "preview-by-size",
|
|
72
|
-
"namespace": "media",
|
|
73
|
-
"compact": false,
|
|
74
|
-
"flagsPosition": 0,
|
|
75
|
-
"fields": [
|
|
76
|
-
{
|
|
77
|
-
"name": "small",
|
|
78
|
-
"type": "@media/file",
|
|
79
|
-
"version": 1
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"name": "medium",
|
|
83
|
-
"type": "@media/file",
|
|
84
|
-
"version": 1
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"name": "large",
|
|
88
|
-
"type": "@media/file",
|
|
89
|
-
"version": 1
|
|
90
|
-
}
|
|
91
|
-
]
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"name": "sizePreview",
|
|
95
|
-
"namespace": "media",
|
|
96
|
-
"compact": false,
|
|
97
|
-
"flagsPosition": -1,
|
|
98
|
-
"fields": [
|
|
99
|
-
{
|
|
100
|
-
"name": "small",
|
|
101
|
-
"required": true,
|
|
102
|
-
"type": "uint",
|
|
103
|
-
"version": 1
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"name": "medium",
|
|
107
|
-
"required": true,
|
|
108
|
-
"type": "uint",
|
|
109
|
-
"version": 1
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
"name": "large",
|
|
113
|
-
"required": true,
|
|
114
|
-
"type": "uint",
|
|
115
|
-
"version": 1
|
|
116
|
-
}
|
|
117
|
-
]
|
|
118
|
-
},
|
|
119
70
|
{
|
|
120
71
|
"name": "create-preview-request",
|
|
121
72
|
"namespace": "media",
|
|
@@ -176,77 +127,25 @@
|
|
|
176
127
|
]
|
|
177
128
|
},
|
|
178
129
|
{
|
|
179
|
-
"name": "
|
|
130
|
+
"name": "decode-image-request",
|
|
180
131
|
"namespace": "media",
|
|
181
132
|
"compact": false,
|
|
182
|
-
"flagsPosition":
|
|
133
|
+
"flagsPosition": 0,
|
|
183
134
|
"fields": [
|
|
184
135
|
{
|
|
185
136
|
"name": "path",
|
|
186
|
-
"required": true,
|
|
187
|
-
"type": "string",
|
|
188
|
-
"version": 1
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
"name": "mimetype",
|
|
192
|
-
"type": "string",
|
|
193
|
-
"version": 1
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
"name": "maxWidth",
|
|
197
|
-
"required": true,
|
|
198
|
-
"type": "@media/sizePreview",
|
|
199
|
-
"version": 1
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
"name": "maxHeight",
|
|
203
|
-
"required": true,
|
|
204
|
-
"type": "@media/sizePreview",
|
|
205
|
-
"version": 1
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
"name": "format",
|
|
209
137
|
"type": "string",
|
|
210
138
|
"version": 1
|
|
211
|
-
}
|
|
212
|
-
]
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
"name": "create-preview-all-response",
|
|
216
|
-
"namespace": "media",
|
|
217
|
-
"compact": false,
|
|
218
|
-
"flagsPosition": -1,
|
|
219
|
-
"fields": [
|
|
220
|
-
{
|
|
221
|
-
"name": "metadata",
|
|
222
|
-
"required": true,
|
|
223
|
-
"type": "@media/metadata",
|
|
224
|
-
"version": 1
|
|
225
139
|
},
|
|
226
|
-
{
|
|
227
|
-
"name": "preview",
|
|
228
|
-
"required": true,
|
|
229
|
-
"type": "@media/preview-by-size",
|
|
230
|
-
"version": 1
|
|
231
|
-
}
|
|
232
|
-
]
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
"name": "decode-image-request",
|
|
236
|
-
"namespace": "media",
|
|
237
|
-
"compact": false,
|
|
238
|
-
"flagsPosition": 1,
|
|
239
|
-
"fields": [
|
|
240
140
|
{
|
|
241
141
|
"name": "httpLink",
|
|
242
|
-
"required": true,
|
|
243
142
|
"type": "string",
|
|
244
|
-
"version":
|
|
143
|
+
"version": 1
|
|
245
144
|
},
|
|
246
145
|
{
|
|
247
146
|
"name": "mimetype",
|
|
248
147
|
"type": "string",
|
|
249
|
-
"version":
|
|
148
|
+
"version": 1
|
|
250
149
|
}
|
|
251
150
|
]
|
|
252
151
|
},
|
|
@@ -259,12 +158,12 @@
|
|
|
259
158
|
{
|
|
260
159
|
"name": "metadata",
|
|
261
160
|
"type": "@media/metadata",
|
|
262
|
-
"version":
|
|
161
|
+
"version": 1
|
|
263
162
|
},
|
|
264
163
|
{
|
|
265
164
|
"name": "data",
|
|
266
165
|
"type": "buffer",
|
|
267
|
-
"version":
|
|
166
|
+
"version": 1
|
|
268
167
|
}
|
|
269
168
|
]
|
|
270
169
|
}
|
package/shared/spec/schema.js
CHANGED
|
@@ -51,41 +51,6 @@ media.register({
|
|
|
51
51
|
}]
|
|
52
52
|
})
|
|
53
53
|
|
|
54
|
-
media.register({
|
|
55
|
-
name: 'preview-by-size',
|
|
56
|
-
fields: [{
|
|
57
|
-
name: 'small',
|
|
58
|
-
type: '@media/file'
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'medium',
|
|
62
|
-
type: '@media/file'
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: 'large',
|
|
66
|
-
type: '@media/file'
|
|
67
|
-
}]
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
media.register({
|
|
71
|
-
name: 'sizePreview',
|
|
72
|
-
fields: [{
|
|
73
|
-
name: 'small',
|
|
74
|
-
type: 'uint',
|
|
75
|
-
required: true
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
name: 'medium',
|
|
79
|
-
type: 'uint',
|
|
80
|
-
required: true
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: 'large',
|
|
84
|
-
type: 'uint',
|
|
85
|
-
required: true
|
|
86
|
-
}]
|
|
87
|
-
})
|
|
88
|
-
|
|
89
54
|
media.register({
|
|
90
55
|
name: 'create-preview-request',
|
|
91
56
|
fields: [{
|
|
@@ -130,52 +95,14 @@ media.register({
|
|
|
130
95
|
})
|
|
131
96
|
|
|
132
97
|
media.register({
|
|
133
|
-
name: '
|
|
98
|
+
name: 'decode-image-request',
|
|
134
99
|
fields: [{
|
|
135
100
|
name: 'path',
|
|
136
|
-
type: 'string',
|
|
137
|
-
required: true
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
name: 'mimetype',
|
|
141
101
|
type: 'string'
|
|
142
102
|
},
|
|
143
103
|
{
|
|
144
|
-
name: 'maxWidth',
|
|
145
|
-
type: '@media/sizePreview',
|
|
146
|
-
required: true
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
name: 'maxHeight',
|
|
150
|
-
type: '@media/sizePreview',
|
|
151
|
-
required: true
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
name: 'format',
|
|
155
|
-
type: 'string'
|
|
156
|
-
}]
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
media.register({
|
|
160
|
-
name: 'create-preview-all-response',
|
|
161
|
-
fields: [{
|
|
162
|
-
name: 'metadata',
|
|
163
|
-
type: '@media/metadata',
|
|
164
|
-
required: true
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
name: 'preview',
|
|
168
|
-
type: '@media/preview-by-size',
|
|
169
|
-
required: true
|
|
170
|
-
}]
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
media.register({
|
|
174
|
-
name: 'decode-image-request',
|
|
175
|
-
fields: [{
|
|
176
104
|
name: 'httpLink',
|
|
177
|
-
type: 'string'
|
|
178
|
-
required: true
|
|
105
|
+
type: 'string'
|
|
179
106
|
},
|
|
180
107
|
{
|
|
181
108
|
name: 'mimetype',
|
package/worker/index.js
CHANGED
package/worker/media.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import b4a from 'b4a'
|
|
2
2
|
import fs from 'bare-fs'
|
|
3
3
|
import fetch from 'bare-fetch'
|
|
4
|
+
import getMimeType from 'get-mime-type'
|
|
4
5
|
|
|
5
6
|
import { importCodec } from '../shared/codecs.js'
|
|
6
7
|
import { calculateFitDimensions } from './util'
|
|
@@ -10,44 +11,37 @@ const DEFAULT_PREVIEW_FORMAT = 'image/webp'
|
|
|
10
11
|
const animatableMimetypes = ['image/webp']
|
|
11
12
|
|
|
12
13
|
export async function createPreview ({ path, mimetype, maxWidth, maxHeight, format, encoding }) {
|
|
14
|
+
mimetype = mimetype || getMimeType(path)
|
|
13
15
|
format = format || DEFAULT_PREVIEW_FORMAT
|
|
14
16
|
|
|
15
17
|
const buffer = fs.readFileSync(path)
|
|
16
18
|
const rgba = await decodeImageToRGBA(buffer, mimetype)
|
|
17
19
|
const { width, height } = rgba
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
metadata: {
|
|
21
|
-
dimensions: { width, height }
|
|
22
|
-
},
|
|
23
|
-
preview: await createPreviewFromRGBA(rgba, maxWidth, maxHeight, format, encoding)
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export async function createPreviewAll ({ path, mimetype, maxWidth, maxHeight, format }) {
|
|
28
|
-
format = format || DEFAULT_PREVIEW_FORMAT
|
|
21
|
+
const { dimensions, rgba: maybeResizedRGBA } = await resizeRGBA(rgba, width, height, maxWidth, maxHeight)
|
|
29
22
|
|
|
30
|
-
const
|
|
31
|
-
const rgba = await decodeImageToRGBA(buffer, mimetype)
|
|
32
|
-
const { width, height } = rgba
|
|
33
|
-
|
|
34
|
-
const [small, medium, large] = await Promise.all([
|
|
35
|
-
createPreviewFromRGBA(rgba, maxWidth.small, maxHeight.small, format, 'base64'),
|
|
36
|
-
createPreviewFromRGBA(rgba, maxWidth.medium, maxHeight.medium, format, 'base64'),
|
|
37
|
-
createPreviewFromRGBA(rgba, maxWidth.large, maxHeight.large, format)
|
|
38
|
-
])
|
|
23
|
+
const encoded = await encodeImageFromRGBA(maybeResizedRGBA, format, encoding)
|
|
39
24
|
|
|
40
25
|
return {
|
|
41
26
|
metadata: {
|
|
42
27
|
dimensions: { width, height }
|
|
43
28
|
},
|
|
44
|
-
preview: {
|
|
29
|
+
preview: {
|
|
30
|
+
metadata: { mimetype: format, dimensions },
|
|
31
|
+
...encoded
|
|
32
|
+
}
|
|
45
33
|
}
|
|
46
34
|
}
|
|
47
35
|
|
|
48
|
-
export async function decodeImage ({ httpLink, mimetype }) {
|
|
49
|
-
|
|
50
|
-
|
|
36
|
+
export async function decodeImage ({ path, httpLink, mimetype }) {
|
|
37
|
+
let buffer
|
|
38
|
+
|
|
39
|
+
if (path) {
|
|
40
|
+
buffer = fs.readFileSync(path)
|
|
41
|
+
} else if (httpLink) {
|
|
42
|
+
const response = await fetch(httpLink)
|
|
43
|
+
buffer = await response.buffer()
|
|
44
|
+
}
|
|
51
45
|
|
|
52
46
|
const rgba = await decodeImageToRGBA(buffer, mimetype)
|
|
53
47
|
const { width, height, data } = rgba
|
|
@@ -76,30 +70,26 @@ async function decodeImageToRGBA (buffer, mimetype) {
|
|
|
76
70
|
return rgba
|
|
77
71
|
}
|
|
78
72
|
|
|
79
|
-
async function
|
|
80
|
-
|
|
73
|
+
async function encodeImageFromRGBA (rgba, format, encoding) {
|
|
74
|
+
const codec = await importCodec(format)
|
|
75
|
+
const encoded = codec.encode(rgba)
|
|
81
76
|
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
return encoding === 'base64'
|
|
78
|
+
? { inlined: b4a.toString(encoded, 'base64') }
|
|
79
|
+
: { buffer: encoded }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function resizeRGBA (rgba, width, height, maxWidth, maxHeight) {
|
|
83
|
+
let maybeResizedRGBA, dimensions
|
|
84
84
|
|
|
85
85
|
if (maxWidth && maxHeight && (width > maxWidth || height > maxHeight)) {
|
|
86
86
|
const { resize } = await import('bare-image-resample')
|
|
87
87
|
dimensions = calculateFitDimensions(width, height, maxWidth, maxHeight)
|
|
88
|
-
|
|
88
|
+
maybeResizedRGBA = resize(rgba, dimensions.width, dimensions.height)
|
|
89
89
|
} else {
|
|
90
90
|
dimensions = { width, height }
|
|
91
|
-
|
|
91
|
+
maybeResizedRGBA = rgba
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
const encoded = codec.encode(maybeResized)
|
|
96
|
-
|
|
97
|
-
const result = encoding === 'base64'
|
|
98
|
-
? { inlined: b4a.toString(encoded, 'base64') }
|
|
99
|
-
: { buffer: encoded }
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
...result,
|
|
103
|
-
metadata: { mimetype: format, dimensions }
|
|
104
|
-
}
|
|
94
|
+
return { dimensions, rgba: maybeResizedRGBA }
|
|
105
95
|
}
|