mirror of
https://github.com/pezkuwichain/bizinikiwi-connect.git
synced 2026-04-22 02:57:55 +00:00
feat: initial commit for bizinikiwi-connect with clean CI
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
# don't ever lint node_modules
|
||||
|
||||
node_modules
|
||||
|
||||
# don't lint build output (make sure it's set to your correct build folder name)
|
||||
|
||||
dist
|
||||
coverage
|
||||
|
||||
# don't lint .cache
|
||||
|
||||
.chains
|
||||
|
||||
src/connector/specs/_.json
|
||||
src/connector/specs/js/_.ts
|
||||
@@ -0,0 +1,14 @@
|
||||
dist
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
yarn-error.log*
|
||||
.nyc_output/
|
||||
.chains/
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
# /src/specs/*.json
|
||||
@@ -0,0 +1,10 @@
|
||||
yarn-error.log*
|
||||
.nyc_output/
|
||||
.chains/
|
||||
.eslintrc.cjs
|
||||
.eslintignore
|
||||
/coverage
|
||||
tsconfig.*
|
||||
extension-resolver.cjs
|
||||
|
||||
fix-package-type.sh
|
||||
@@ -0,0 +1 @@
|
||||
engine-strict=true
|
||||
@@ -0,0 +1,675 @@
|
||||
# Changelog
|
||||
|
||||
## 2.1.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [1666696]
|
||||
- @bizinikiwi/connect-known-chains@1.10.2
|
||||
|
||||
## 2.1.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3a98d1d]
|
||||
- @bizinikiwi/connect-known-chains@1.10.1
|
||||
|
||||
## 2.1.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [543b163]
|
||||
- Updated dependencies [3cc9e6d]
|
||||
- @bizinikiwi/connect-known-chains@1.10.0
|
||||
|
||||
## 2.1.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [ae70d90]
|
||||
- @bizinikiwi/connect-known-chains@1.9.3
|
||||
|
||||
## 2.1.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 92316c0: chore(deps-dev): bump vitest in the npm_and_yarn group
|
||||
|
||||
Bumps the npm_and_yarn group with 1 update: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).
|
||||
|
||||
Updates `vitest` from 2.1.4 to 2.1.9
|
||||
|
||||
- [Release notes](https://github.com/vitest-dev/vitest/releases)
|
||||
- [Commits](https://github.com/vitest-dev/vitest/commits/v2.1.9/packages/vitest)
|
||||
|
||||
***
|
||||
|
||||
updated-dependencies:
|
||||
|
||||
- dependency-name: vitest
|
||||
dependency-type: direct:development
|
||||
dependency-group: npm_and_yarn
|
||||
...
|
||||
|
||||
Signed-off-by: dependabot[bot] <support@github.com>
|
||||
|
||||
- Updated dependencies [92316c0]
|
||||
- Updated dependencies [e29f033]
|
||||
- @bizinikiwi/connect-extension-protocol@2.2.2
|
||||
- @bizinikiwi/connect-known-chains@1.9.2
|
||||
- @bizinikiwi/smoldot-discovery@2.0.2
|
||||
|
||||
## 2.1.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [8b9cb46]
|
||||
- @bizinikiwi/connect-known-chains@1.9.1
|
||||
|
||||
## 2.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [654165c]
|
||||
- @bizinikiwi/connect-known-chains@1.9.0
|
||||
|
||||
## 2.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [37910d7]
|
||||
- @bizinikiwi/connect-known-chains@1.8.1
|
||||
|
||||
## 2.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- ff20390: chore: update chainspecs
|
||||
- f6cef04: chore: update changesets
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 7ee9c18: chore: update smoldot to 2.0.34
|
||||
- 20eea99: chore: update smoldot
|
||||
- Updated dependencies [ff20390]
|
||||
- Updated dependencies [f6cef04]
|
||||
- @bizinikiwi/connect-known-chains@1.8.0
|
||||
|
||||
## 2.0.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 09f1c22: chore(deps-dev): bump vitest from 2.0.5 to 2.1.4
|
||||
|
||||
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 2.0.5 to 2.1.4.
|
||||
|
||||
- [Release notes](https://github.com/vitest-dev/vitest/releases)
|
||||
- [Commits](https://github.com/vitest-dev/vitest/commits/v2.1.4/packages/vitest)
|
||||
|
||||
***
|
||||
|
||||
updated-dependencies:
|
||||
|
||||
- dependency-name: vitest
|
||||
dependency-type: direct:development
|
||||
update-type: version-update:semver-minor
|
||||
...
|
||||
|
||||
Signed-off-by: dependabot[bot] <support@github.com>
|
||||
|
||||
- Updated dependencies [09f1c22]
|
||||
- Updated dependencies [9107ccc]
|
||||
- @bizinikiwi/connect-extension-protocol@2.2.1
|
||||
- @bizinikiwi/connect-known-chains@1.7.0
|
||||
- @bizinikiwi/smoldot-discovery@2.0.1
|
||||
|
||||
## 2.0.0
|
||||
|
||||
### Major Changes
|
||||
|
||||
- e2a5cef: ## Breaking Changes
|
||||
|
||||
- Modified `addChain` and `addWellKnownChain` methods:
|
||||
- Now accept a single `options` object parameter instead of separate `jsonRpcCallback` and `databaseContent` parameters
|
||||
- The `jsonRpcCallback` is now passed as `options.jsonRpcCallback`
|
||||
- The `databaseContent` is now passed as `options.databaseContent`
|
||||
- Removed `JsonRpcCallback` type export. Use the callback type from the `options` parameter of `addChain` and `addWellKnownChain` instead.
|
||||
- Updated peer dependency for `@bizinikiwi/smoldot-discovery` to "^2"
|
||||
|
||||
## New Features
|
||||
|
||||
- Added new methods to the Chain interface to conform with smoldot's interface:
|
||||
- `nextJsonRpcResponse`: Returns a promise that resolves with the next JSON-RPC response
|
||||
- `jsonRpcResponses`: Returns an async iterable of JSON-RPC responses
|
||||
|
||||
## Other Changes
|
||||
|
||||
- Updated internal implementation to use Effect for streaming JSON RPC responses in a Queue.
|
||||
- Updated error handling to include `QueueFullError`.
|
||||
|
||||
## Migration Guide
|
||||
|
||||
Users of this package will need to update their code to use the new method signatures for `addChain` and `addWellKnownChain`, and adapt to the removed `JsonRpcCallback` type export. Please refer to the updated documentation for the new usage patterns.
|
||||
|
||||
When upgrading, ensure you're using version 3 or higher of `@bizinikiwi/smoldot-discovery` as a peer dependency.
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [e2a5cef]
|
||||
- @bizinikiwi/smoldot-discovery@2.0.0
|
||||
|
||||
## 1.3.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a1a7412]
|
||||
- @bizinikiwi/connect-known-chains@1.6.0
|
||||
|
||||
## 1.3.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 198b375: chore: catalog and upgrade papi dependencies
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [f2163cb]
|
||||
- Updated dependencies [198b375]
|
||||
- Updated dependencies [0de443d]
|
||||
- @bizinikiwi/connect-known-chains@1.5.0
|
||||
- @bizinikiwi/connect-extension-protocol@2.2.0
|
||||
- @bizinikiwi/smoldot-discovery@1.2.0
|
||||
|
||||
## 1.2.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- d0316d7: update docs
|
||||
- Updated dependencies [972af65]
|
||||
- Updated dependencies [b2c7737]
|
||||
- @bizinikiwi/connect-known-chains@1.4.1
|
||||
|
||||
## 1.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- b476e7e: update build system to tshy
|
||||
worker is now exported under "browser" conditional export instead of node. "node" conditional export removed.
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [6014927]
|
||||
- Updated dependencies [b476e7e]
|
||||
- @bizinikiwi/connect-known-chains@1.4.0
|
||||
- @bizinikiwi/connect-extension-protocol@2.1.0
|
||||
- @bizinikiwi/smoldot-discovery@1.1.0
|
||||
|
||||
## 1.1.3
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [0bd81c2]
|
||||
- Updated dependencies [076439e]
|
||||
- Updated dependencies [bc9fe42]
|
||||
- @bizinikiwi/connect-known-chains@1.3.0
|
||||
|
||||
## 1.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 0b3053e: chore(deps-dev): bump vitest from 1.6.0 to 2.0.5
|
||||
|
||||
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 1.6.0 to 2.0.5.
|
||||
|
||||
- [Release notes](https://github.com/vitest-dev/vitest/releases)
|
||||
- [Commits](https://github.com/vitest-dev/vitest/commits/v2.0.5/packages/vitest)
|
||||
|
||||
***
|
||||
|
||||
updated-dependencies:
|
||||
|
||||
- dependency-name: vitest
|
||||
dependency-type: direct:development
|
||||
update-type: version-update:semver-major
|
||||
...
|
||||
|
||||
Signed-off-by: dependabot[bot] <support@github.com>
|
||||
|
||||
- Updated dependencies [1049be1]
|
||||
- @bizinikiwi/connect-known-chains@1.2.2
|
||||
|
||||
## 1.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 80187a0: docs(bizinikiwi-connect): add pezkuwijs example
|
||||
- e8fef4e: update docs
|
||||
- Updated dependencies [897f553]
|
||||
- Updated dependencies [e8fef4e]
|
||||
- Updated dependencies [0ce9864]
|
||||
- Updated dependencies [4a45295]
|
||||
- Updated dependencies [4a45295]
|
||||
- @bizinikiwi/connect-known-chains@1.2.1
|
||||
- @bizinikiwi/smoldot-discovery@1.0.1
|
||||
|
||||
## 1.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- e35a0e8: add paseo testnet
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- cef7d50: update chainspecs
|
||||
- Updated dependencies [e35a0e8]
|
||||
- Updated dependencies [cef7d50]
|
||||
- Updated dependencies [188bf5b]
|
||||
- Updated dependencies [4123a5e]
|
||||
- @bizinikiwi/connect-known-chains@1.2.0
|
||||
- @bizinikiwi/smoldot-discovery@1.0.0
|
||||
|
||||
## 1.0.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3efab80]
|
||||
- @bizinikiwi/connect-known-chains@1.1.11
|
||||
|
||||
## 1.0.8
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 444503f: chore: update READMEs across repo
|
||||
- Updated dependencies [444503f]
|
||||
- Updated dependencies [f03e960]
|
||||
- @bizinikiwi/smoldot-discovery@0.0.9
|
||||
- @bizinikiwi/connect-known-chains@1.1.10
|
||||
|
||||
## 1.0.7
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [c358405]
|
||||
- Updated dependencies [bdd728d]
|
||||
- @bizinikiwi/smoldot-discovery@0.0.8
|
||||
|
||||
## 1.0.6
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [78ca884]
|
||||
- @bizinikiwi/smoldot-discovery@0.0.7
|
||||
|
||||
## 1.0.5
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 796c168: chore: update pezkuwi-api packages
|
||||
- Updated dependencies [c69adf0]
|
||||
- @bizinikiwi/connect-known-chains@1.1.9
|
||||
|
||||
## 1.0.4 - 2024-07-02
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [932dc47]
|
||||
- @bizinikiwi/connect-known-chains@1.1.8
|
||||
|
||||
### Changed
|
||||
|
||||
## 1.0.3 - 2024-06-27
|
||||
|
||||
- Update internal usage of discovery protocol to use @bizinikiwi/smoldot-discovery instead of @bizinikiwi/connect-discovery
|
||||
- Bump light client extension helpers
|
||||
|
||||
## 1.0.2 - 2024-06-17
|
||||
|
||||
- Bump light client extension helpers
|
||||
|
||||
## 1.0.1 - 2024-06-17
|
||||
|
||||
- Version bump
|
||||
|
||||
## 1.0.0 - 2024-07-26
|
||||
|
||||
### Breaking
|
||||
|
||||
- Drop support for `lightClient:requestProvider` events [#2221](https://github.com/pezkuwichain/bizinikiwi-connect/pull/2221)
|
||||
|
||||
### Changed
|
||||
|
||||
- Add support for @bizinikiwi/discovery protocol [#2221](https://github.com/pezkuwichain/bizinikiwi-connect/pull/2221)
|
||||
|
||||
## 0.8.11 - 2024-05-24
|
||||
|
||||
- Update `@bizinikiwi/light-client-extension-helpers` to v0.1.0
|
||||
- Update `@bizinikiwi/connect-known-chains` to v1.1.5
|
||||
|
||||
### Changed
|
||||
|
||||
## 0.8.10 - 2024-04-12
|
||||
|
||||
- Update `@bizinikiwi/light-client-extension-helpers` to v0.0.5
|
||||
- Update `@bizinikiwi/connect-known-chains` to v1.1.4
|
||||
|
||||
## 0.8.9 - 2024-04-10
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @pezkuwi-api/json-rpc-provider-proxy to v0.0.1 [#2072](https://github.com/pezkuwichain/bizinikiwi-connect/pull/2072)
|
||||
- Update @pezkuwi-api/bizinikiwi-client to v0.0.1 [#2072](https://github.com/pezkuwichain/bizinikiwi-connect/pull/2072)
|
||||
|
||||
## 0.8.8 - 2024-03-12
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 2.0.22](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#2022---2024-03-04) [#1936](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1936)
|
||||
- Update `@bizinikiwi/light-client-extension-helpers` to v0.0.4 [#1971](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1971)
|
||||
|
||||
## 0.8.7 - 2024-02-23
|
||||
|
||||
### Changed
|
||||
|
||||
- Update `@bizinikiwi/light-client-extension-helpers` to v0.0.3 [#1875](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1875)
|
||||
|
||||
## 0.8.6 - 2024-02-21
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 2.0.21](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#2021---2024-02-06) [#1843](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1843)
|
||||
- Use LightClient provider announced by the extension with custom events [#1845](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1845)
|
||||
|
||||
## 0.8.5 - 2024-01-18
|
||||
|
||||
### Changed
|
||||
|
||||
- Use `@bizinikiwi/light-client-extension-helpers` ([#1720](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1720))
|
||||
- Update smoldot@[version 2.0.17](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#2017---2024-01-17) [#1767](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1767)
|
||||
|
||||
## 0.8.4 - 2024-01-02
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 2.0.16](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#2016---2023-12-29) [#1708](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1708)
|
||||
- Use `@pezkuwi-api/light-client-extension-helpers@0.0.1-4bc9bd71f8f37f800fec7a42775f403271903870.1.0` ([#1709](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1709))
|
||||
|
||||
## 0.8.3 - 2023-12-07
|
||||
|
||||
### Changed
|
||||
|
||||
- Use `@pezkuwi-api/light-client-extension-helpers/web-page` ([#1603](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1603))
|
||||
|
||||
## 0.8.2 - 2023-12-06
|
||||
|
||||
### Changed
|
||||
|
||||
- Update `@bizinikiwi/connect-known-chains@^1.0.2`
|
||||
|
||||
## 0.8.1 - 2023-11-30
|
||||
|
||||
### Changed
|
||||
|
||||
- Use chain specifications from `@bizinikiwi/connect-known-chains` ([#1647](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1647))
|
||||
|
||||
## 0.8.0 - 2023-11-28
|
||||
|
||||
### Breaking
|
||||
|
||||
- Add `chain.addChain(...)` to bizinikiwi connect API ([#1604](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1604))
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 2.0.13](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#2013---2023-11-28) ([#1641](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1641))
|
||||
|
||||
## 0.7.35 - 2023-11-12
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 2.0.7](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#207---2023-11-02)[#1602](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1602)
|
||||
- Fix code-spliting issue ([#1605](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1605))
|
||||
- Update dependencies ([#1606](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1606))
|
||||
|
||||
## 0.7.34 - 2023-10-18
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 2.0.6](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#201---2023-09-08)[#1572](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1572)
|
||||
|
||||
## 0.7.33 - 2023-09-26
|
||||
|
||||
### Changed
|
||||
|
||||
- Use dynamic imports for well known chain ([#1560](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1560))
|
||||
|
||||
## 0.7.32 - 2023-09-14
|
||||
|
||||
### Changed
|
||||
|
||||
- Add `@bizinikiwi/connect/worker` ([#1525](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1525))
|
||||
- Update smoldot@[version 2.0.1](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#201---2023-09-08)[#1534](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1534)
|
||||
|
||||
## 0.7.31 - 2023-07-25
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.13](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#1013---2023-07-16)[#1493](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1493)
|
||||
|
||||
## 0.7.30 - 2023-07-10
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.11](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#1011---2023-06-25)[#1463](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1463)
|
||||
|
||||
## 0.7.28 - 2023-06-11
|
||||
|
||||
### Fixed
|
||||
|
||||
- Publish `src` folder.
|
||||
|
||||
## 0.7.27 - 2023-06-11
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.9](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md)[#1438](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1438)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Avoid importing json files ([#1437](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1437))
|
||||
|
||||
## 0.7.26 - 2023-05-04
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.4](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#104---2023-05-03)[#1429](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1429)
|
||||
|
||||
## 0.7.25 - 2023-05-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.3](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#102---2023-04-12) [#1426](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1426)
|
||||
|
||||
## 0.7.24 - 2023-04-20
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.2](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#102---2023-04-12)[#1420](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1420)
|
||||
- Switch Pezkuwichain bootnodes from WS to WSS([#1418](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1418))
|
||||
- Switch to DNS name based bootnodes for Pezkuwichain ([#1413](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1413))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix broken link in docs ([#1417](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1417))
|
||||
|
||||
## 0.7.23 - 2023-04-04
|
||||
|
||||
### Changed
|
||||
|
||||
- Update smoldot@[version 1.0.1](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#101---2023-03-29)[#1410](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1410)
|
||||
|
||||
## 0.7.22 - 2023-03-21
|
||||
|
||||
### Changed
|
||||
|
||||
- Stop using dynamic imports in order to import the "well-known" specs, due to the fact that not all bundlers are able to handle dynamic imports gracefully on package's code.
|
||||
|
||||
## 0.7.21 - 2023-03-16
|
||||
|
||||
- Update smoldot to [version 1.0.0](https://github.com/smol-dot/smoldot/blob/main/wasm-node/CHANGELOG.md#100---2022-03-12). ([#1394](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1394))
|
||||
|
||||
## 0.7.20 - 2023-02-17
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to smoldot@[version 0.7.11](https://github.com/smol-dot/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0711---2022-02-13). ([#1389](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1389))
|
||||
|
||||
## 0.7.19 - 2023-01-13
|
||||
|
||||
- Update checkpoints in chain specification, in order to correct the breaking of bizinikiwi-connect that occurred due to an operational issue on the Zagros validators(execution of a sudo initializer.forceApprove operation at block #14192316 to recover consensus). ([#1377](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1377))
|
||||
|
||||
## 0.7.18 - 2022-12-13
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.7.9](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#079---2022-11-28). ([#1361](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1361))
|
||||
|
||||
## 0.7.17 - 2022-11-18
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.7.7](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#077---2022-11-11). ([#1345](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1345))
|
||||
|
||||
## 0.7.16 - 2022-10-31
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.7.5](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#075---2022-10-31). ([#1331](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1331))
|
||||
|
||||
## 0.7.15 - 2022-10-17
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.7.2](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#072---2022-10-12). ([#1300](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1300))
|
||||
|
||||
## 0.7.14 - 2022-09-21
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.34](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0634---2022-09-20). ([#1261](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1261))
|
||||
|
||||
## 0.7.13 - 2022-09-14
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.33](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0633---2022-09-13). ([#1248](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1248))
|
||||
|
||||
## 0.7.12 - 2022-09-12
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.32](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0632---2022-09-07). ([#1244](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1244))
|
||||
|
||||
## 0.7.11 - 2022-08-18
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.30](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0630---2022-08-12). ([#1213](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1213))
|
||||
|
||||
## 0.7.10 - 2022-08-01
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.27](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0627---2022-07-29). ([#1182](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1182))
|
||||
|
||||
## 0.7.9 - 2022-07-19
|
||||
|
||||
### Changed
|
||||
|
||||
- Alter configuration for supporting both ESM and CommonJS (CJS) ([#1160](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1160))
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.25](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0625---2022-07-18). ([#1160](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1160))
|
||||
|
||||
## 0.7.8 - 2022-07-11
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.23](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0623---2022-07-11). ([#1146](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1146))
|
||||
|
||||
## 0.7.7 - 2022-06-17
|
||||
|
||||
### Changed
|
||||
|
||||
- Update the Pezkuwichain chain specification to start after a forced authorities change. ([#1107](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1107))
|
||||
|
||||
## 0.7.6 - 2022-06-16
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.19](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0619---2022-06-14). ([#1101](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1101))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed race condition causing failure to detect when the chain initialization fails when the extension is present ([#1093](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1093)).
|
||||
|
||||
## 0.7.5 - 2022-05-17
|
||||
|
||||
### Added
|
||||
|
||||
- Added an optional configuration to `createScClient` that allows forcing the use of the embedded client, and customizing the maximum log level to use while the embedded client client is in use, allowing for better debuggability. ([#1027](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1027), [#1044](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1044))
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.16](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0616---2022-05-16) ([#1048](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1048))
|
||||
|
||||
## 0.7.4 - 2022-05-05
|
||||
|
||||
### Changed
|
||||
|
||||
- Debug logs are no longer printed in the console. This should considerably decrease the number of messages being printed. ([#1027](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1027))
|
||||
|
||||
## 0.7.3 - 2022-05-02
|
||||
|
||||
### Changed
|
||||
|
||||
- Replace the `pezkuwichain_v2_1` well-known chain with `pezkuwichain_v2_2` ([#1010](https://github.com/pezkuwichain/bizinikiwi-connect/pull/1010))
|
||||
- The reason why the extension rejects a chain is now explained in the exception being thrown. ([#968](https://github.com/pezkuwichain/bizinikiwi-connect/pull/968))
|
||||
|
||||
## 0.7.2 - 2022-04-07
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.15](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#0615---2022-04-07) ([#955](https://github.com/pezkuwichain/bizinikiwi-connect/pull/955))
|
||||
|
||||
## 0.7.0 - 2022-04-06
|
||||
|
||||
### Breaking
|
||||
|
||||
- Removed `createPezkuwiJsScClient` from the API, as the `ScProvider` has been upstreamed to `@pezkuwi/rpc-provider`. ([#909](https://github.com/pezkuwichain/bizinikiwi-connect/pull/909))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed an issue when calling `chain.remove()` where it would throw an `AlreadyDestroyedError`.
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.13](https://github.com/pezkuwichain/smoldot/blob/315c3683d3beee1c8f5884261f761530ddf7ef53/bin/wasm-node/CHANGELOG.md#0613---2022-04-05) ([#919](https://github.com/pezkuwichain/bizinikiwi-connect/pull/919))
|
||||
- The smoldot background worker will now bound its CPU usage to 50% of one CPU on average. ([#900](https://github.com/pezkuwichain/bizinikiwi-connect/pull/900))
|
||||
|
||||
## 0.6.4, 0.6.5 - 2022-03-25
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.9](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#069---2022-03-25) ([#901](https://github.com/pezkuwichain/bizinikiwi-connect/pull/901))
|
||||
|
||||
## 0.6.3 - 2022-03-23
|
||||
|
||||
### Added
|
||||
|
||||
- The `isExtensionPresent` constant indicates whether the bizinikiwi-connect extension has been detected. ([#869](https://github.com/pezkuwichain/bizinikiwi-connect/pull/869))
|
||||
|
||||
### Changed
|
||||
|
||||
- Update @bizinikiwi/smoldot-light to [version 0.6.8](https://github.com/pezkuwichain/smoldot/blob/main/bin/wasm-node/CHANGELOG.md#068---2022-03-23) ([#890](https://github.com/pezkuwichain/bizinikiwi-connect/pull/890))
|
||||
- Replace the `pezkuwichain_v2` well-known chain with `pezkuwichain_v2_1` ([#879](https://github.com/pezkuwichain/bizinikiwi-connect/pull/879))
|
||||
- The inline client ("SmoldotProvider") no longer tries to connect to non-WebSocket addresses. This was previously the case when using the library from within NodeJS. This change ensures consistency in terms of blockchain connectivity between browsers and NodeJS. ([#863](https://github.com/pezkuwichain/bizinikiwi-connect/pull/863))
|
||||
- The error message when passing an invalid well-known chain name to `addWellKnownChain` is no longer confusing. ([#873](https://github.com/pezkuwichain/bizinikiwi-connect/pull/873))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed wrong unsubscription JSON-RPC methods being used when calling `ProviderInterface.disconnect()` ([#842](https://github.com/pezkuwichain/bizinikiwi-connect/pull/842)).
|
||||
@@ -0,0 +1,676 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
Substrate Connect Copyright (C) 2020-2022 Parity Technologies Ltd
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
<br /><br />
|
||||
|
||||
<div align="center">
|
||||
<h1 align="center">@bizinikiwi/connect</h1>
|
||||
<h4 align="center">An NPM package that offers an innovative way to interact with <a href="https://bizinikiwi.dev/">Bizinikiwi</a>-based blockchains directly in your browser.</h4>
|
||||
<p align="center">
|
||||
<a href="https://www.npmjs.com/package/@bizinikiwi/connect">
|
||||
<img alt="npm" src="https://img.shields.io/npm/v/@bizinikiwi/connect" />
|
||||
</a>
|
||||
<a href="https://github.com/pezkuwichain/bizinikiwi-connect/blob/master/LICENSE">
|
||||
<img alt="GPL-3.0-or-later" src="https://img.shields.io/npm/l/@bizinikiwi/connect" />
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<br /><br />
|
||||
|
||||
The primary implementation of the light-client provider for any Bizinikiwi-based chain.
|
||||
|
||||
## Using `@bizinikiwi/connect` for library authors
|
||||
|
||||
The `connect` package searches for a light client provider via the discovery protocol. If none is found, it will initiate a smoldot instance in the user's browser tab.
|
||||
|
||||
### Example Usage
|
||||
|
||||
To connect to a well-known chain ('pezkuwi', 'ksmcc3', 'zagros2', 'pezkuwichain_v2_2'):
|
||||
|
||||
```js
|
||||
import { createScClient, WellKnownChain } from "@bizinikiwi/connect"
|
||||
|
||||
const scClient = createScClient()
|
||||
const chain = await scClient.addWellKnownChain(
|
||||
WellKnownChain.zagros2,
|
||||
function jsonRpcCallback(response) {
|
||||
console.log("response", response)
|
||||
},
|
||||
)
|
||||
|
||||
chain.sendJsonRpc(
|
||||
'{"jsonrpc":"2.0","id":"1","method":"system_health","params":[]}',
|
||||
)
|
||||
```
|
||||
|
||||
To connect to a custom Bizinikiwi chain using its name and chainspec:
|
||||
|
||||
```js
|
||||
import { createScClient } from "@bizinikiwi/connect"
|
||||
import myJsonChainSpec from "./myBizinikiwiChainSpec.json"
|
||||
|
||||
const myChainSpec = JSON.stringify(myJsonChainSpec)
|
||||
|
||||
const scClient = createScClient()
|
||||
const chain = await scClient.addChain(
|
||||
myChainSpec,
|
||||
function jsonRpcCallback(response) {
|
||||
console.log("response", response)
|
||||
},
|
||||
)
|
||||
|
||||
chain.sendJsonRpc(
|
||||
'{"jsonrpc":"2.0","id":"1","method":"system_health","params":[]}',
|
||||
)
|
||||
```
|
||||
|
||||
### Connecting to a Parachain
|
||||
|
||||
To connect to a parachain, first instantiate the relay chain it is connected to, then instantiate the parachain on the same relay chain. The following example connects to a parachain on the Zagros test network:
|
||||
|
||||
```js
|
||||
import { createScClient, WellKnownChain } from "@bizinikiwi/connect"
|
||||
import jsonParachainSpec from "./myParaChainSpec.json"
|
||||
|
||||
const parachainSpec = JSON.stringify(jsonParachainSpec)
|
||||
|
||||
const scClient = createScClient()
|
||||
const relayChain = await scClient.addWellKnownChain(WellKnownChain.zagros2)
|
||||
const parachain = await relayChain.addChain(
|
||||
parachainSpec,
|
||||
function jsonRpcCallback(response) {
|
||||
console.log("response", response)
|
||||
},
|
||||
)
|
||||
|
||||
parachain.sendJsonRpc(
|
||||
'{"jsonrpc":"2.0","id":"1","method":"system_health","params":[]}',
|
||||
)
|
||||
```
|
||||
|
||||
### PezkuwiJs Example
|
||||
|
||||
```sh
|
||||
yarn add @pezkuwi/rpc-provider
|
||||
yarn add @pezkuwi/api
|
||||
```
|
||||
|
||||
```ts
|
||||
import { ScProvider } from "@pezkuwi/rpc-provider/bizinikiwi-connect"
|
||||
import * as Sc from "@bizinikiwi/connect"
|
||||
import { ApiPromise } from "@pezkuwi/api"
|
||||
|
||||
// Connect to pezkuwi relay chain
|
||||
const provider = new ScProvider(Sc, Sc.WellKnownChain.pezkuwi)
|
||||
await provider.connect()
|
||||
const api = await ApiPromise.create({ provider })
|
||||
|
||||
// Connect to parachain
|
||||
const provider2 = new ScProvider(Sc, Sc.WellKnownChain.people, provider)
|
||||
await provider2.connect()
|
||||
const api2 = await ApiPromise.create({ provider })
|
||||
```
|
||||
|
||||
## Scripts
|
||||
|
||||
- `pnpm test` to run the unit tests
|
||||
- `pnpm build` to build @bizinikiwi-connect
|
||||
- `pnpm lint` to run linter for @bizinikiwi-connect
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"name": "@bizinikiwi/connect",
|
||||
"version": "2.1.9",
|
||||
"description": "Bizinikiwi-connect to Smoldot clients. Using either bizinikiwi extension with predefined clients or an internal smoldot client based on chainSpecs provided.",
|
||||
"author": "Parity Team <admin@parity.io>",
|
||||
"license": "GPL-3.0-only",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "module",
|
||||
"main": "./dist/commonjs/index.js",
|
||||
"module": "./dist/esm/index.js",
|
||||
"types": "./dist/commonjs/index.d.ts",
|
||||
"exports": {
|
||||
"./package.json": "./package.json",
|
||||
".": {
|
||||
"browser": {
|
||||
"types": "./dist/browser/index.d.ts",
|
||||
"default": "./dist/browser/index.js"
|
||||
},
|
||||
"import": {
|
||||
"@bizinikiwi-connect/source": "./src/index.ts",
|
||||
"types": "./dist/esm/index.d.ts",
|
||||
"default": "./dist/esm/index.js"
|
||||
},
|
||||
"require": {
|
||||
"types": "./dist/commonjs/index.d.ts",
|
||||
"default": "./dist/commonjs/index.js"
|
||||
}
|
||||
},
|
||||
"./worker": {
|
||||
"browser": {
|
||||
"types": "./dist/browser/worker.d.ts",
|
||||
"default": "./dist/browser/worker.js"
|
||||
},
|
||||
"import": {
|
||||
"@bizinikiwi-connect/source": "./src/worker.ts",
|
||||
"types": "./dist/esm/worker.d.ts",
|
||||
"default": "./dist/esm/worker.js"
|
||||
},
|
||||
"require": {
|
||||
"types": "./dist/commonjs/worker.d.ts",
|
||||
"default": "./dist/commonjs/worker.js"
|
||||
}
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"tshy": {
|
||||
"project": "./tsconfig.build.json",
|
||||
"exports": {
|
||||
"./package.json": "./package.json",
|
||||
".": "./src/index.ts",
|
||||
"./worker": "./src/worker.ts"
|
||||
},
|
||||
"esmDialects": [
|
||||
"browser"
|
||||
],
|
||||
"sourceDialects": [
|
||||
"@bizinikiwi-connect/source"
|
||||
],
|
||||
"exclude": [
|
||||
"src/**/*.test.ts"
|
||||
]
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/pezkuwichain/bizinikiwi-connect.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/pezkuwichain/bizinikiwi-connect/issues"
|
||||
},
|
||||
"homepage": "https://github.com/pezkuwichain/bizinikiwi-connect#readme",
|
||||
"scripts": {
|
||||
"prepare": "corepack pnpm turbo build",
|
||||
"deep-clean": "npm run clean && rimraf dist node_modules",
|
||||
"clean": "rimraf dist .tshy .tshy-build",
|
||||
"build": "npm run clean && tshy",
|
||||
"test": "vitest run --dangerouslyIgnoreUnhandledErrors --environment jsdom",
|
||||
"lint": "eslint . --ext .js,.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@bizinikiwi/connect-extension-protocol": "^2.2.2",
|
||||
"@bizinikiwi/connect-known-chains": "^1.10.3",
|
||||
"@bizinikiwi/smoldot-discovery": "^2.0.3",
|
||||
"smoldot": "^2.0.34"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "5.6.2",
|
||||
"vitest": "^2.1.9"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
import { WellKnownChain } from "./types.js"
|
||||
|
||||
const chains: Map<WellKnownChain, Promise<{ chainSpec: string }>> = new Map()
|
||||
|
||||
export async function getSpec(chain: string): Promise<string> {
|
||||
if (!Object.keys(WellKnownChain).includes(chain))
|
||||
throw new Error("Invalid chain name")
|
||||
|
||||
const knownChain = chain as WellKnownChain
|
||||
if (!chains.has(knownChain))
|
||||
// Dynamic imports needs to be explicit for ParcelJS
|
||||
// See https://github.com/parcel-bundler/parcel/issues/125
|
||||
switch (knownChain) {
|
||||
case WellKnownChain.pezkuwi: {
|
||||
chains.set(
|
||||
WellKnownChain.pezkuwi,
|
||||
import("@bizinikiwi/connect-known-chains/pezkuwi"),
|
||||
)
|
||||
break
|
||||
}
|
||||
case WellKnownChain.ksmcc3: {
|
||||
chains.set(
|
||||
WellKnownChain.ksmcc3,
|
||||
import("@bizinikiwi/connect-known-chains/ksmcc3"),
|
||||
)
|
||||
break
|
||||
}
|
||||
case WellKnownChain.zagros2: {
|
||||
chains.set(
|
||||
WellKnownChain.zagros2,
|
||||
import("@bizinikiwi/connect-known-chains/zagros2"),
|
||||
)
|
||||
break
|
||||
}
|
||||
case WellKnownChain.pezkuwichain_v2_2: {
|
||||
chains.set(
|
||||
WellKnownChain.pezkuwichain_v2_2,
|
||||
import("@bizinikiwi/connect-known-chains/pezkuwichain_v2_2"),
|
||||
)
|
||||
break
|
||||
}
|
||||
case WellKnownChain.paseo: {
|
||||
chains.set(
|
||||
WellKnownChain.paseo,
|
||||
import("@bizinikiwi/connect-known-chains/paseo"),
|
||||
)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return (await chains.get(knownChain)!).chainSpec
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import type { SmoldotExtensionAPI } from "@bizinikiwi/smoldot-discovery/types"
|
||||
import {
|
||||
createScClient as smoldotScClient,
|
||||
type Config as EmbeddedNodeConfig,
|
||||
} from "./smoldot-light.js"
|
||||
import type { ScClient } from "./types.js"
|
||||
import { getSmoldotExtensionProviders } from "@bizinikiwi/smoldot-discovery"
|
||||
|
||||
export * from "./types.js"
|
||||
export type { EmbeddedNodeConfig }
|
||||
|
||||
/**
|
||||
* Configuration that can be passed to {createScClient}.
|
||||
*/
|
||||
export interface Config {
|
||||
/**
|
||||
* If `true`, then the client will always use a node embedded within the page and never use
|
||||
* the bizinikiwi-connect extension.
|
||||
*
|
||||
* Defaults to `false`.
|
||||
*/
|
||||
forceEmbeddedNode?: boolean
|
||||
|
||||
/**
|
||||
* Configuration to use for the embedded node. Ignored if the extension is present.
|
||||
*
|
||||
* If you want to make sure that this configuration isn't ignored, use this option in
|
||||
* conjunction with {Config.forceEmbeddedNode}.
|
||||
*/
|
||||
embeddedNodeConfig?: EmbeddedNodeConfig
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link ScClient} that connects to chains, either through the bizinikiwi-connect
|
||||
* extension or by executing a light client directly from JavaScript, depending on whether the
|
||||
* extension is installed and available.
|
||||
*
|
||||
* The bizinikiwi-connect extension is identified via the `@bizinikiwi/discovery` protocol.
|
||||
*
|
||||
* It must:
|
||||
*
|
||||
* 1. Be compliant `@bizinikiwi/smoldot-discovery` interface
|
||||
* 2. Include an rdns label starting with `io.github.pezkuwichain.BizinikiwiConnect`
|
||||
*
|
||||
*/
|
||||
export const createScClient = (config?: Config): ScClient => {
|
||||
if (config?.forceEmbeddedNode)
|
||||
return smoldotScClient(config?.embeddedNodeConfig)
|
||||
|
||||
const smoldotProviderPromise = getSmoldotProviderPromise()
|
||||
const client = smoldotProviderPromise
|
||||
? smoldotProviderPromise
|
||||
: smoldotScClient(config?.embeddedNodeConfig)
|
||||
|
||||
return {
|
||||
async addChain(chainSpec, options) {
|
||||
return (await client).addChain(chainSpec, options)
|
||||
},
|
||||
async addWellKnownChain(id, options) {
|
||||
return (await client).addWellKnownChain(id, options)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
function getSmoldotProviderPromise(): Promise<SmoldotExtensionAPI> | undefined {
|
||||
if (typeof document !== "object" || typeof CustomEvent !== "function") return
|
||||
const lightClientProvider = getSmoldotExtensionProviders()
|
||||
.filter((detail) =>
|
||||
// Filter for Bizinikiwi Connect to find the correct provider among multiple providers.
|
||||
detail.info.rdns.startsWith("io.github.pezkuwichain.BizinikiwiConnect"),
|
||||
)
|
||||
.map((detail) => detail.provider)[0]
|
||||
|
||||
return lightClientProvider
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||
import { beforeEach, beforeAll, it, describe, expect, vi } from "vitest"
|
||||
import type { AddChainOptions, ClientOptions } from "smoldot"
|
||||
import { WellKnownChain } from "./types.js"
|
||||
|
||||
class SdAlreadyDestroyedError extends Error {
|
||||
constructor() {
|
||||
super()
|
||||
this.name = "AlreadyDestroyedError"
|
||||
}
|
||||
}
|
||||
|
||||
class SdCrashError extends Error {
|
||||
constructor(message: string) {
|
||||
super(message)
|
||||
this.name = "CrashError"
|
||||
}
|
||||
}
|
||||
|
||||
class SdJsonRpcDisabledError extends Error {
|
||||
constructor() {
|
||||
super()
|
||||
this.name = "JsonRpcDisabledError"
|
||||
}
|
||||
}
|
||||
|
||||
class SdMalformedJsonRpcError extends Error {
|
||||
constructor() {
|
||||
super()
|
||||
this.name = "MalformedJsonRpcError"
|
||||
}
|
||||
}
|
||||
|
||||
class SdQueueFullError extends Error {
|
||||
constructor() {
|
||||
super()
|
||||
this.name = "QueueFullError"
|
||||
}
|
||||
}
|
||||
|
||||
const mockSmoldotLightFactory = () => {
|
||||
const start = (options: ClientOptions) => {
|
||||
const addChain = (
|
||||
addChainOptions: AddChainOptions,
|
||||
isClientTerminated: () => boolean,
|
||||
) => {
|
||||
let _remove = vi.fn()
|
||||
let _sendJsonRpc = vi.fn()
|
||||
return {
|
||||
_addChainOptions: addChainOptions,
|
||||
remove() {
|
||||
if (isClientTerminated()) throw new SdAlreadyDestroyedError()
|
||||
_remove()
|
||||
},
|
||||
_setRemove(nextRemove: typeof _remove) {
|
||||
_remove = nextRemove
|
||||
},
|
||||
_getSendRemove: () => _remove,
|
||||
sendJsonRpc(rpc: string) {
|
||||
if (isClientTerminated()) throw new SdAlreadyDestroyedError()
|
||||
_sendJsonRpc(rpc)
|
||||
},
|
||||
_setSendJsonRpc(nextSendJsonRpc: typeof _sendJsonRpc) {
|
||||
_sendJsonRpc = nextSendJsonRpc
|
||||
},
|
||||
_getSendJsonRpc: () => _sendJsonRpc,
|
||||
}
|
||||
}
|
||||
type MockChain = ReturnType<typeof addChain>
|
||||
const chains: MockChain[] = []
|
||||
|
||||
const terminate = vi.fn()
|
||||
|
||||
return {
|
||||
_options: options,
|
||||
_getChains: () => chains,
|
||||
_getLatestChain: () => chains?.[chains.length - 1],
|
||||
terminate,
|
||||
addChain: (addChainOptions: AddChainOptions) => {
|
||||
const chain = addChain(
|
||||
addChainOptions,
|
||||
() => terminate.mock.calls.length > 0,
|
||||
)
|
||||
chains.push(chain)
|
||||
return Promise.resolve(chain)
|
||||
},
|
||||
}
|
||||
}
|
||||
type MockClient = ReturnType<typeof start>
|
||||
|
||||
let latestClient: MockClient
|
||||
const mock = {
|
||||
AlreadyDestroyedError: SdAlreadyDestroyedError,
|
||||
CrashError: SdCrashError,
|
||||
JsonRpcDisabledError: SdJsonRpcDisabledError,
|
||||
MalformedJsonRpcError: SdMalformedJsonRpcError,
|
||||
QueueFullError: SdQueueFullError,
|
||||
start: (options: ClientOptions) => {
|
||||
return (latestClient = start(options))
|
||||
},
|
||||
getLatestClient: () => latestClient,
|
||||
}
|
||||
return mock
|
||||
}
|
||||
|
||||
vi.doMock("smoldot", mockSmoldotLightFactory)
|
||||
vi.doMock("./specs/index.js", () => ({
|
||||
getSpec: (wellKnownChain: string) => `fake-${wellKnownChain}-spec`,
|
||||
}))
|
||||
|
||||
type MockSmoldotLight = ReturnType<typeof mockSmoldotLightFactory>
|
||||
let mockedSmoldotLight: MockSmoldotLight
|
||||
|
||||
beforeAll(async () => {
|
||||
mockedSmoldotLight = mockSmoldotLightFactory as unknown as MockSmoldotLight
|
||||
})
|
||||
|
||||
beforeEach(() => {
|
||||
vi.resetModules()
|
||||
})
|
||||
|
||||
describe("SmoldotConnect::smoldot", () => {
|
||||
describe("client", () => {
|
||||
it("does not eagerly instantiate the client", () => {
|
||||
import("./smoldot-light.js").then((smoldot) => {
|
||||
smoldot.createScClient()
|
||||
mockedSmoldotLight =
|
||||
mockSmoldotLightFactory as unknown as MockSmoldotLight
|
||||
|
||||
expect(mockedSmoldotLight.start).toBeUndefined()
|
||||
})
|
||||
})
|
||||
|
||||
it("terminates the internal client when all the chains, from all clients, have been removed", () => {
|
||||
import("./smoldot-light.js").then(async (smoldot) => {
|
||||
const { addWellKnownChain, addChain } = smoldot.createScClient()
|
||||
|
||||
let chain1 = await addWellKnownChain("" as WellKnownChain)
|
||||
const client = mockedSmoldotLight?.getLatestClient()
|
||||
let chain2 = await addChain("")
|
||||
expect(client).toBe(mockedSmoldotLight.getLatestClient())
|
||||
|
||||
chain1.remove()
|
||||
expect(client.terminate).not.toHaveBeenCalled()
|
||||
|
||||
chain2.remove()
|
||||
expect(client.terminate).toHaveBeenCalled()
|
||||
let chain3 = await addWellKnownChain("" as WellKnownChain)
|
||||
expect(mockedSmoldotLight.getLatestClient()).not.toBe(client)
|
||||
expect(
|
||||
mockedSmoldotLight.getLatestClient().terminate,
|
||||
).not.toHaveBeenCalled()
|
||||
chain3.remove()
|
||||
expect(
|
||||
mockedSmoldotLight.getLatestClient().terminate,
|
||||
).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
|
||||
it("handles race conditions on the client when adding/removing chains", () => {
|
||||
import("./smoldot-light.js").then(async (smoldot) => {
|
||||
const { addChain } = smoldot.createScClient()
|
||||
const { addChain: addChain2 } = smoldot.createScClient()
|
||||
|
||||
let chain1 = await addChain("")
|
||||
const client = mockedSmoldotLight.getLatestClient()
|
||||
const chain2Promise = addChain2("")
|
||||
chain1.remove()
|
||||
expect(client.terminate).not.toHaveBeenCalled()
|
||||
|
||||
let chain2 = await chain2Promise
|
||||
chain2.remove()
|
||||
expect(client.terminate).toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("chain", () => {
|
||||
it("propagates the correct chainSpec to smoldot", () => {
|
||||
import("./smoldot-light.js").then(async (smoldot) => {
|
||||
const { addChain, addWellKnownChain } = smoldot.createScClient()
|
||||
const chainSpec = "testChainSpec"
|
||||
await addChain(chainSpec)
|
||||
let mockedChain = mockedSmoldotLight
|
||||
.getLatestClient()
|
||||
._getLatestChain()!
|
||||
expect(mockedChain._addChainOptions.chainSpec).toEqual(chainSpec)
|
||||
|
||||
await addWellKnownChain(WellKnownChain.pezkuwi)
|
||||
mockedChain = mockedSmoldotLight.getLatestClient()._getLatestChain()!
|
||||
expect(mockedChain._addChainOptions.chainSpec).toEqual(
|
||||
"fake-pezkuwi-spec",
|
||||
)
|
||||
|
||||
await addWellKnownChain(WellKnownChain.ksmcc3)
|
||||
mockedChain = mockedSmoldotLight.getLatestClient()._getLatestChain()!
|
||||
expect(mockedChain._addChainOptions.chainSpec).toEqual(
|
||||
"fake-ksmcc3-spec",
|
||||
)
|
||||
|
||||
await addWellKnownChain(WellKnownChain.pezkuwichain_v2_2)
|
||||
mockedChain = mockedSmoldotLight.getLatestClient()._getLatestChain()!
|
||||
expect(mockedChain._addChainOptions.chainSpec).toEqual(
|
||||
"fake-pezkuwichain_v2_2-spec",
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
it("propagates the correct potentialRelayChainIds to smoldot", () => {
|
||||
import("./smoldot-light.js").then(async (smoldot) => {
|
||||
const { addChain } = smoldot.createScClient()
|
||||
let prevChains = await Promise.all(
|
||||
Array(3)
|
||||
.fill(null)
|
||||
.map(() => addChain("")),
|
||||
)
|
||||
prevChains[0]!.remove()
|
||||
await addChain("")
|
||||
const mockedChains = mockedSmoldotLight
|
||||
.getLatestClient()
|
||||
._getChains()
|
||||
.slice(-4)
|
||||
const lastMockedChain = mockedChains[3]
|
||||
expect(lastMockedChain!._addChainOptions.potentialRelayChains).toEqual([
|
||||
mockedChains[1],
|
||||
mockedChains[2],
|
||||
])
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,270 @@
|
||||
import type {
|
||||
Chain as SChain,
|
||||
Client,
|
||||
ClientOptions,
|
||||
ClientOptionsWithBytecode,
|
||||
} from "smoldot"
|
||||
import { getSpec } from "./getSpec.js"
|
||||
import {
|
||||
type AddWellKnownChain,
|
||||
type Chain,
|
||||
type ScClient,
|
||||
AlreadyDestroyedError,
|
||||
CrashError,
|
||||
JsonRpcDisabledError,
|
||||
type AddChain,
|
||||
WellKnownChain,
|
||||
QueueFullError,
|
||||
} from "./types.js"
|
||||
import type { AddChainOptions } from "@bizinikiwi/smoldot-discovery/types"
|
||||
|
||||
const isBrowser = ![typeof window, typeof document].includes("undefined")
|
||||
|
||||
let _QueueFullError = class {}
|
||||
|
||||
let startPromise: Promise<(options: ClientOptions) => Client> | null = null
|
||||
const getStart = () => {
|
||||
if (startPromise) return startPromise
|
||||
startPromise = import("smoldot").then((sm) => {
|
||||
_QueueFullError = sm.QueueFullError
|
||||
return sm.start
|
||||
})
|
||||
return startPromise
|
||||
}
|
||||
|
||||
let startWithByteCodePromise: Promise<
|
||||
(options: ClientOptionsWithBytecode) => Client
|
||||
> | null = null
|
||||
const getStartWithByteCode = () => {
|
||||
if (startWithByteCodePromise) return startWithByteCodePromise
|
||||
// @ts-ignore TODO: fix types in smoldot/no-auto-bytecode
|
||||
startWithByteCodePromise = import("smoldot/no-auto-bytecode").then(
|
||||
(sm) => sm.startWithBytecode,
|
||||
)
|
||||
return startWithByteCodePromise
|
||||
}
|
||||
|
||||
const clientReferences: Config[] = [] // Note that this can't be a set, as the same config is added/removed multiple times
|
||||
let clientPromise: Promise<Client> | Client | null = null
|
||||
let clientReferencesMaxLogLevel = 3
|
||||
const getClientAndIncRef = (config: Config): Promise<Client> => {
|
||||
if (config.maxLogLevel && config.maxLogLevel > clientReferencesMaxLogLevel)
|
||||
clientReferencesMaxLogLevel = config.maxLogLevel
|
||||
|
||||
if (clientPromise) {
|
||||
clientReferences.push(config)
|
||||
if (clientPromise instanceof Promise) return clientPromise
|
||||
else return Promise.resolve(clientPromise)
|
||||
}
|
||||
|
||||
let worker: Worker | undefined = undefined
|
||||
let portToWorker: MessagePort | undefined = undefined
|
||||
if (config.workerFactory) {
|
||||
worker = config.workerFactory()
|
||||
const { port1, port2 } = new MessageChannel()
|
||||
worker.postMessage(port1, [port1])
|
||||
portToWorker = port2
|
||||
}
|
||||
|
||||
const clientOptions: ClientOptions = {
|
||||
portToWorker,
|
||||
forbidTcp: true, // In order to avoid confusing inconsistencies between browsers and NodeJS, TCP connections are always disabled.
|
||||
forbidNonLocalWs: true, // Prevents browsers from emitting warnings if smoldot tried to establish non-secure WebSocket connections
|
||||
maxLogLevel: 9999999, // The actual level filtering is done in the logCallback
|
||||
cpuRateLimit: 0.5, // Politely limit the CPU usage of the smoldot background worker.
|
||||
logCallback: (level, target, message) => {
|
||||
if (level > clientReferencesMaxLogLevel) return
|
||||
|
||||
// The first parameter of the methods of `console` has some printf-like substitution
|
||||
// capabilities. We don't really need to use this, but not using it means that the logs
|
||||
// might not get printed correctly if they contain `%`.
|
||||
if (level <= 1) {
|
||||
console.error("[%s] %s", target, message)
|
||||
} else if (level === 2) {
|
||||
console.warn("[%s] %s", target, message)
|
||||
} else if (level === 3) {
|
||||
console.info("[%s] %s", target, message)
|
||||
} else if (level === 4) {
|
||||
console.debug("[%s] %s", target, message)
|
||||
} else {
|
||||
console.trace("[%s] %s", target, message)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
const newClientPromise = worker
|
||||
? getStartWithByteCode().then((start) => {
|
||||
return start({
|
||||
...clientOptions,
|
||||
bytecode: new Promise((resolve) => {
|
||||
// In NodeJs, onmessage does not exist in Worker from "node:worker_threads"
|
||||
if (isBrowser) worker!.onmessage = (event) => resolve(event.data)
|
||||
// @ts-ignore
|
||||
else worker!.on("message", (message) => resolve(message))
|
||||
}),
|
||||
})
|
||||
})
|
||||
: getStart().then((start) => start(clientOptions))
|
||||
|
||||
clientPromise = newClientPromise
|
||||
|
||||
newClientPromise.then((client) => {
|
||||
// Make sure that the client we have just created is still desired
|
||||
if (clientPromise === newClientPromise) clientPromise = client
|
||||
else client.terminate()
|
||||
// Note that if clientPromise != newClientPromise we know for sure that the client that we
|
||||
// return isn't going to be used. We would rather not return a terminated client, but this
|
||||
// isn't possible for type check reasons.
|
||||
return client
|
||||
})
|
||||
|
||||
clientReferences.push(config)
|
||||
return clientPromise
|
||||
}
|
||||
|
||||
// Must be passed the exact same object as was passed to {getClientAndIncRef}
|
||||
const decRef = (config: Config) => {
|
||||
const idx = clientReferences.indexOf(config)
|
||||
if (idx === -1) throw new Error("Internal error within smoldot")
|
||||
clientReferences.splice(idx, 1)
|
||||
|
||||
// Update `clientReferencesMaxLogLevel`
|
||||
// Note how it is set back to 3 if there is no reference anymore
|
||||
clientReferencesMaxLogLevel = 3
|
||||
for (const cfg of clientReferences.values()) {
|
||||
if (cfg.maxLogLevel && cfg.maxLogLevel > clientReferencesMaxLogLevel)
|
||||
clientReferencesMaxLogLevel = cfg.maxLogLevel
|
||||
}
|
||||
|
||||
if (clientReferences.length === 0) {
|
||||
if (clientPromise && !(clientPromise instanceof Promise))
|
||||
clientPromise.terminate()
|
||||
clientPromise = null
|
||||
}
|
||||
}
|
||||
|
||||
const transformErrors = (thunk: () => void) => {
|
||||
try {
|
||||
thunk()
|
||||
} catch (e) {
|
||||
const error = e as Error | undefined
|
||||
if (error?.name === "JsonRpcDisabledError") throw new JsonRpcDisabledError()
|
||||
if (error?.name === "CrashError") throw new CrashError(error.message)
|
||||
if (error?.name === "AlreadyDestroyedError")
|
||||
throw new AlreadyDestroyedError()
|
||||
if (error instanceof _QueueFullError) throw new QueueFullError()
|
||||
throw new CrashError(
|
||||
e instanceof Error ? e.message : `Unexpected error ${e}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configuration that can be passed to {createScClient}.
|
||||
*/
|
||||
export interface Config {
|
||||
/**
|
||||
* The client prints logs in the console. By default, only log levels 1, 2, and 3 (corresponding
|
||||
* respectively to ERROR, WARN, and INFO) are printed.
|
||||
*
|
||||
* In order to more easily debug problems, you can pass 4 (DEBUG) or more.
|
||||
*
|
||||
* This setting is only taken into account between the moment when you use this chain to add a
|
||||
* chain for the first time, and the moment when all the chains that you have added have been
|
||||
* removed.
|
||||
*
|
||||
* If {createScClient} is called multiple times with multiple different log levels, the highest
|
||||
* value will be used.
|
||||
*/
|
||||
maxLogLevel?: number
|
||||
|
||||
/**
|
||||
* Creates a `Worker` that is expected to import `@bizinikiwi/connect/worker`.
|
||||
*
|
||||
* If this option isn't set then the smoldot light client will run entirely on the "current thread", which might slow
|
||||
* down other components that also run on this thread.
|
||||
*/
|
||||
workerFactory?: () => Worker
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {ScClient} that connects to chains by executing a light client directly
|
||||
* from JavaScript.
|
||||
*
|
||||
* This is quite expensive in terms of CPU, but it is the only choice when the bizinikiwi-connect
|
||||
* extension is not installed.
|
||||
*/
|
||||
export const createScClient = (config?: Config): ScClient => {
|
||||
const configOrDefault = config || { maxLogLevel: 3 }
|
||||
|
||||
const internalAddChain = async (
|
||||
chainSpec: string,
|
||||
options?: AddChainOptions & { relayChain?: SChain },
|
||||
): Promise<Chain> => {
|
||||
const client = await getClientAndIncRef(configOrDefault)
|
||||
|
||||
try {
|
||||
const internalChain = await client.addChain({
|
||||
chainSpec,
|
||||
potentialRelayChains: options?.relayChain
|
||||
? [options.relayChain]
|
||||
: undefined,
|
||||
disableJsonRpc: options?.disableJsonRpc,
|
||||
databaseContent: options?.databaseContent,
|
||||
})
|
||||
|
||||
return {
|
||||
sendJsonRpc: (rpc) => {
|
||||
transformErrors(() => internalChain.sendJsonRpc(rpc))
|
||||
},
|
||||
nextJsonRpcResponse: () => internalChain.nextJsonRpcResponse(),
|
||||
jsonRpcResponses: internalChain.jsonRpcResponses,
|
||||
remove: () => {
|
||||
try {
|
||||
transformErrors(() => {
|
||||
internalChain.remove()
|
||||
})
|
||||
} finally {
|
||||
decRef(configOrDefault)
|
||||
}
|
||||
},
|
||||
addChain: (
|
||||
chainSpec: string,
|
||||
options?: AddChainOptions,
|
||||
): Promise<Chain> => {
|
||||
return internalAddChain(chainSpec, {
|
||||
...options,
|
||||
relayChain: internalChain,
|
||||
})
|
||||
},
|
||||
}
|
||||
} catch (error) {
|
||||
decRef(configOrDefault)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const addChain: AddChain = (chainSpec, options) =>
|
||||
internalAddChain(chainSpec, options)
|
||||
|
||||
const addWellKnownChain: AddWellKnownChain = async (
|
||||
supposedChain: WellKnownChain,
|
||||
options,
|
||||
): Promise<Chain> => {
|
||||
// the following line ensures that the http request for the dynamic import
|
||||
// of smoldot and the request for the dynamic import of the spec
|
||||
// happen in parallel
|
||||
getClientAndIncRef(configOrDefault)
|
||||
|
||||
try {
|
||||
return await internalAddChain(await getSpec(supposedChain), options)
|
||||
} finally {
|
||||
decRef(configOrDefault)
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
addChain,
|
||||
addWellKnownChain,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
import type {
|
||||
AddChain,
|
||||
AddWellKnownChain,
|
||||
} from "@bizinikiwi/smoldot-discovery/types"
|
||||
|
||||
/**
|
||||
* Client that allows connecting to chains.
|
||||
*
|
||||
* Use {ScClient.addChain} or {ScClient.addWellKnownChain} to connect to a
|
||||
* chain.
|
||||
*
|
||||
* If you want to connect to a parachain, you **must** have connected to its corresponding relay
|
||||
* chain with the same instance of {ScClient}. The matching between relay chains and
|
||||
* parachains is done through the `relay_chain` field in the parachain specification.
|
||||
*/
|
||||
export interface ScClient {
|
||||
/**
|
||||
* Connects to a chain.
|
||||
*
|
||||
* Throws an exception if the chain specification isn't valid, or if the chain specification
|
||||
* concerns a parachain but no corresponding relay chain can be found.
|
||||
*
|
||||
* Bizinikiwi-connect will automatically de-duplicate chains if multiple identical chains are
|
||||
* added, in order to save resources. In other words, it is not a problem to call `addChain`
|
||||
* multiple times with the same chain specifications and obtain multiple `Chain`.
|
||||
* When the same client is used for multiple different purposes, you are in fact strongly
|
||||
* encouraged to trust bizinikiwi-connect and not attempt to de-duplicate chains yourself, as
|
||||
* determining whether two chains are identical is complicated and might have security
|
||||
* implications.
|
||||
*
|
||||
* Bizinikiwi-connect tries to distribute CPU resources equally between all active `Chain`
|
||||
* objects.
|
||||
*
|
||||
* @param chainSpec Specification of the chain to add.
|
||||
|
||||
* @param jsonRpcCallback Callback invoked in response to calling {Chain.sendJsonRpc}.
|
||||
* This field is optional. If no callback is provided, the client will save up resources by not
|
||||
* starting the JSON-RPC endpoint, and it is forbidden to call {Chain.sendJsonRpc}.
|
||||
* Will never be called after ̀{Chain.remove} has been called or if a {CrashError} has been
|
||||
* generated.
|
||||
*
|
||||
* @throws {AddChainError} If the chain can't be added.
|
||||
* @throws {CrashError} If the background client has crashed.
|
||||
*/
|
||||
addChain: AddChain
|
||||
|
||||
/**
|
||||
* Connects to a chain, by its `id`.
|
||||
*
|
||||
* Throws an exception if no chain with this name is known.
|
||||
*
|
||||
* Bizinikiwi-connect will automatically de-duplicate chains if multiple identical chains are
|
||||
* added, in order to save resources. In other words, it is not a problem to call `addChain`
|
||||
* multiple times with the same chain specifications and obtain multiple `Chain`.
|
||||
* When the same client is used for multiple different purposes, you are in fact strongly
|
||||
* encouraged to trust bizinikiwi-connect and not attempt to de-duplicate chains yourself, as
|
||||
* determining whether two chains are identical is complicated and might have security
|
||||
* implications.
|
||||
*
|
||||
* Bizinikiwi-connect tries to distribute CPU resources equally between all active `Chain`
|
||||
* objects.
|
||||
*
|
||||
* @param id Name of the well-known chain to add.
|
||||
* @param jsonRpcCallback Same parameter as for {ScClient.addChain}
|
||||
*
|
||||
* @throws {AddChainError} If no chain with this name is known.
|
||||
* @throws {CrashError} If the background client has crashed.
|
||||
*/
|
||||
addWellKnownChain: AddWellKnownChain
|
||||
}
|
||||
|
||||
export {
|
||||
WellKnownChain,
|
||||
AlreadyDestroyedError,
|
||||
CrashError,
|
||||
JsonRpcDisabledError,
|
||||
QueueFullError,
|
||||
type Chain,
|
||||
type AddChain,
|
||||
type AddWellKnownChain,
|
||||
type AddChainOptions,
|
||||
} from "@bizinikiwi/smoldot-discovery/types"
|
||||
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* The bizinikiwi-connect package makes it possible to connect to Bizinikiwi-compatible blockchains with a light client.
|
||||
*
|
||||
* Connecting to a chain is done in two steps:
|
||||
*
|
||||
* 1. Call {@link createScClient}, which gives you a so-called *client*.
|
||||
* 2. Call {@link ScClient.addChain addChain} or {@link ScClient.addWellKnownChain addWellKnownChain} on this client.
|
||||
*
|
||||
* Note that this library is a low-level library where you directly send JSON-RPC requests and
|
||||
* receive responses.
|
||||
*
|
||||
* # Adding parachains
|
||||
*
|
||||
* Connecting to a parachain is done by obtaining a relay chain instance and then calling {@link Chain.addChain addChain}.
|
||||
*
|
||||
* ```js
|
||||
* const client = createScClient();
|
||||
* const relayChain = await client.addChain(relayChainSpec);
|
||||
* const parachain = await relayChain.addChain(parachainSpec);
|
||||
* ```
|
||||
*
|
||||
* While this will **not** work, and an exception will be thrown when adding the parachain:
|
||||
*
|
||||
* ```js
|
||||
* await createScClient().addChain(relayChainSpec);
|
||||
* await createScClient().addChain(parachainSpec);
|
||||
* ```
|
||||
*
|
||||
* # Resources sharing
|
||||
*
|
||||
* While calling {@link createScClient} multiple times leads to a different observable behaviour
|
||||
* when it comes to parachains (see previous section), internally resources are shared
|
||||
* between all the clients.
|
||||
*
|
||||
* In order words, it is not a problem to do this:
|
||||
*
|
||||
* ```js
|
||||
* const relayChainSpec = ...;
|
||||
* const chain1 = await createScClient().addChain(relayChainSpec);
|
||||
* const chain2 = await createScClient().addChain(relayChainSpec);
|
||||
* ```
|
||||
*
|
||||
* From an API perspective, `chain1` and `chain2` should be treated as two completely separate
|
||||
* connections to the same chain. Internally, however, only one "actual" connection to that chain
|
||||
* will exist.
|
||||
*
|
||||
* This means that there is no problem in calling {@link createScClient} from within a library for
|
||||
* example.
|
||||
*
|
||||
* # Well-known chains
|
||||
*
|
||||
* This package contains a list of so-called {@link WellKnownChain}s. This is a list of popular chains
|
||||
* that users are likely to connect to. Instead of calling `addChain` with a chain specification,
|
||||
* one can call `addWellKnownChain`, passing only the name of a well-known chain as parameter.
|
||||
*
|
||||
* Using {@link WellKnownChain}s doesn't provide any benefit when the bizinikiwi-connect extension is not
|
||||
* installed.
|
||||
*
|
||||
* If, however, the bizinikiwi-connect extension is installed, using {@link ScClient.addWellKnownChain addWellKnownChain} has several
|
||||
* benefits:
|
||||
*
|
||||
* - The web page that uses bizinikiwi-connect doesn't need to download the chain specification of
|
||||
* a well-known chain from the web server, as this chain specification is already known by the
|
||||
* extension.
|
||||
* - The extension starts connect to well-known chains when the browser initializes, meaning that
|
||||
* when {@link ScClient.addWellKnownChain addWellKnownChain} is called, it is likely that the chain in question has already been
|
||||
* fully synchronized.
|
||||
* - Furthermore, the extension stores the state of all the well-known chains in the browser's
|
||||
* local storage. This leads to a very quick initialization time.
|
||||
*
|
||||
* # Usage with a worker
|
||||
* By default, when the bizinikiwi-connect extension is not installed, {@link createScClient} will run the smoldot light
|
||||
* client entirely in the current thread. This can cause performance issues if other CPU-heavy operations are done in
|
||||
* that thread.
|
||||
*
|
||||
* In order to help with this, it possible to run the smoldot light client in a worker.
|
||||
* To do so, you must provide a {@link EmbeddedNodeConfig.workerFactory workerFactory} to {@link createScClient}
|
||||
* and setup the worker to import `@bizinikiwi/connect/worker`.
|
||||
*
|
||||
* For example
|
||||
*
|
||||
* ```js
|
||||
* // worker.mjs
|
||||
* import "@bizinikiwi/connect/worker"
|
||||
*
|
||||
* // main.mjs
|
||||
* import { createScClient } from "@bizinikiwi/connect"
|
||||
* createScClient({
|
||||
* embeddedNodeConfig: {
|
||||
* workerFactory: () => new Worker("./worker.mjs"),
|
||||
* },
|
||||
* })
|
||||
* ```
|
||||
*
|
||||
* @packageDocumentation
|
||||
*/
|
||||
|
||||
export * from "./connector/index.js"
|
||||
@@ -0,0 +1,14 @@
|
||||
/// <reference lib="WebWorker" />
|
||||
|
||||
import * as smoldot from "smoldot/worker"
|
||||
import { compileBytecode } from "smoldot/bytecode"
|
||||
|
||||
declare var self: DedicatedWorkerGlobalScope
|
||||
|
||||
compileBytecode().then((bytecode: unknown) => self.postMessage(bytecode))
|
||||
|
||||
self.onmessage = ({ data }) =>
|
||||
smoldot
|
||||
.run(data)
|
||||
.catch((error: any) => console.error("[smoldot-worker]", error))
|
||||
.finally(self.close)
|
||||
@@ -0,0 +1,12 @@
|
||||
import * as smoldot from "smoldot/worker"
|
||||
import { compileBytecode } from "smoldot/bytecode"
|
||||
import { parentPort } from "node:worker_threads"
|
||||
|
||||
compileBytecode().then((bytecode: any) => parentPort!.postMessage(bytecode))
|
||||
|
||||
parentPort!.once("message", (data) =>
|
||||
smoldot
|
||||
.run(data)
|
||||
.catch((error: any) => console.error("[smoldot-worker]", error))
|
||||
.finally(() => process.exit()),
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"extends": "../../tsconfig.build.json",
|
||||
"include": ["src"],
|
||||
"exclude": ["src/**/*.test.ts"]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"include": ["src", "tests"]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"entryPoints": ["src/index.ts"],
|
||||
"includeVersion": true
|
||||
}
|
||||
Reference in New Issue
Block a user