Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: replace Node.js Buffer with Uint8Array or portable replacement #7332

Merged
merged 12 commits into from
Oct 29, 2024

Conversation

AlCalzone
Copy link
Member

@AlCalzone AlCalzone commented Oct 29, 2024

Since the beginning of Z-Wave JS, we've been using Node.js's Buffer class to manipulate binary data. This works fine, but is not portable, and prevents us from exploring compatibility with other runtimes, or even doing things in the browser, e.g. for flashing controllers or modifying NVM contents.

Following Sindre Sorhus's example, this PR replaces the use of Buffers with Uint8Arrays where applicable.
In input positions where Z-Wave JS previously accepted Buffers, this is backwards compatible, as Buffer is a subclass of Uint8Array.
In output positions however, this is a breaking change. Where applications are affected by this, check if Buffer methods like readUInt32BE etc. are actually needed, or if changing the expected type to Uint8Array would be enough. This is usually the case when just passing the binary data around, or accessing its content by index.

In some cases, Z-Wave JS now uses an almost drop-in replacement for Node.js's Buffer, the new Bytes class exported from @zwave-js/shared. This is a portable subclass of Uint8Array with some additions to make its API more (but not 100%) compatible with Buffer. It supports most of the Buffer functionality like from(), concat(), toString() (with limitations), read/write[U]Int...LE/BE.

In both cases, if your application really needs a Buffer instance, you can simply convert Uint8Array or Bytes to a Buffer using Buffer.from(...).

@AlCalzone AlCalzone added the breaking This is a breaking change label Oct 29, 2024
@AlCalzone
Copy link
Member Author

@zwave-js-bot pack this

@zwave-js-bot
Copy link
Collaborator

👋 Hey @AlCalzone!
I've started to deploy this PR as a development build.
You can monitor the progress here.

@zwave-js-bot
Copy link
Collaborator

🎉 The packages have been published.
You can now install the test version with

@AlCalzone
Copy link
Member Author

@zwave-js-bot automerge

@zwave-js-bot zwave-js-bot merged commit e6638ac into master Oct 29, 2024
17 checks passed
@zwave-js-bot zwave-js-bot deleted the native-buffer branch October 29, 2024 12:27
AlCalzone added a commit that referenced this pull request Oct 30, 2024
### Breaking changes · [Migration guide](https://zwave-js.github.io/node-zwave-js/#/getting-started/migrating/v14)
* Replace Node.js Buffer with `Uint8Array` portable replacement class `Bytes` (#7332)
* `zwave-js` no longer loops up the package version at runtime (#7344)
* Changed some paths to be relative to `process.cwd()` instead of source location (#7345)

### Config file changes
* Add Aeotec TriSensor 8 (#7342)

### Changes under the hood
* Removed dependency on `fs-extra` in favor of `node:fs/promises` (#7335)
* `@zwave-js/config` no longer loops up the package version at runtime (#7343)
AlCalzone added a commit that referenced this pull request Oct 30, 2024
### Breaking changes · [Migration guide](https://zwave-js.github.io/node-zwave-js/#/getting-started/migrating/v14)
* Replace Node.js Buffer with `Uint8Array` portable replacement class `Bytes` (#7332)
* `zwave-js` no longer loops up the package version at runtime (#7344)
* Changed some paths to be relative to `process.cwd()` instead of source location (#7345)

### Config file changes
* Add Aeotec TriSensor 8 (#7342)

### Changes under the hood
* Removed dependency on `fs-extra` in favor of `node:fs/promises` (#7335)
* `@zwave-js/config` no longer loops up the package version at runtime (#7343)
AlCalzone added a commit that referenced this pull request Nov 5, 2024
In this release, a lot of the internal API was refactored to decrease interdependencies. Technically this results in a huge list of breaking changes, but most of those should not affect any application, unless very low-level APIs are frequently used. For example, Z-Wave JS UI and Z-Wave JS Server had just two small breaks. In addition, Z-Wave JS is now released as hybrid ESM/CJS packages.

### Breaking changes · [Migration guide](https://zwave-js.github.io/node-zwave-js/#/getting-started/migrating/v14)
* `Driver.installConfigUpdates()` now requires the external config directory to be configured (#7365)
* Replace Node.js Buffer with `Uint8Array` portable replacement class `Bytes` (#7332)
* `zwave-js` no longer loops up the package version at runtime (#7344)
* Changed some paths to be relative to `process.cwd()` instead of source location (#7345)
* Decouple CCs and messages from host, split parsing and creation, split ZWaveNode class (#7305)

### Config file changes
* Add Aeotec TriSensor 8 (#7342)

### Changes under the hood
* Decorators have been migrated from the legacy specification to the accepted proposal (#7360)
* Transition modules to hybrid ESM/CJS, switch to vitest for testing (#7349)
* Removed dependency on `fs-extra` in favor of `node:fs/promises` (#7335)
* `@zwave-js/config` no longer loops up the package version at runtime (#7343)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breaking This is a breaking change
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants