bare-media 1.0.0 → 1.1.1

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 CHANGED
@@ -27,7 +27,7 @@ const worker = new WorkerClient()
27
27
  const data = await worker.createPreview({ path, maxWidth, maxHeight })
28
28
  ```
29
29
 
30
- > NOTE: A worker spawns when an operation is requested and it stays running until the parent process is killed. If you need to spawn it earlier it's also possible by calling `worker.run()`.
30
+ > NOTE: A worker spawns when an operation is requested and it stays running until the parent process is killed.
31
31
 
32
32
  Handle close event:
33
33
 
@@ -40,12 +40,12 @@ worker.onClose = () => {
40
40
 
41
41
  ```
42
42
 
43
- You can also call the utilities directly without using a worker:
43
+ Call the methods directly without a worker:
44
44
 
45
45
  ```js
46
46
  import { createPreview } from 'bare-media/worker/media.js'
47
47
 
48
- const data = await worker.createPreview({ path, maxWidth, maxHeight })
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
- | `createPreviewAll` | `path, mimetype, maxWidth, maxHeight, format` | `metadata, preview` | Create all 3 previews from a media file
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.js ADDED
@@ -0,0 +1,56 @@
1
+ import { spawn } from 'cross-worker/client'
2
+ import ReadyResource from 'ready-resource'
3
+
4
+ import HRPC from './shared/spec/hrpc/index.js'
5
+ import { isCodecSupported } from './shared/codecs.js'
6
+
7
+ export class WorkerClient extends ReadyResource {
8
+ worker = null
9
+ rpc = null
10
+ opts = null
11
+
12
+ constructor (opts) {
13
+ super()
14
+ this.initialize(opts)
15
+ this.#attachMethods()
16
+ }
17
+
18
+ initialize ({ filename = 'node_modules/bare-media/worker/index.js', requireSource, args } = {}) {
19
+ this.opts = { filename, requireSource, args }
20
+ }
21
+
22
+ #attachMethods () {
23
+ const methods = [
24
+ 'createPreview',
25
+ 'decodeImage'
26
+ ]
27
+
28
+ for (const method of methods) {
29
+ this[method] = async (...args) => {
30
+ await this.ready()
31
+ return this.rpc[method](...args)
32
+ }
33
+ }
34
+ }
35
+
36
+ async _open () {
37
+ await this.#run()
38
+ }
39
+
40
+ async #run () {
41
+ const { filename, requireSource, args } = this.opts
42
+ const source = requireSource?.()
43
+ this.worker = await spawn(filename, source, args)
44
+
45
+ const ipc = this.worker.IPC
46
+
47
+ ipc.on('end', () => ipc.end())
48
+ ipc.on('close', () => this.onClose?.())
49
+
50
+ this.rpc = new HRPC(ipc)
51
+ }
52
+
53
+ isCodecSupported (mimetype) {
54
+ return isCodecSupported(mimetype)
55
+ }
56
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-media",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -23,9 +23,11 @@
23
23
  "bare-png": "^1.0.2",
24
24
  "bare-tiff": "^1.0.1",
25
25
  "bare-webp": "^1.0.3",
26
- "cross-worker": "^1.0.0",
26
+ "cross-worker": "^1.1.0",
27
+ "get-mime-type": "^2.0.1",
27
28
  "hrpc": "^4.0.0",
28
29
  "hyperschema": "^1.12.3",
30
+ "ready-resource": "^1.2.0",
29
31
  "uncaughts": "^1.1.1"
30
32
  },
31
33
  "devDependencies": {
@@ -37,9 +39,9 @@
37
39
  "test-tmp": "^1.4.0"
38
40
  },
39
41
  "files": [
40
- "client",
41
42
  "shared",
42
43
  "worker",
44
+ "client.js",
43
45
  "index.js"
44
46
  ],
45
47
  "standard": {
@@ -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,
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": 2
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/create-preview-all', 1],
11
- [1, '@media/create-preview-all'],
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
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 = 2
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 encoding5 = {
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 encoding6_0 = encoding2_0
149
+ const encoding4_0 = encoding2_0
214
150
  // @media/create-preview-response.preview
215
- const encoding6_1 = encoding3_0
151
+ const encoding4_1 = c.frame(encoding2)
216
152
 
217
153
  // @media/create-preview-response
218
- const encoding6 = {
154
+ const encoding4 = {
219
155
  preencode (state, m) {
220
- encoding6_0.preencode(state, m.metadata)
221
- encoding6_1.preencode(state, m.preview)
156
+ encoding4_0.preencode(state, m.metadata)
157
+ encoding4_1.preencode(state, m.preview)
222
158
  },
223
159
  encode (state, m) {
224
- encoding6_0.encode(state, m.metadata)
225
- encoding6_1.encode(state, m.preview)
160
+ encoding4_0.encode(state, m.metadata)
161
+ encoding4_1.encode(state, m.preview)
226
162
  },
227
163
  decode (state) {
228
- const r0 = encoding6_0.decode(state)
229
- const r1 = encoding6_1.decode(state)
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/create-preview-all-request.maxWidth
239
- const encoding7_2 = c.frame(encoding4)
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
- c.string.preencode(state, m.path)
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.mimetype ? 1 : 0) |
257
- (m.format ? 2 : 0)
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: r0,
273
- mimetype: (flags & 1) !== 0 ? c.string.decode(state) : null,
274
- maxWidth: encoding7_2.decode(state),
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 encoding10_0 = encoding2_0
207
+ const encoding6_0 = encoding2_0
336
208
 
337
209
  // @media/decode-image-response
338
- const encoding10 = {
210
+ const encoding6 = {
339
211
  preencode (state, m) {
340
212
  state.end++ // max flag is 2 so always one byte
341
213
 
342
- if (version >= 2 && m.metadata) encoding10_0.preencode(state, m.metadata)
343
- if (version >= 2 && m.data) c.buffer.preencode(state, m.data)
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
- ((version >= 2 && m.metadata) ? 1 : 0) |
348
- ((version >= 2 && m.data) ? 2 : 0)
219
+ (m.metadata ? 1 : 0) |
220
+ (m.data ? 2 : 0)
349
221
 
350
222
  c.uint.encode(state, flags)
351
223
 
352
- if (version >= 2 && m.metadata) encoding10_0.encode(state, m.metadata)
353
- if (version >= 2 && m.data) c.buffer.encode(state, m.data)
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: (version >= 2 && (flags & 1) !== 0) ? encoding10_0.decode(state) : null,
360
- data: (version >= 2 && (flags & 2) !== 0) ? c.buffer.decode(state) : null
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-by-size': return encoding3
391
- case '@media/sizePreview': return encoding4
392
- case '@media/create-preview-request': return encoding5
393
- case '@media/create-preview-response': return encoding6
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
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 = 2
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 encoding5 = {
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 encoding6_0 = encoding2_0
149
+ const encoding4_0 = encoding2_0
214
150
  // @media/create-preview-response.preview
215
- const encoding6_1 = encoding3_0
151
+ const encoding4_1 = c.frame(encoding2)
216
152
 
217
153
  // @media/create-preview-response
218
- const encoding6 = {
154
+ const encoding4 = {
219
155
  preencode (state, m) {
220
- encoding6_0.preencode(state, m.metadata)
221
- encoding6_1.preencode(state, m.preview)
156
+ encoding4_0.preencode(state, m.metadata)
157
+ encoding4_1.preencode(state, m.preview)
222
158
  },
223
159
  encode (state, m) {
224
- encoding6_0.encode(state, m.metadata)
225
- encoding6_1.encode(state, m.preview)
160
+ encoding4_0.encode(state, m.metadata)
161
+ encoding4_1.encode(state, m.preview)
226
162
  },
227
163
  decode (state) {
228
- const r0 = encoding6_0.decode(state)
229
- const r1 = encoding6_1.decode(state)
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/create-preview-all-request.maxWidth
239
- const encoding7_2 = c.frame(encoding4)
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
- c.string.preencode(state, m.path)
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.mimetype ? 1 : 0) |
257
- (m.format ? 2 : 0)
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: r0,
273
- mimetype: (flags & 1) !== 0 ? c.string.decode(state) : null,
274
- maxWidth: encoding7_2.decode(state),
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 encoding10_0 = encoding2_0
207
+ const encoding6_0 = encoding2_0
336
208
 
337
209
  // @media/decode-image-response
338
- const encoding10 = {
210
+ const encoding6 = {
339
211
  preencode (state, m) {
340
212
  state.end++ // max flag is 2 so always one byte
341
213
 
342
- if (version >= 2 && m.metadata) encoding10_0.preencode(state, m.metadata)
343
- if (version >= 2 && m.data) c.buffer.preencode(state, m.data)
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
- ((version >= 2 && m.metadata) ? 1 : 0) |
348
- ((version >= 2 && m.data) ? 2 : 0)
219
+ (m.metadata ? 1 : 0) |
220
+ (m.data ? 2 : 0)
349
221
 
350
222
  c.uint.encode(state, flags)
351
223
 
352
- if (version >= 2 && m.metadata) encoding10_0.encode(state, m.metadata)
353
- if (version >= 2 && m.data) c.buffer.encode(state, m.data)
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: (version >= 2 && (flags & 1) !== 0) ? encoding10_0.decode(state) : null,
360
- data: (version >= 2 && (flags & 2) !== 0) ? c.buffer.decode(state) : null
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-by-size': return encoding3
391
- case '@media/sizePreview': return encoding4
392
- case '@media/create-preview-request': return encoding5
393
- case '@media/create-preview-response': return encoding6
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,
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": "create-preview-all-request",
130
+ "name": "decode-image-request",
180
131
  "namespace": "media",
181
132
  "compact": false,
182
- "flagsPosition": 1,
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": 2
143
+ "version": 1
245
144
  },
246
145
  {
247
146
  "name": "mimetype",
248
147
  "type": "string",
249
- "version": 2
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": 2
161
+ "version": 1
263
162
  },
264
163
  {
265
164
  "name": "data",
266
165
  "type": "buffer",
267
- "version": 2
166
+ "version": 1
268
167
  }
269
168
  ]
270
169
  }
@@ -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: 'create-preview-all-request',
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
@@ -17,7 +17,6 @@ stream.on('close', () => Bare.exit(0))
17
17
  const rpc = new HRPC(stream)
18
18
 
19
19
  rpc.onCreatePreview(media.createPreview)
20
- rpc.onCreatePreviewAll(media.createPreviewAll)
21
20
  rpc.onDecodeImage(media.decodeImage)
22
21
 
23
22
  uncaughts.on((err) => {
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
- return {
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 buffer = fs.readFileSync(path)
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: { small, medium, large }
29
+ preview: {
30
+ metadata: { mimetype: format, dimensions },
31
+ ...encoded
32
+ }
45
33
  }
46
34
  }
47
35
 
48
- export async function decodeImage ({ httpLink, mimetype }) {
49
- const response = await fetch(httpLink)
50
- const buffer = await response.buffer()
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 createPreviewFromRGBA (rgba, maxWidth, maxHeight, format, encoding) {
80
- format = format || DEFAULT_PREVIEW_FORMAT
73
+ async function encodeImageFromRGBA (rgba, format, encoding) {
74
+ const codec = await importCodec(format)
75
+ const encoded = codec.encode(rgba)
81
76
 
82
- const { width, height } = rgba
83
- let maybeResized, dimensions
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
- maybeResized = resize(rgba, dimensions.width, dimensions.height)
88
+ maybeResizedRGBA = resize(rgba, dimensions.width, dimensions.height)
89
89
  } else {
90
90
  dimensions = { width, height }
91
- maybeResized = rgba
91
+ maybeResizedRGBA = rgba
92
92
  }
93
93
 
94
- const codec = await importCodec(format)
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
  }
@@ -1,16 +0,0 @@
1
- const { Worklet } = require('react-native-bare-kit')
2
-
3
- export const spawn = async ({ requireSource, storagePath, buildVariant, deviceId, devMode }) => {
4
- const source = requireSource()
5
-
6
- const worklet = new Worklet()
7
-
8
- await worklet.start('keet:/main.bundle', source, [
9
- storagePath,
10
- buildVariant,
11
- deviceId,
12
- devMode
13
- ])
14
-
15
- return worklet
16
- }
@@ -1,9 +0,0 @@
1
- const isPear = typeof Pear !== 'undefined'
2
-
3
- export async function spawn (opts) {
4
- const lib = isPear
5
- ? await import('./pear')
6
- : await import('./bare-kit')
7
-
8
- return lib.spawn(opts)
9
- }
@@ -1,11 +0,0 @@
1
- export async function spawn ({ sourcePath }) {
2
- sourcePath = sourcePath.replace(/^[\\|/]/, '')
3
-
4
- const link = Pear.key
5
- ? `${Pear.config.applink}/${sourcePath}`
6
- : `${Pear.config.dir}${sourcePath}`
7
-
8
- return {
9
- IPC: Pear.worker.run(link)
10
- }
11
- }
package/client/index.js DELETED
@@ -1,52 +0,0 @@
1
- import HRPC from '../shared/spec/hrpc/index.js'
2
- import { isCodecSupported } from '../shared/codecs.js'
3
- import { spawn } from './cross-spawn/index.js'
4
-
5
- export class WorkerClient {
6
- worker = null
7
- rpc = null
8
- opts = null
9
-
10
- constructor (opts) {
11
- this.initialize(opts)
12
- this.#attachMethods()
13
- }
14
-
15
- initialize (opts) {
16
- const sourcePath = 'node_modules/bare-media/worker/index.js'
17
- this.opts = { sourcePath, ...opts }
18
- }
19
-
20
- #attachMethods () {
21
- const methods = [
22
- 'createPreview',
23
- 'createPreviewAll',
24
- 'decodeImage'
25
- ]
26
-
27
- for (const method of methods) {
28
- this[method] = async (...args) => {
29
- await this.run()
30
- return this.rpc[method](...args)
31
- }
32
- }
33
- }
34
-
35
- async run () {
36
- if (this.worker !== null) {
37
- return
38
- }
39
-
40
- this.worker = await spawn(this.opts)
41
- const ipc = this.worker.IPC
42
-
43
- ipc.on('end', () => ipc.end())
44
- ipc.on('close', () => this.onClose?.())
45
-
46
- this.rpc = new HRPC(ipc)
47
- }
48
-
49
- isCodecSupported (mimetype) {
50
- return isCodecSupported(mimetype)
51
- }
52
- }