@openclaw/whatsapp 2026.5.28 → 2026.5.31-beta.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.
Files changed (157) hide show
  1. package/dist/{access-control-Z0fYaWrx.js → access-control-C53zKYSN.js} +1 -1
  2. package/dist/{accounts-BMGM1RtF.js → accounts-DgViSyJx.js} +1 -0
  3. package/dist/{action-runtime-BdhkGtaP.js → action-runtime-Cyp5GNIT.js} +2 -2
  4. package/dist/action-runtime-api.js +1 -1
  5. package/dist/action-runtime.runtime.js +1 -1
  6. package/dist/api.js +9 -9
  7. package/dist/{approval-handler.runtime-C25wPeBf.js → approval-handler.runtime-BVmOu6x1.js} +1 -2
  8. package/dist/{auth-store-BrKb0mwT.js → auth-store-CZ22aNcV.js} +4 -2
  9. package/dist/{channel-D3y4A5Dd.js → channel-DA2BAIo5.js} +17 -64
  10. package/dist/channel-config-api.js +1 -1
  11. package/dist/channel-plugin-api.js +1 -1
  12. package/dist/{channel-react-action-Cd2qkLqp.js → channel-react-action-zvbaCnGe.js} +3 -3
  13. package/dist/{channel.runtime-C228XUjs.js → channel.runtime-Q1LZDB5s.js} +4 -4
  14. package/dist/{channel.setup-BJQyTUUP.js → channel.setup-DHXOo4h5.js} +2 -3
  15. package/dist/{config-schema-CsNDlDpL.js → config-schema-CROZuhT-.js} +16 -0
  16. package/dist/{connection-controller-mpPGmqGq.js → connection-controller-Bnm4INld.js} +2 -2
  17. package/dist/contract-api.js +1 -1
  18. package/dist/light-runtime-api.js +1 -1
  19. package/dist/{login-CE4UYnyO.js → login-2fuBM7Je.js} +4 -4
  20. package/dist/{login-qr-LBvhEes5.js → login-qr-B1o7GFy8.js} +10 -6
  21. package/dist/login-qr-runtime.js +1 -1
  22. package/dist/{monitor-Ccph7Y8M.js → monitor-BVRq04Dt.js} +36 -18
  23. package/dist/runtime-api.js +7 -7
  24. package/dist/{send-C4LG-Cl6.js → send-DSlVXKL_.js} +53 -41
  25. package/dist/{send-api-C66vkRl9.js → send-api-Bjn-h80j.js} +3 -2
  26. package/dist/{session-D8UW2Vbn.js → session-DyGWNClj.js} +1 -1
  27. package/dist/{setup-core-DpfT4K-2.js → setup-core-OvPMaAsx.js} +4 -4
  28. package/dist/{setup-finalize-CFnxX7la.js → setup-finalize-Dk23pfKc.js} +3 -3
  29. package/dist/setup-plugin-api.js +1 -1
  30. package/dist/{setup-surface-DRsmp0ZS.js → setup-surface-F-jVrH8u.js} +3 -3
  31. package/node_modules/@audio/decode-aac/LICENSE +9 -0
  32. package/node_modules/@audio/decode-aac/README.md +60 -0
  33. package/node_modules/@audio/decode-aac/decode-aac.d.ts +16 -0
  34. package/node_modules/@audio/decode-aac/decode-aac.js +391 -0
  35. package/node_modules/@audio/decode-aac/package.json +47 -0
  36. package/node_modules/@audio/decode-aac/src/aac.wasm.cjs +0 -0
  37. package/node_modules/@audio/decode-aiff/LICENSE +21 -0
  38. package/node_modules/@audio/decode-aiff/README.md +53 -0
  39. package/node_modules/@audio/decode-aiff/decode-aiff.d.ts +16 -0
  40. package/node_modules/@audio/decode-aiff/decode-aiff.js +583 -0
  41. package/node_modules/@audio/decode-aiff/package.json +42 -0
  42. package/node_modules/@audio/decode-amr/LICENSE +191 -0
  43. package/node_modules/@audio/decode-amr/README.md +65 -0
  44. package/node_modules/@audio/decode-amr/decode-amr.d.ts +16 -0
  45. package/node_modules/@audio/decode-amr/decode-amr.js +159 -0
  46. package/node_modules/@audio/decode-amr/package.json +48 -0
  47. package/node_modules/@audio/decode-amr/src/amr.wasm.cjs +0 -0
  48. package/node_modules/@audio/decode-caf/LICENSE +21 -0
  49. package/node_modules/@audio/decode-caf/README.md +55 -0
  50. package/node_modules/@audio/decode-caf/decode-caf.d.ts +16 -0
  51. package/node_modules/@audio/decode-caf/decode-caf.js +190 -0
  52. package/node_modules/@audio/decode-caf/package.json +43 -0
  53. package/node_modules/{audio-buffer → @audio/decode-flac}/LICENSE +5 -2
  54. package/node_modules/@audio/decode-flac/README.md +23 -0
  55. package/node_modules/@audio/decode-flac/decode-flac.d.ts +16 -0
  56. package/node_modules/@audio/decode-flac/decode-flac.js +2994 -0
  57. package/node_modules/@audio/decode-flac/meta.js +115 -0
  58. package/node_modules/@audio/decode-flac/package.json +49 -0
  59. package/node_modules/@audio/decode-mp3/LICENSE +25 -0
  60. package/node_modules/@audio/decode-mp3/README.md +23 -0
  61. package/node_modules/@audio/decode-mp3/decode-mp3.d.ts +16 -0
  62. package/node_modules/@audio/decode-mp3/decode-mp3.js +868 -0
  63. package/node_modules/@audio/decode-mp3/meta.js +143 -0
  64. package/node_modules/@audio/decode-mp3/package.json +50 -0
  65. package/node_modules/@audio/decode-opus/LICENSE +25 -0
  66. package/node_modules/@audio/decode-opus/README.md +23 -0
  67. package/node_modules/@audio/decode-opus/decode-opus.d.ts +16 -0
  68. package/node_modules/@audio/decode-opus/decode-opus.js +3179 -0
  69. package/node_modules/@audio/decode-opus/package.json +47 -0
  70. package/node_modules/@audio/decode-qoa/LICENSE +25 -0
  71. package/node_modules/@audio/decode-qoa/README.md +21 -0
  72. package/node_modules/@audio/decode-qoa/decode-qoa.d.ts +16 -0
  73. package/node_modules/@audio/decode-qoa/decode-qoa.js +278 -0
  74. package/node_modules/@audio/decode-qoa/package.json +46 -0
  75. package/node_modules/@audio/decode-vorbis/LICENSE +25 -0
  76. package/node_modules/@audio/decode-vorbis/README.md +23 -0
  77. package/node_modules/@audio/decode-vorbis/decode-vorbis.d.ts +16 -0
  78. package/node_modules/@audio/decode-vorbis/decode-vorbis.js +2984 -0
  79. package/node_modules/@audio/decode-vorbis/package.json +47 -0
  80. package/node_modules/@audio/decode-wav/decode-wav.js +104 -0
  81. package/node_modules/@audio/decode-wav/meta.js +114 -0
  82. package/node_modules/@audio/decode-wav/package.json +27 -0
  83. package/node_modules/@audio/decode-webm/LICENSE +21 -0
  84. package/node_modules/@audio/decode-webm/README.md +57 -0
  85. package/node_modules/@audio/decode-webm/decode-webm.d.ts +16 -0
  86. package/node_modules/@audio/decode-webm/decode-webm.js +3964 -0
  87. package/node_modules/@audio/decode-webm/package.json +51 -0
  88. package/node_modules/@audio/decode-wma/LICENSE +12 -0
  89. package/node_modules/@audio/decode-wma/README.md +76 -0
  90. package/node_modules/@audio/decode-wma/decode-wma.d.ts +33 -0
  91. package/node_modules/@audio/decode-wma/decode-wma.js +525 -0
  92. package/node_modules/@audio/decode-wma/package.json +47 -0
  93. package/node_modules/@audio/decode-wma/src/wma.wasm.cjs +0 -0
  94. package/node_modules/audio-decode/.claude/settings.json +204 -0
  95. package/node_modules/audio-decode/.github/workflows/test.js.yml +11 -20
  96. package/node_modules/audio-decode/.gitmodules +9 -0
  97. package/node_modules/audio-decode/audio-decode.d.ts +48 -10
  98. package/node_modules/audio-decode/audio-decode.js +193 -77
  99. package/node_modules/audio-decode/meta.js +11 -0
  100. package/node_modules/audio-decode/package.json +49 -21
  101. package/node_modules/audio-decode/readme.md +129 -29
  102. package/node_modules/audio-decode/stream.d.ts +15 -0
  103. package/node_modules/audio-decode/stream.js +1 -0
  104. package/node_modules/audio-decode/test.html +29 -10
  105. package/node_modules/lru-cache/dist/commonjs/browser/index.d.ts +2 -2
  106. package/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map +1 -1
  107. package/node_modules/lru-cache/dist/commonjs/browser/index.js.map +1 -1
  108. package/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map +1 -1
  109. package/node_modules/lru-cache/dist/commonjs/index.d.ts +2 -2
  110. package/node_modules/lru-cache/dist/commonjs/index.d.ts.map +1 -1
  111. package/node_modules/lru-cache/dist/commonjs/index.js.map +1 -1
  112. package/node_modules/lru-cache/dist/commonjs/index.min.js.map +1 -1
  113. package/node_modules/lru-cache/dist/commonjs/node/index.d.ts +2 -2
  114. package/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map +1 -1
  115. package/node_modules/lru-cache/dist/commonjs/node/index.js.map +1 -1
  116. package/node_modules/lru-cache/dist/commonjs/node/index.min.js.map +1 -1
  117. package/node_modules/lru-cache/dist/esm/browser/index.d.ts +2 -2
  118. package/node_modules/lru-cache/dist/esm/browser/index.d.ts.map +1 -1
  119. package/node_modules/lru-cache/dist/esm/browser/index.js.map +1 -1
  120. package/node_modules/lru-cache/dist/esm/browser/index.min.js.map +1 -1
  121. package/node_modules/lru-cache/dist/esm/index.d.ts +2 -2
  122. package/node_modules/lru-cache/dist/esm/index.d.ts.map +1 -1
  123. package/node_modules/lru-cache/dist/esm/index.js.map +1 -1
  124. package/node_modules/lru-cache/dist/esm/index.min.js.map +1 -1
  125. package/node_modules/lru-cache/dist/esm/node/index.d.ts +2 -2
  126. package/node_modules/lru-cache/dist/esm/node/index.d.ts.map +1 -1
  127. package/node_modules/lru-cache/dist/esm/node/index.js.map +1 -1
  128. package/node_modules/lru-cache/dist/esm/node/index.min.js.map +1 -1
  129. package/node_modules/lru-cache/package.json +1 -1
  130. package/node_modules/typebox/build/type/script/mapping.d.mts +5 -2
  131. package/node_modules/typebox/build/type/script/mapping.mjs +15 -8
  132. package/node_modules/typebox/build/type/script/parser.d.mts +3 -1
  133. package/node_modules/typebox/build/type/script/parser.mjs +2 -1
  134. package/node_modules/typebox/package.json +29 -29
  135. package/npm-shrinkwrap.json +156 -39
  136. package/openclaw.plugin.json +76 -0
  137. package/package.json +6 -6
  138. package/node_modules/audio-buffer/.eslintrc.json +0 -44
  139. package/node_modules/audio-buffer/.github/workflows/node.js.yml +0 -31
  140. package/node_modules/audio-buffer/.travis.yml +0 -7
  141. package/node_modules/audio-buffer/index.js +0 -76
  142. package/node_modules/audio-buffer/package.json +0 -37
  143. package/node_modules/audio-buffer/readme.md +0 -56
  144. package/node_modules/audio-decode/.eslintrc.json +0 -43
  145. package/node_modules/audio-decode/.travis.yml +0 -13
  146. package/node_modules/audio-decode/tea.yaml +0 -6
  147. package/node_modules/audio-decode/test-case.js +0 -11
  148. package/node_modules/audio-decode/test.js +0 -107
  149. package/node_modules/node-wav/README.md +0 -35
  150. package/node_modules/node-wav/file.wav +0 -0
  151. package/node_modules/node-wav/index.js +0 -291
  152. package/node_modules/node-wav/package.json +0 -29
  153. package/node_modules/node-wav/tests/file1.wav +0 -0
  154. package/node_modules/node-wav/tests/test.js +0 -66
  155. package/node_modules/node-wav/x.js +0 -12
  156. package/node_modules/node-wav/x.json +0 -86702
  157. package/node_modules/node-wav/x.js~ +0 -13
@@ -1,31 +0,0 @@
1
- # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
2
- # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
3
-
4
- name: Test
5
-
6
- on:
7
- push:
8
- branches: [ "master" ]
9
- pull_request:
10
- branches: [ "master" ]
11
-
12
- jobs:
13
- build:
14
-
15
- runs-on: ubuntu-latest
16
-
17
- strategy:
18
- matrix:
19
- node-version: [14.x, 16.x, 18.x]
20
- # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
21
-
22
- steps:
23
- - uses: actions/checkout@v3
24
- - name: Use Node.js ${{ matrix.node-version }}
25
- uses: actions/setup-node@v3
26
- with:
27
- node-version: ${{ matrix.node-version }}
28
- cache: 'npm'
29
- - run: npm ci
30
- - run: npm run build --if-present
31
- - run: npm test
@@ -1,7 +0,0 @@
1
- sudo: false
2
- language: node_js
3
- node_js:
4
- - 'node'
5
- - '6'
6
- - '5'
7
- - '4'
@@ -1,76 +0,0 @@
1
- /**
2
- * AudioBuffer class
3
- */
4
- export default class AudioBuffer {
5
- /**
6
- * Create AudioBuffer instance.
7
- * @constructor
8
- * @param {Object} options - buffer init options.
9
- * @param {number} options.length - buffer length in samples.
10
- * @param {number} options.sampleRate - buffer sample rate.
11
- * @param {number} options.numberOfChannels - number of channels.
12
- */
13
- constructor(options) {
14
- if (!options) throw TypeError('options argument is required')
15
- if (!options.sampleRate) throw TypeError('options.sampleRate is required')
16
- if (options.sampleRate < 3000 || options.sampleRate > 768000) throw TypeError('options.sampleRate must be within 3000..768000')
17
- if (!options.length) throw TypeError('options.length must be more than 0')
18
-
19
- this.sampleRate = options.sampleRate
20
- this.numberOfChannels = options.numberOfChannels || 1
21
- this.length = options.length | 0
22
- this.duration = this.length / this.sampleRate
23
-
24
- //data is stored as a planar sequence
25
- this._data = new Float32Array(this.length * this.numberOfChannels)
26
-
27
- //channels data is cached as subarrays
28
- this._channelData = []
29
- for (let c = 0; c < this.numberOfChannels; c++) {
30
- this._channelData.push(this._data.subarray(c * this.length, (c+1) * this.length))
31
- }
32
- }
33
-
34
- /**
35
- * Return data associated with the channel.
36
- * @param {number} channel - Channel index, starting from 0.
37
- * @return {Float32Array} Array containing the data.
38
- */
39
- getChannelData (channel) {
40
- if (channel >= this.numberOfChannels || channel < 0 || channel == null) throw Error('Cannot getChannelData: channel number (' + channel + ') exceeds number of channels (' + this.numberOfChannels + ')');
41
-
42
- return this._channelData[channel]
43
- }
44
-
45
-
46
- /**
47
- * Place data to the destination buffer, starting from the position.
48
- * @param {Float32Array} destination - Destination array to write data to.
49
- * @param {number} channelNumber - Channel to take data from.
50
- * @param {number} startInChannel - Data offset in channel to read from.
51
- */
52
- copyFromChannel (destination, channelNumber, startInChannel) {
53
- if (startInChannel == null) startInChannel = 0;
54
- var data = this._channelData[channelNumber]
55
- for (var i = startInChannel, j = 0; i < this.length && j < destination.length; i++, j++) {
56
- destination[j] = data[i];
57
- }
58
- }
59
-
60
-
61
- /**
62
- * Place data from the source to the channel, starting (in self) from the position.
63
- * @param {Float32Array | Array} source - source array to read data from.
64
- * @param {number} channelNumber - channel index to copy data to.
65
- * @param {number} startInChannel - offset in channel to copy data to.
66
- */
67
- copyToChannel (source, channelNumber, startInChannel) {
68
- var data = this._channelData[channelNumber]
69
-
70
- if (!startInChannel) startInChannel = 0;
71
-
72
- for (var i = startInChannel, j = 0; i < this.length && j < source.length; i++, j++) {
73
- data[i] = source[j];
74
- }
75
- }
76
- }
@@ -1,37 +0,0 @@
1
- {
2
- "name": "audio-buffer",
3
- "version": "5.0.0",
4
- "description": "AudioBuffer class for node/browser",
5
- "main": "index.js",
6
- "type": "module",
7
- "repository": {
8
- "type": "git",
9
- "url": "https://github.com/audiojs/audio-buffer"
10
- },
11
- "scripts": {
12
- "test": "node test"
13
- },
14
- "keywords": [
15
- "audio",
16
- "audiojs",
17
- "pcm",
18
- "dsp",
19
- "sound",
20
- "processing",
21
- "ndsamples",
22
- "ponyfill",
23
- "audio-buffer",
24
- "web-audio",
25
- "waa",
26
- "audiodata"
27
- ],
28
- "author": "Dmitry Iv <df.creative@gmail.com>",
29
- "license": "MIT",
30
- "bugs": {
31
- "url": "https://github.com/audiojs/audio-buffer/issues"
32
- },
33
- "homepage": "https://github.com/audiojs/audio-buffer",
34
- "devDependencies": {
35
- "tape": "^5.6.3"
36
- }
37
- }
@@ -1,56 +0,0 @@
1
- # audio-buffer [![test](https://github.com/audiojs/audio-buffer/actions/workflows/node.js.yml/badge.svg)](https://github.com/audiojs/audio-buffer/actions/workflows/node.js.yml) [![stable](https://img.shields.io/badge/stability-stable-brightgreen.svg)](http://github.com/badges/stability-badges)
2
-
3
- _AudioBuffer_ - basic audio data container class.
4
- Useful instead of _Buffer_ in audio streams, [**@audiojs**](https://github.com/audiojs) components, in webworkers, nodejs, other environments without audio context.
5
-
6
- Implementation is compatible with [Web Audio API AudioBuffer](https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer), can be used as ponyfill.
7
-
8
- ## Usage
9
-
10
- [![npm install audio-buffer](https://nodei.co/npm/audio-buffer.png?mini=true)](https://npmjs.org/package/audio-buffer/)
11
-
12
- ### new AudioBuffer(options)
13
-
14
- Create audio buffer from `options`.
15
-
16
- * `options.length` — number of samples, minimum is 1.
17
- * `options.sampleRate` — default sample rate is 44100.
18
- * `options.numberOfChannels` — default number of channels is 1.
19
-
20
- ### buffer.duration
21
-
22
- Duration of the underlying audio data, in seconds.
23
-
24
- ### buffer.length
25
-
26
- Number of samples per channel.
27
-
28
- ### buffer.sampleRate
29
-
30
- Default sample rate is 44100.
31
-
32
- ### buffer.numberOfChannels
33
-
34
- Default number of channels is 1.
35
-
36
- ### buffer.getChannelData(channel)
37
-
38
- Get array containing the data for the channel (not copied).
39
-
40
- ### buffer.copyFromChannel(destination, channelNumber, startInChannel=0)
41
-
42
- Place data from channel to destination Float32Array.
43
-
44
- ### buffer.copyToChannel(source, channelNumber, startInChannel=0)
45
-
46
- Place data from source Float32Array to the channel.
47
-
48
-
49
- ## Similar
50
-
51
- * [ndsamples](https://github.com/livejs/ndsamples) — audio-wrapper for ndarrays. A somewhat alternative approach to wrap audio data, based on ndarrays, used by some modules in [livejs](https://github.com/livejs).
52
- * [1](https://www.npmjs.com/package/audiobuffer), [2](https://www.npmjs.com/package/audio-buffer), [3](https://github.com/sebpiq/node-web-audio-api/blob/master/lib/AudioBuffer.js), [4](https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer) — other AudioBuffer implementations.
53
- * [audiodata](https://www.npmjs.com/package/audiodata) alternative data holder from @mohayonao.
54
-
55
-
56
- <p align=center><a href="https://github.com/krishnized/license/">🕉</a></p>
@@ -1,43 +0,0 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "node": true,
5
- "commonjs": true,
6
- "es6": true
7
- },
8
- "extends": "eslint:recommended",
9
- "rules": {
10
- "strict": 2,
11
- "indent": 0,
12
- "linebreak-style": 0,
13
- "quotes": 0,
14
- "semi": 0,
15
- "no-cond-assign": 1,
16
- "no-constant-condition": 1,
17
- "no-duplicate-case": 1,
18
- "no-empty": 1,
19
- "no-ex-assign": 1,
20
- "no-extra-boolean-cast": 1,
21
- "no-extra-semi": 1,
22
- "no-fallthrough": 1,
23
- "no-func-assign": 1,
24
- "no-global-assign": 1,
25
- "no-implicit-globals": 2,
26
- "no-inner-declarations": ["error", "functions"],
27
- "no-irregular-whitespace": 2,
28
- "no-loop-func": 1,
29
- "no-multi-str": 1,
30
- "no-mixed-spaces-and-tabs": 1,
31
- "no-proto": 1,
32
- "no-sequences": 1,
33
- "no-throw-literal": 1,
34
- "no-unmodified-loop-condition": 1,
35
- "no-useless-call": 1,
36
- "no-void": 1,
37
- "no-with": 2,
38
- "wrap-iife": 1,
39
- "no-redeclare": 1,
40
- "no-unused-vars": ["error", { "vars": "all", "args": "none" }],
41
- "no-sparse-arrays": 1
42
- }
43
- }
@@ -1,13 +0,0 @@
1
- sudo: false
2
- language: node_js
3
- node_js:
4
- - 'node'
5
- - '6'
6
- - '5'
7
- - '4'
8
- matrix:
9
- fast_finish: true
10
- allow_failures:
11
- - node_js: "4"
12
- - node_js: "5"
13
-
@@ -1,6 +0,0 @@
1
- # https://tea.xyz/what-is-this-file
2
- ---
3
- version: 1.0.0
4
- codeOwners:
5
- - '0x18CEa38f92a0E9b028ea27DD935B36A55Cf83b06'
6
- quorum: 1
@@ -1,11 +0,0 @@
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,107 +0,0 @@
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
- })
@@ -1,35 +0,0 @@
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