@openclaw/whatsapp 2026.5.31-beta.2 → 2026.5.31-beta.4

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.
Files changed (112) hide show
  1. package/dist/api.js +8 -8
  2. package/dist/{channel-DA2BAIo5.js → channel-BbtRTgNk.js} +1 -1
  3. package/dist/channel-plugin-api.js +1 -1
  4. package/dist/{channel.runtime-Q1LZDB5s.js → channel.runtime-Cf2UgrhZ.js} +3 -3
  5. package/dist/{channel.setup-DHXOo4h5.js → channel.setup-DaIyWos-.js} +1 -1
  6. package/dist/{connection-controller-Bnm4INld.js → connection-controller-B07CNCkw.js} +1 -1
  7. package/dist/{login-2fuBM7Je.js → login-CRtqboZq.js} +2 -2
  8. package/dist/{login-qr-B1o7GFy8.js → login-qr-B27eAPhh.js} +8 -4
  9. package/dist/login-qr-runtime.js +5 -5
  10. package/dist/{monitor-BVRq04Dt.js → monitor-CnioHf5V.js} +34 -28
  11. package/dist/runtime-api.js +3 -3
  12. package/dist/{session-DyGWNClj.js → session-mBuvPUCy.js} +27 -18
  13. package/dist/{setup-core-OvPMaAsx.js → setup-core-C3XZ2KBH.js} +5 -5
  14. package/dist/{setup-finalize-Dk23pfKc.js → setup-finalize-B7FVDzwJ.js} +2 -2
  15. package/dist/setup-plugin-api.js +1 -1
  16. package/dist/{setup-surface-F-jVrH8u.js → setup-surface-CGTWO_-E.js} +1 -1
  17. package/node_modules/audio-buffer/.eslintrc.json +44 -0
  18. package/node_modules/audio-buffer/.github/workflows/node.js.yml +31 -0
  19. package/node_modules/audio-buffer/.travis.yml +7 -0
  20. package/node_modules/{@audio/decode-opus → audio-buffer}/LICENSE +2 -5
  21. package/node_modules/audio-buffer/index.js +76 -0
  22. package/node_modules/audio-buffer/package.json +37 -0
  23. package/node_modules/audio-buffer/readme.md +56 -0
  24. package/node_modules/audio-decode/.eslintrc.json +43 -0
  25. package/node_modules/audio-decode/.github/workflows/test.js.yml +20 -11
  26. package/node_modules/audio-decode/.travis.yml +13 -0
  27. package/node_modules/audio-decode/audio-decode.d.ts +10 -48
  28. package/node_modules/audio-decode/audio-decode.js +77 -193
  29. package/node_modules/audio-decode/package.json +21 -49
  30. package/node_modules/audio-decode/readme.md +29 -129
  31. package/node_modules/audio-decode/tea.yaml +6 -0
  32. package/node_modules/audio-decode/test-case.js +11 -0
  33. package/node_modules/audio-decode/test.html +10 -29
  34. package/node_modules/audio-decode/test.js +107 -0
  35. package/node_modules/node-wav/README.md +35 -0
  36. package/node_modules/node-wav/file.wav +0 -0
  37. package/node_modules/node-wav/index.js +291 -0
  38. package/node_modules/node-wav/package.json +29 -0
  39. package/node_modules/node-wav/tests/file1.wav +0 -0
  40. package/node_modules/node-wav/tests/test.js +66 -0
  41. package/node_modules/node-wav/x.js +12 -0
  42. package/node_modules/node-wav/x.json +86702 -0
  43. package/node_modules/node-wav/x.js~ +13 -0
  44. package/npm-shrinkwrap.json +32 -149
  45. package/package.json +5 -5
  46. package/node_modules/@audio/decode-aac/LICENSE +0 -9
  47. package/node_modules/@audio/decode-aac/README.md +0 -60
  48. package/node_modules/@audio/decode-aac/decode-aac.d.ts +0 -16
  49. package/node_modules/@audio/decode-aac/decode-aac.js +0 -391
  50. package/node_modules/@audio/decode-aac/package.json +0 -47
  51. package/node_modules/@audio/decode-aac/src/aac.wasm.cjs +0 -0
  52. package/node_modules/@audio/decode-aiff/LICENSE +0 -21
  53. package/node_modules/@audio/decode-aiff/README.md +0 -53
  54. package/node_modules/@audio/decode-aiff/decode-aiff.d.ts +0 -16
  55. package/node_modules/@audio/decode-aiff/decode-aiff.js +0 -583
  56. package/node_modules/@audio/decode-aiff/package.json +0 -42
  57. package/node_modules/@audio/decode-amr/LICENSE +0 -191
  58. package/node_modules/@audio/decode-amr/README.md +0 -65
  59. package/node_modules/@audio/decode-amr/decode-amr.d.ts +0 -16
  60. package/node_modules/@audio/decode-amr/decode-amr.js +0 -159
  61. package/node_modules/@audio/decode-amr/package.json +0 -48
  62. package/node_modules/@audio/decode-amr/src/amr.wasm.cjs +0 -0
  63. package/node_modules/@audio/decode-caf/LICENSE +0 -21
  64. package/node_modules/@audio/decode-caf/README.md +0 -55
  65. package/node_modules/@audio/decode-caf/decode-caf.d.ts +0 -16
  66. package/node_modules/@audio/decode-caf/decode-caf.js +0 -190
  67. package/node_modules/@audio/decode-caf/package.json +0 -43
  68. package/node_modules/@audio/decode-flac/LICENSE +0 -25
  69. package/node_modules/@audio/decode-flac/README.md +0 -23
  70. package/node_modules/@audio/decode-flac/decode-flac.d.ts +0 -16
  71. package/node_modules/@audio/decode-flac/decode-flac.js +0 -2994
  72. package/node_modules/@audio/decode-flac/meta.js +0 -115
  73. package/node_modules/@audio/decode-flac/package.json +0 -49
  74. package/node_modules/@audio/decode-mp3/LICENSE +0 -25
  75. package/node_modules/@audio/decode-mp3/README.md +0 -23
  76. package/node_modules/@audio/decode-mp3/decode-mp3.d.ts +0 -16
  77. package/node_modules/@audio/decode-mp3/decode-mp3.js +0 -868
  78. package/node_modules/@audio/decode-mp3/meta.js +0 -143
  79. package/node_modules/@audio/decode-mp3/package.json +0 -50
  80. package/node_modules/@audio/decode-opus/README.md +0 -23
  81. package/node_modules/@audio/decode-opus/decode-opus.d.ts +0 -16
  82. package/node_modules/@audio/decode-opus/decode-opus.js +0 -3179
  83. package/node_modules/@audio/decode-opus/package.json +0 -47
  84. package/node_modules/@audio/decode-qoa/LICENSE +0 -25
  85. package/node_modules/@audio/decode-qoa/README.md +0 -21
  86. package/node_modules/@audio/decode-qoa/decode-qoa.d.ts +0 -16
  87. package/node_modules/@audio/decode-qoa/decode-qoa.js +0 -278
  88. package/node_modules/@audio/decode-qoa/package.json +0 -46
  89. package/node_modules/@audio/decode-vorbis/LICENSE +0 -25
  90. package/node_modules/@audio/decode-vorbis/README.md +0 -23
  91. package/node_modules/@audio/decode-vorbis/decode-vorbis.d.ts +0 -16
  92. package/node_modules/@audio/decode-vorbis/decode-vorbis.js +0 -2984
  93. package/node_modules/@audio/decode-vorbis/package.json +0 -47
  94. package/node_modules/@audio/decode-wav/decode-wav.js +0 -104
  95. package/node_modules/@audio/decode-wav/meta.js +0 -114
  96. package/node_modules/@audio/decode-wav/package.json +0 -27
  97. package/node_modules/@audio/decode-webm/LICENSE +0 -21
  98. package/node_modules/@audio/decode-webm/README.md +0 -57
  99. package/node_modules/@audio/decode-webm/decode-webm.d.ts +0 -16
  100. package/node_modules/@audio/decode-webm/decode-webm.js +0 -3964
  101. package/node_modules/@audio/decode-webm/package.json +0 -51
  102. package/node_modules/@audio/decode-wma/LICENSE +0 -12
  103. package/node_modules/@audio/decode-wma/README.md +0 -76
  104. package/node_modules/@audio/decode-wma/decode-wma.d.ts +0 -33
  105. package/node_modules/@audio/decode-wma/decode-wma.js +0 -525
  106. package/node_modules/@audio/decode-wma/package.json +0 -47
  107. package/node_modules/@audio/decode-wma/src/wma.wasm.cjs +0 -0
  108. package/node_modules/audio-decode/.claude/settings.json +0 -204
  109. package/node_modules/audio-decode/.gitmodules +0 -9
  110. package/node_modules/audio-decode/meta.js +0 -11
  111. package/node_modules/audio-decode/stream.d.ts +0 -15
  112. package/node_modules/audio-decode/stream.js +0 -1
@@ -1,149 +1,49 @@
1
- # audio-decode [![test](https://github.com/audiojs/audio-decode/actions/workflows/test.js.yml/badge.svg)](https://github.com/audiojs/audio-decode/actions/workflows/test.js.yml)
1
+ # audio-decode [![test](https://github.com/audiojs/audio-decode/actions/workflows/test.js.yml/badge.svg)](https://github.com/audiojs/audio-decode/actions/workflows/test.js.yml) [![stable](https://img.shields.io/badge/stability-unstable-green.svg)](http://github.com/badges/stability-badges)
2
2
 
3
- Decode any audio format to raw samples.<br>
4
- JS / WASM – no ffmpeg, no native bindings, works in both node and browser.<br>
5
- Small API, minimal size, near-native performance, lazy-loading, chunked decoding.
3
+ Decode audio data from supported format to [AudioBuffer](https://github.com/audiojs/audio-buffer).
6
4
 
7
- [![npm install audio-decode](https://nodei.co/npm/audio-decode.png?mini=true)](https://npmjs.org/package/audio-decode/)
8
-
9
- ```js
10
- import decode from 'audio-decode';
11
-
12
- const { channelData, sampleRate } = await decode(anyAudioBuffer);
13
- ```
14
-
15
- #### Supported formats
16
-
17
- | Format | Package | Size | Engine |
18
- |--------|---------|------|--------|
19
- | MP3 | [@audio/decode-mp3](./packages/decode-mp3) | 92 KB | WASM |
20
- | WAV | [@audio/decode-wav](./packages/decode-wav) | 4 KB | JS |
21
- | OGG Vorbis | [@audio/decode-vorbis](./packages/decode-vorbis) | 164 KB | WASM |
22
- | FLAC | [@audio/decode-flac](./packages/decode-flac) | 133 KB | WASM |
23
- | Opus | [@audio/decode-opus](./packages/decode-opus) | 178 KB | WASM |
24
- | M4A / AAC | [@audio/decode-aac](./packages/decode-aac) | 368 KB | WASM |
25
- | QOA | [@audio/decode-qoa](./packages/decode-qoa) | 8 KB | JS |
26
- | AIFF | [@audio/decode-aiff](./packages/decode-aiff) | 20 KB | JS |
27
- | CAF | [@audio/decode-caf](./packages/decode-caf) | 7 KB | JS |
28
- | WebM | [@audio/decode-webm](./packages/decode-webm) | 263 KB | WASM |
29
- | AMR | [@audio/decode-amr](./packages/decode-amr) | 241 KB | WASM |
30
- | WMA | [@audio/decode-wma](./packages/decode-wma) | 91 KB | WASM |
31
-
32
- ### Whole-file
33
-
34
- Auto-detects format. Input can be _ArrayBuffer_, _Uint8Array_, or _Buffer_.
35
-
36
- ```js
37
- import decode from 'audio-decode'
38
-
39
- let { channelData, sampleRate } = await decode(buf)
40
- ```
41
-
42
- ### Chunked
5
+ Supported formats:
43
6
 
44
- ```js
45
- let dec = await decode.mp3()
46
- let a = await dec(chunk1) // { channelData, sampleRate }
47
- let b = await dec(chunk2)
48
- await dec() // close
49
- ```
7
+ * [x] `wav`
8
+ * [x] `mp3`
9
+ * [x] `ogg vorbis`
10
+ * [x] `flac`
11
+ * [x] `opus`
12
+ * [ ] `alac`
13
+ * [ ] `aac`
14
+ * [ ] `m4a`
15
+ * [x] [`qoa`](https://github.com/phoboslab/qoa)
50
16
 
51
- ### Streaming
17
+ [![npm install audio-decode](https://nodei.co/npm/audio-decode.png?mini=true)](https://npmjs.org/package/audio-decode/)
52
18
 
53
19
  ```js
54
- import decode from 'audio-decode'
20
+ import decodeAudio from 'audio-decode';
21
+ import buffer from 'audio-lena/mp3';
55
22
 
56
- for await (let { channelData, sampleRate } of decode.mp3(response.body)) {
57
- // process chunks
58
- }
23
+ let audioBuffer = await decode(buffer);
59
24
  ```
60
25
 
61
- Works with `ReadableStream`, `fetch` body, Node stream, or any async iterable.
62
-
63
- Formats: `mp3`, `flac`, `opus`, `oga`, `m4a`, `wav`, `qoa`, `aac`, `aiff`, `caf`, `webm`, `amr`, `wma`.
64
-
65
- ### Browser
66
-
67
- Each codec is a self-contained bundle under `@audio/*` — no transitive deps, no import map bloat.
68
- For selective loading in the browser (avoids bundling all codecs):
69
-
70
- ```html
71
- <script type="importmap">
72
- {
73
- "imports": {
74
- "audio-decode": "https://esm.sh/audio-decode",
75
- "audio-type": "https://esm.sh/audio-type",
76
- "@audio/decode-mp3": "https://esm.sh/@audio/decode-mp3",
77
- "@audio/decode-wav": "https://esm.sh/@audio/decode-wav",
78
- "@audio/decode-flac": "https://esm.sh/@audio/decode-flac",
79
- "@audio/decode-opus": "https://esm.sh/@audio/decode-opus",
80
- "@audio/decode-vorbis": "https://esm.sh/@audio/decode-vorbis",
81
- "@audio/decode-aac": "https://esm.sh/@audio/decode-aac",
82
- "@audio/decode-qoa": "https://esm.sh/@audio/decode-qoa",
83
- "@audio/decode-aiff": "https://esm.sh/@audio/decode-aiff",
84
- "@audio/decode-caf": "https://esm.sh/@audio/decode-caf",
85
- "@audio/decode-webm": "https://esm.sh/@audio/decode-webm",
86
- "@audio/decode-amr": "https://esm.sh/@audio/decode-amr",
87
- "@audio/decode-wma": "https://esm.sh/@audio/decode-wma"
88
- }
89
- }
90
- </script>
91
- <script type="module">
92
- import decode from 'audio-decode'
93
- let { channelData, sampleRate } = await decode(buf)
94
- </script>
95
- ```
26
+ `buffer` type can be: _ArrayBuffer_, _Uint8Array_ or _Buffer_.
96
27
 
97
- Only list the codecs you need — each `@audio/decode-*` package bundles all its WASM/JS deps internally.
28
+ `decode` is lazy: first call prepares decoder.
98
29
 
99
- ### Metadata
100
-
101
- Read tags, pictures, markers and regions without decoding samples. Available for `wav`, `mp3`, `flac`.
30
+ To get more granular control over individual decoders, use `decoders`:
102
31
 
103
32
  ```js
104
- import { wav, mp3, flac } from 'audio-decode/meta'
105
-
106
- let { meta, sampleRate, markers, regions } = mp3(bytes)
107
- // meta: { title, artist, album, year, bpm, key, comment, pictures, raw, ... }
108
- // markers: [{ sample, label }]
109
- // regions: [{ sample, length, label }]
110
- ```
33
+ import decode, {decoders} from 'audio-decode';
111
34
 
112
- Each codec sub-package also exposes its parser directly:
113
-
114
- ```js
115
- import { parseMeta } from '@audio/decode-wav/meta'
116
- let info = parseMeta(wavBytes)
35
+ await decoders.mp3(); // load & compile decoder
36
+ const audioBuffer = await decoders.mp3(mp3buf); // decode
117
37
  ```
118
38
 
119
- ### WebWorker
39
+ ## See also
120
40
 
121
- Each `@audio/decode-*` package is a self-contained ESM module import directly in a worker:
41
+ * [wasm-audio-decoders](https://github.com/eshaz/wasm-audio-decoders) best in class compact & fast WASM audio decoders.
42
+ * [Web Audio Decoders](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder) – native decoders API, hope one day will be fixed or alternatively polyfilled.
43
+ * [decodeAudioData](https://github.com/eshaz/wasm-audio-decoders) – default in-browser decoding method.
44
+ * [ffmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm) – ultimate encoding/decoding library (8.5Mb of code).
122
45
 
123
- ```js
124
- // decode-worker.js
125
- import decode from '@audio/decode-mp3'
126
-
127
- self.onmessage = async ({ data }) => {
128
- let pcm = await decode(data)
129
- self.postMessage(pcm, pcm.channelData.map(ch => ch.buffer))
130
- }
131
-
132
- // main.js
133
- let worker = new Worker('./decode-worker.js', { type: 'module' })
134
- worker.postMessage(mp3buf, [mp3buf])
135
- worker.onmessage = ({ data }) => { /* { channelData, sampleRate } */ }
136
- ```
137
-
138
- ## See also
46
+ ## License
139
47
 
140
- * [audio-encode](https://github.com/audiojs/audio-encode) – encode PCM into any audio format.
141
- * [audio-type](https://github.com/audiojs/audio-type) – detect audio format from buffer.
142
- <!--
143
- * [wasm-audio-decoders](https://github.com/eshaz/wasm-audio-decoders) – compact & fast WASM audio decoders.
144
- * [AudioDecoder](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder) – native WebCodecs decoder API.
145
- * [decodeAudioData](https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/decodeAudioData) – built-in browser decoding method.
146
- * [ffmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm) – full encoding/decoding library.
147
- -->
48
+ [MIT](LICENSE)&nbsp;&nbsp;•&nbsp;&nbsp;<a href="https://github.com/krishnized/license/">🕉</a>
148
49
 
149
- <p align="center"><a href="./LICENSE">MIT</a> • <a href="https://github.com/krishnized/license/">ॐ</a>
@@ -0,0 +1,6 @@
1
+ # https://tea.xyz/what-is-this-file
2
+ ---
3
+ version: 1.0.0
4
+ codeOwners:
5
+ - '0x18CEa38f92a0E9b028ea27DD935B36A55Cf83b06'
6
+ quorum: 1
@@ -0,0 +1,11 @@
1
+ import fs from 'fs/promises'
2
+
3
+ async function main(options) {
4
+ const audioDecode = await import('./audio-decode.js');
5
+ const decode = audioDecode.default;
6
+ await audioDecode.decoders.mp3();
7
+ const buffer = await fs.readFile('test.mp3');
8
+ const decodedBuffer = await decode(buffer);
9
+ }
10
+
11
+ main().catch(console.error)
@@ -1,34 +1,15 @@
1
- <!doctype html>
2
- <title>audio-decode tests</title>
1
+ <!DOCTYPE html>
3
2
  <script type="importmap">
4
- {
3
+ {
5
4
  "imports": {
6
- "./audio-decode.js": "./audio-decode.js",
7
- "audio-lena/wav": "./node_modules/audio-lena/wav.js",
8
- "audio-lena/mp3": "./node_modules/audio-lena/mp3.js",
9
- "audio-lena/ogg": "./node_modules/audio-lena/ogg.js",
10
- "audio-lena/flac": "./node_modules/audio-lena/flac.js",
11
- "audio-lena/opus": "./node_modules/audio-lena/opus.js",
12
- "audio-lena/aiff": "./node_modules/audio-lena/aiff.js",
13
- "audio-lena/caf": "./node_modules/audio-lena/caf.js",
14
- "audio-lena/webm": "./node_modules/audio-lena/webm.js",
15
- "audio-lena/aac": "./node_modules/audio-lena/aac.js",
16
- "audio-lena/m4a": "./node_modules/audio-lena/m4a.js",
17
- "audio-type": "./node_modules/audio-type/audio-type.js",
18
5
  "tst": "./node_modules/tst/tst.js",
19
- "@audio/decode-mp3": "./packages/decode-mp3/decode-mp3.js",
20
- "@audio/decode-wav": "./packages/decode-wav/decode-wav.js",
21
- "@audio/decode-flac": "./packages/decode-flac/decode-flac.js",
22
- "@audio/decode-opus": "./packages/decode-opus/decode-opus.js",
23
- "@audio/decode-vorbis": "./packages/decode-vorbis/decode-vorbis.js",
24
- "@audio/decode-aac": "./packages/decode-aac/decode-aac.js",
25
- "@audio/decode-qoa": "./packages/decode-qoa/decode-qoa.js",
26
- "@audio/decode-aiff": "./packages/decode-aiff/decode-aiff.js",
27
- "@audio/decode-caf": "./packages/decode-caf/decode-caf.js",
28
- "@audio/decode-webm": "./packages/decode-webm/decode-webm.js",
29
- "@audio/decode-amr": "./packages/decode-amr/decode-amr.js",
30
- "@audio/decode-wma": "./packages/decode-wma/decode-wma.js"
6
+ "audio-type": "./node_modules/audio-type/audio-type.js",
7
+ "audio-buffer": "./node_modules/audio-buffer/index.js",
8
+ "audio-lena/wav.js": "./node_modules/audio-lena/wav.js",
9
+ "audio-lena/mp3.js": "./node_modules/audio-lena/mp3.js",
10
+ "audio-lena/ogg.js": "./node_modules/audio-lena/ogg.js",
11
+ "audio-lena/flac.js": "./node_modules/audio-lena/flac.js"
31
12
  }
32
- }
13
+ }
33
14
  </script>
34
- <script type="module" src="./test.js"></script>
15
+ <script src="./test.js" type="module"></script>
@@ -0,0 +1,107 @@
1
+
2
+ import decodeAudio, { decoders } from './audio-decode.js';
3
+ import wav from 'audio-lena/wav.js';
4
+ import mp3 from 'audio-lena/mp3.js';
5
+ import ogg from 'audio-lena/ogg.js';
6
+ import flac from 'audio-lena/flac.js';
7
+ import opus from 'audio-lena/opus.js';
8
+ import t, { is, throws } from 'tst';
9
+ import b64 from 'base64-arraybuffer'
10
+
11
+
12
+ //as a callback
13
+ t('wav buffer', async function (t) {
14
+ console.time('wav first')
15
+ await decoders.wav()
16
+ console.timeEnd('wav first')
17
+
18
+ console.time('wav second')
19
+ let audioBuffer = await decodeAudio(wav)
20
+ console.timeEnd('wav second')
21
+ is(audioBuffer.duration | 0, 12, 'wav duration')
22
+ });
23
+
24
+ t('mp3 buffer', async function (t) {
25
+ console.time('mp3 first')
26
+ await decoders.mp3()
27
+ console.timeEnd('mp3 first')
28
+
29
+ console.time('mp3 second')
30
+ let audioBuffer = await decodeAudio(mp3)
31
+ console.timeEnd('mp3 second')
32
+ is(audioBuffer.duration | 0, 12, 'mp3 duration')
33
+ });
34
+
35
+ t('ogg buffer', async function (t) {
36
+ console.time('ogg first')
37
+ let audioBuffer = await decodeAudio(ogg)
38
+ console.timeEnd('ogg first')
39
+ is(audioBuffer.duration | 0, 12, 'ogg duration')
40
+
41
+ console.time('ogg second')
42
+ audioBuffer = await decodeAudio(ogg)
43
+ console.timeEnd('ogg second')
44
+ is(audioBuffer.duration | 0, 12, 'ogg duration')
45
+ });
46
+
47
+ t('flac buffer', async function (t) {
48
+ console.time('flac first')
49
+ let audioBuffer = await decodeAudio(flac)
50
+ console.timeEnd('flac first')
51
+ is(audioBuffer.duration | 0, 12, 'flac duration')
52
+
53
+ console.time('flac second')
54
+ audioBuffer = await decodeAudio(flac)
55
+ console.timeEnd('flac second')
56
+ is(audioBuffer.duration | 0, 12, 'flac duration')
57
+ });
58
+
59
+ t('opus buffer', async function (t) {
60
+ console.time('opus first')
61
+ let audioBuffer = await decodeAudio(opus)
62
+ console.timeEnd('opus first')
63
+ is(audioBuffer.duration | 0, 12, 'opus duration')
64
+
65
+ console.time('opus second')
66
+ audioBuffer = await decodeAudio(opus)
67
+ console.timeEnd('opus second')
68
+ is(audioBuffer.duration | 0, 12, 'opus duration')
69
+ });
70
+
71
+ t('qoa buffer', async function (t) {
72
+ const qoa = b64.decode(`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X3a67RrprrpprrbbFtttsttssNgONBfwBa04JhCKKCCKKSQQGCBBBBBBBJIYkgkkAgkEEBSSCQQQSCCSFBFBAAgBEAoPmU3ySkzWBAv9eBrLEIZdBcWMcHZUPTQCGFshFtlJAQR2SOW2lT20BxbbbabbbSIQEEUUgiiggAyi2UyQKGbrBTIAhYDvtc8DX3SL/3Rb/wcD9pDv//fFA+vi738BU0AJokRJBFFFNgyU22uumwQGDZKKaTaIabYEAttKntklFA0kCEEmhR2xA1gJt+sGu1sLxT/2m/7wzQ/7Xf945o77Btc+sRCmxRoLHosottttJBCCKCSSCCQQFBJJJIIJBBIUkggkggggggm2202m22aGDaBSbTJKZJIEAJIK6mL76Qa59Dt/v9otD91Bj3givgwGimCgkAUppARW0RQmWgRyCAAIKbJPLYQAptI08kggkAiQYce87oAtD0t+++1+//8SSWWSy2WWWxbZZZZZZZbLEtttlltssssP/+7//b//+Qb//Jd/9rr/D+21+/hj30EBVw0gmw0yWQrYTHFTVf/bC3/uv///2/8SwwyyyWWyyQ///v///9t/FhhllkklllkWWWWWWWSSSQ/VH94rfPbaAQC7gBQACBgAAAAFAAQAA+3RDv3eIxoxBiktOAByaBAFoogEtIplpg2UO2yik2yRDTZZaabSYbYNJFttAttssg220k2220m2DIKbbabbbLYQggggkkggghCCCSQSSSSQIAAAAAAAAAAUEkkkkkkkkhSSSCSSSSSSFBBIIIIJBBAUEggEEAAAAAy022yym2ykCbZJbbbLTbQMstNpEttpJg22SGmmUUGWBIYaKFBaZJYNIIEFFCigkATFQCpbBZtvB2/++3v//38WWWWW2yyyyxLLLZZZZbLLIkkkkkkkkkkSyyyyy2222xbbLLZZZZZZFllsssstllkWWGGGGGGWWQ/P//f//9vvD/u3///u//0Db/7W37aaOQrtNdvbFFdoBqnssNjhgJoGAEgiAtIEpAkQQSigWGUiAJLSKSbbRbYNpNNttpNttAi02iU22mWmDTKSTSZTTaIBJtMoppEhhAUUCUkQSi0iBSaQIJRQQJIMEghIoUIsEAik0SUUkWGWDZQabTKLTKIJNNplNtlFJgmkU22EkmWUBRZJNOPOVPAIAQAEQSAgQwDBQYoAAYYKANdVMtmmhisKWW3XwxXSQwVXFTVVRQCIBoQJowYYwRQBDBBIM4MskASkUCGWSUEGBIAIQwopKEEAggAAEo448wzTDjlVTjTDAgJqpgIAMAAAxRU1TSwS2wdFFFBQDVTQBNdEJphoxpoDBAgAEkAUEgBDAADYqZLHBWENtmrrihgK+e7bb627bQtNNtZDNFYoDnuljm192/8KaXXa3b/a2wrrrDLbDTVFANEssMElhogGKGnGGQESGAaADVRRBJBTBVeONMWOAAAEkigAgg04YQRAKCIYQRAAAJIgoIIBopAAQEEkAIlAkgSkSUk0SUUkBRSaZRSaaSYJtpJJJhDhlAUU02mW20y0CbSLTbbbbbYItNtttNtpJgm2UWmmGWmmBSTTRYZaaLQNpEotMscMoAgSSiSEUjjQAQJxwJEBppgGWCiCKnGGWAYbdrdHbrrrD20cd20123sG6+/bbffXaw7vHfv9fvv/Cv3+9+/+930P3z337ae/XwHdttNPdbZrB1sUVmhks0MFV11ZVQwAiAIACJFTQaaIBABoKCJRSSIEpJFFJNMotAmky0mUSyykBKLRRSSRQRYJIpJNMsNJEggiUQg0ygSEARBKRQJBJQQAkokAkkkY8QgABCCIIQQAAOONMAIpqy4GmmiACWQCWAqqYopJFHXFAU10tut1tu0LTT3X333/ew9/trtvtbrtB00cd1t121sHb3W6662zXQdbbddNHddNAU1kgsUMElsGGqGWWmKGAABBDjTJaaYYBgAANXNEgowCiEEEAAkkgASSCKcCRQSSCBBJRIJKLCIFlkklhhAlFAUSSigQUUSSAZaKLLLCJRQIIMssspNMIgkWGEUkiUWWBRKLSRZaTCIJJIopJIlJMgykWkiUkyyiDLLGHDKRRZYIpJplhhlhAgUUUCUUCCSSBBBKCGGCCBAIIgE4YEABAgIaaADTQAIYBpzzyxhhlhgKKGGKKWCWWAqopbLFNLFVAU0MNttlt10GKOKWy2622wrbLLNHlTJYBgMUVMMsUMEGWGmGWWGKKgaYYqaADTjTAFhpiihhltkCmqiAAASAEwVjjTVDRAacBwogBIJxpCAAjBCmmCgAUASCKKAQIIQQAABBAIQJIIQBAgnAkAAhAgASCAIIAIJBBNMMNEEEONMAwwWW2Sy22QJbbLJZbFVDBmhhuut111sGa622W26KXQNbbddddd77Cu222v29110LXTbba6+++QprrrbddZbdBuiimlkUUtkC22WCGGGiiAKCCQQSiQSUBRJKKJJLDKIFJJIspJlFpAyykk0y022mCabTSbbaabYNtNNtptNtpg2222m22m02DbTbbaabbbQNNttNtttttg202222m22mDTbbSbbTSaYNJJMtJFlpIAiiSSSUQRQgCBIJJIooIpoGnGmCU1V1UwDLLDDLYqpbAsstuls01ugO7XXbfe6++wtdr77r79tdC222v3199+8Lbb/7fff/7wv/979/vvv9Dvv3+9+++20L77a/fb37ew7rttrrtvbbC088c910110G6Oa2y222KgpbDDNHDYppBhhlkNVUMkgGGGimmAUQwwRRIaaKaaAQAAgBFNOOFFEIEgAAgAQAEQVTRQAASQAIAoAAgAAggIIAAAgAQUEAAAQgCKCAAAQgAIoJAAIJIAIEkEUgkAAEIAQQSSCEUGeCCKRJRRQQYZQIossopJMspAkkkWWki02kDLLTLLTaTLQJtMtNtNNNtA0022002002DbaabbaaaaYJNNpJlptMtA2kk000mk0kCSSSRRZSKJQIsIYIkghBjAKCCCAQgjjhBAAghFNNFAECGmqKWyKuKAYo66qopoorB001uutt11sKee663z3W7Qtdddfdb77tA2vuuvvuuu0Ha2666y3a2wdbrrbrrrrrCutt11stt0sC3W22222WOArZbrbbJbbZBmttlt0thigKKmGxVQxxVQVDLDTDLVlVANNMMMAhksEAQw00SSQQRQVjAYYIBDBBABqooEEAoqoKmmmGiA1U0QQIKKIYYcaYAgAANNAAgAAEAQEAAAAgAQACAAAQQQCEAIIoJAAIIIAEIEggoIEEIAhQECQQCggSAJRQJKKJJRQFAkolBEopBAEiiSUiiUUiCKDDKKKSSRIIsoklFEklFAiSUiiEEiSSBKKCCKJJJKIBALuAFAAIGAACAAMABQAF8fkSz+MTHu8IIFFEEkokhACiSCCQQCCSAIIJRIJJJBAEkkEEkkEEkgCCEECCEECCAJIIBIQooJAEUUgggEIEAACCKaKABABRAAgAIggAAEEAAGqmmmGCAQBBABDTTRDBAEAhpppqppoGCCAAwQCCSQABDBBBDBBBAMEEEMEEEMMA0ww00ww00wDDTTDIaaqq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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAu4AOBwW4AAEAAQABAAH0shPQ5kAgKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKaIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0QCAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACigKKKKKKKKKKAopxoggAAAEE0QGmiA00QAIIAAAKaIAAAAAFNEAppooCCAAACAACmgaIAIKKIBBAAAgAAgEAoooCiiiAAACmiAIBTRBAAABBBFFEAAAEAAEE40QAQUUUUQRRTjRAAAKaAgFNEApogEAAAUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmiAAIAAIBAKIBTBNNNNNNNNNME000000000wRBBAaaaaIIAggggggAFNEAAQQACCnGiAAAAAKaIAKaAgAAAAApogAAAAAAAAAU0QAABTRAIAAKAgAAAgoopogAQQCmiCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0QAU0QBBAaaaaIBBAAgggggNNNME000000000wTTTTTRBBAKBpppogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==`)
73
+
74
+ console.time('qoa first')
75
+ let audioBuffer = await decodeAudio(qoa)
76
+ console.timeEnd('qoa first')
77
+
78
+ console.time('qoa second')
79
+ audioBuffer = await decodeAudio(qoa)
80
+ console.timeEnd('qoa second')
81
+ is(Math.floor(audioBuffer.duration * 100) / 100, 0.82, 'qoa duration')
82
+ })
83
+
84
+ t('malformed data', async t => {
85
+ let log = []
86
+ try {
87
+ let x = await decodeAudio(new Float32Array(10))
88
+ } catch (e) { log.push('arr') }
89
+
90
+ try {
91
+ let x = await decodeAudio(null)
92
+ } catch (e) { log.push('null') }
93
+
94
+ try {
95
+ let x = await decodeAudio(Promise.resolve())
96
+ } catch (e) { log.push('nonbuf') }
97
+
98
+ is(log, ['arr', 'null', 'nonbuf'])
99
+ })
100
+
101
+ t.skip('sequence #38', async t => {
102
+ let flacBuffer = await decoders.flac(new Uint8Array(flac))
103
+ is(flacBuffer.duration | 0, 12, 'flac duration')
104
+
105
+ let mp3Buffer = await decoders.mp3(new Uint8Array(mp3))
106
+ is(mp3Buffer.duration | 0, 12, 'mp3 duration')
107
+ })
@@ -0,0 +1,35 @@
1
+ node-wav
2
+ ========
3
+
4
+ High performance WAV decoder and encoder. The decoder is up to 750x faster than
5
+ the 'wav-decoder' npm module.
6
+
7
+ In addition, in contrast to 'wav-decoder' the result is returned directly instead
8
+ of with a promise.
9
+
10
+ This module combines the functionality of 'wav-decoder' and 'wav-encoder'.
11
+
12
+ Usage
13
+ -----
14
+
15
+ let fs = require('fs');
16
+ let wav = require('node-wav');
17
+
18
+ let buffer = fs.readFileSync('file.wav');
19
+ let result = wav.decode(buffer);
20
+ console.log(result.sampleRate);
21
+ console.log(result.channelData); // array of Float32Arrays
22
+
23
+ wav.encode(result.channelData, { sampleRate: result.sampleRate, float: true, bitDepth: 32 });
24
+
25
+ Data format
26
+ -----------
27
+
28
+ Data is always returned as Float32Arrays. While reading and writing 64-bit float
29
+ WAV files is supported, data is truncated to 32-bit floats.
30
+
31
+ Endianness
32
+ ----------
33
+
34
+ This module assumes a little endian CPU, which is true for pretty much every processor
35
+ these days (in particular Intel and ARM).
Binary file