diff --git a/.aegir.cjs b/.aegir.cjs index 62715f4..00f09d8 100644 --- a/.aegir.cjs +++ b/.aegir.cjs @@ -1,6 +1,7 @@ module.exports = { build: { config: { + format: 'esm', platform: 'node', external: ['*.node'], } diff --git a/package.json b/package.json index f45d4bf..7a6920b 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "scripts": { "artifacts": "napi artifacts", "build": "yarn build:rs && scripts/postbuild.sh && yarn build:ts", - "build:ts": "aegir build", - "build:rs": "napi build --platform --release --dts src/napi.d.ts --js src/napi.cjs", - "build:rs:debug": "napi build --platform --dts src/napi.d.ts --js src/napi.cjs", + "build:ts": "aegir build -t node", + "build:rs": "napi build --platform --release --dts src/napi.d.ts --js src/napi.js", + "build:rs:debug": "napi build --platform --dts src/napi.d.ts --js src/napi.js", "lint": "aegir lint", "prepublishOnly": "napi prepublish -t npm", "test": "aegir test", diff --git a/scripts/JS_GEN_PREFIX b/scripts/JS_GEN_PREFIX index ae7eebe..56fcc1c 100644 --- a/scripts/JS_GEN_PREFIX +++ b/scripts/JS_GEN_PREFIX @@ -2,3 +2,8 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck +import { createRequire } from 'node:module'; +const require = createRequire(import.meta.url); + +const __dirname = new URL('.', import.meta.url).pathname; + diff --git a/scripts/postbuild.sh b/scripts/postbuild.sh index 856b3d8..48fa449 100755 --- a/scripts/postbuild.sh +++ b/scripts/postbuild.sh @@ -1,13 +1,17 @@ #!/bin/bash -# typescript dislikes the generated js code from napi-rs + +# Typescript dislikes the generated js code from napi-rs # so we need to disable type checking for that file +# Also, we're hacking the generated output to convert cjs to esm # this script should be run once after running yarn build:rs -OUTPUT="src/napi.cjs" +OUTPUT="src/napi.js" { cat scripts/JS_GEN_PREFIX; cat $OUTPUT; } > ${OUTPUT}.tmp mv ${OUTPUT}.tmp $OUTPUT -sed -i "s/\.\/libp2p/..\/libp2p/" $OUTPUT -sed -i "s/'libp2p/'..\/libp2p/" $OUTPUT + +sed -i "s/\.\/libp2p/..\/..\/libp2p/" $OUTPUT +sed -i "s/'libp2p/'..\/..\/libp2p/" $OUTPUT +sed -i "s/module\.exports\.\(.*\) = \(.*\)/export { \2 }/g" $OUTPUT \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 6cc1a72..5dbd5cb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,9 +5,7 @@ import type { Sink, Source } from 'it-stream-types' import { Uint8ArrayList } from 'uint8arraylist' import { dialFilter, listenFilter } from './filter.js' -import * as napii from './napi.cjs' -import type * as types from './napi' -const napi = napii as typeof types +import * as napi from './napi.js' export function quic(options?: Partial): (components: QuicComponents) => Transport { return (components) => new QuicTransport(components, {...defaultOptions, ...options}) @@ -22,7 +20,7 @@ export const defaultOptions: QuicOptions = { maxConnectionData: 15_000_000, } -export type QuicOptions = Omit & {} +export type QuicOptions = Omit & {} export type QuicComponents = { metrics?: Metrics logger: ComponentLogger @@ -39,11 +37,11 @@ export class QuicTransport implements Transport { readonly log: Logger readonly components: QuicComponents - readonly #config: types.QuinnConfig + readonly #config: napi.QuinnConfig readonly #clients: { - ip4: types.Client - ip6: types.Client + ip4: napi.Client + ip6: napi.Client } readonly listenFilter: MultiaddrFilter @@ -95,7 +93,7 @@ export class QuicTransport implements Transport { type QuicListenerInit = { options: QuicCreateListenerOptions - config: types.QuinnConfig + config: napi.QuinnConfig logger: ComponentLogger } @@ -103,17 +101,17 @@ type QuicListenerState = { status: 'ready' } | { status: 'listening' - listener: types.Server + listener: napi.Server listenAddr: Multiaddr controller: AbortController } | { status: 'closed' - listener: types.Server + listener: napi.Server listenAddr: Multiaddr } export class QuicListener extends TypedEventEmitter implements Listener { - readonly #config: types.QuinnConfig + readonly #config: napi.QuinnConfig readonly init: QuicListenerInit readonly options: QuicCreateListenerOptions readonly log: Logger @@ -168,7 +166,7 @@ export class QuicListener extends TypedEventEmitter implements L const connection = await Promise.race([ aborted, this.state.listener.inboundConnection(), - ]) as types.Connection | undefined + ]) as napi.Connection | undefined if (connection == null) { break } @@ -181,7 +179,7 @@ export class QuicListener extends TypedEventEmitter implements L } } - async onInboundConnection(connection: types.Connection): Promise { + async onInboundConnection(connection: napi.Connection): Promise { const maConn = new QuicConnection({ connection, logger: this.init.logger, @@ -203,12 +201,12 @@ export class QuicListener extends TypedEventEmitter implements L } type QuicConnectionInit = { - connection: types.Connection + connection: napi.Connection logger: ComponentLogger } type QuicStreamMuxerFactoryInit = { - connection: types.Connection + connection: napi.Connection logger: ComponentLogger } @@ -216,7 +214,7 @@ type QuicStreamMuxerFactoryInit = { * Each stream muxer factory is only configured for a single connection */ export class QuicStreamMuxerFactory implements StreamMuxerFactory { - #connection: types.Connection + #connection: napi.Connection init: QuicStreamMuxerFactoryInit protocol: string = 'quic' @@ -235,12 +233,12 @@ export class QuicStreamMuxerFactory implements StreamMuxerFactory { } type QuicStreamMuxerInit = StreamMuxerInit & { - connection: types.Connection + connection: napi.Connection logger: ComponentLogger } class QuicStreamMuxer implements StreamMuxer { - #connection: types.Connection + #connection: napi.Connection init: QuicStreamMuxerInit log: Logger @@ -264,7 +262,7 @@ class QuicStreamMuxer implements StreamMuxer { const stream = await Promise.race([ aborted, this.#connection.inboundStream() - ]) as types.Stream | undefined + ]) as napi.Stream | undefined if (stream == null) { break } @@ -277,7 +275,7 @@ class QuicStreamMuxer implements StreamMuxer { } } - private onInboundStream = (str: types.Stream) => { + private onInboundStream = (str: napi.Stream) => { const stream = new QuicStream({ stream: str, direction: 'inbound', @@ -311,7 +309,7 @@ class QuicStreamMuxer implements StreamMuxer { } export class QuicConnection implements MultiaddrConnection { - readonly #connection: types.Connection + readonly #connection: napi.Connection readonly log: Logger readonly remoteAddr: Multiaddr @@ -336,13 +334,13 @@ export class QuicConnection implements MultiaddrConnection { } type QuicStreamInit = { - stream: types.Stream + stream: napi.Stream direction: Direction logger: ComponentLogger } export class QuicStream implements Stream { - readonly #stream: types.Stream + readonly #stream: napi.Stream readonly id: string readonly direction: Direction diff --git a/src/napi.cjs b/src/napi.js similarity index 69% rename from src/napi.cjs rename to src/napi.js index 0aa451d..354aee9 100644 --- a/src/napi.cjs +++ b/src/napi.js @@ -2,6 +2,11 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-nocheck +import { createRequire } from 'node:module'; +const require = createRequire(import.meta.url); + +const __dirname = new URL('.', import.meta.url).pathname; + /* tslint:disable */ /* eslint-disable */ /* prettier-ignore */ @@ -36,10 +41,10 @@ switch (platform) { case 'android': switch (arch) { case 'arm64': - localFileExisted = existsSync(join(__dirname, '../libp2p-quic.android-arm64.node')) + localFileExisted = existsSync(join(__dirname, '../../libp2p-quic.android-arm64.node')) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.android-arm64.node') + nativeBinding = require('../../libp2p-quic.android-arm64.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-android-arm64') } @@ -48,10 +53,10 @@ switch (platform) { } break case 'arm': - localFileExisted = existsSync(join(__dirname, '../libp2p-quic.android-arm-eabi.node')) + localFileExisted = existsSync(join(__dirname, '../../libp2p-quic.android-arm-eabi.node')) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.android-arm-eabi.node') + nativeBinding = require('../../libp2p-quic.android-arm-eabi.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-android-arm-eabi') } @@ -67,11 +72,11 @@ switch (platform) { switch (arch) { case 'x64': localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.win32-x64-msvc.node') + join(__dirname, '../../libp2p-quic.win32-x64-msvc.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.win32-x64-msvc.node') + nativeBinding = require('../../libp2p-quic.win32-x64-msvc.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-win32-x64-msvc') } @@ -81,11 +86,11 @@ switch (platform) { break case 'ia32': localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.win32-ia32-msvc.node') + join(__dirname, '../../libp2p-quic.win32-ia32-msvc.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.win32-ia32-msvc.node') + nativeBinding = require('../../libp2p-quic.win32-ia32-msvc.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-win32-ia32-msvc') } @@ -95,11 +100,11 @@ switch (platform) { break case 'arm64': localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.win32-arm64-msvc.node') + join(__dirname, '../../libp2p-quic.win32-arm64-msvc.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.win32-arm64-msvc.node') + nativeBinding = require('../../libp2p-quic.win32-arm64-msvc.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-win32-arm64-msvc') } @@ -112,10 +117,10 @@ switch (platform) { } break case 'darwin': - localFileExisted = existsSync(join(__dirname, '../libp2p-quic.darwin-universal.node')) + localFileExisted = existsSync(join(__dirname, '../../libp2p-quic.darwin-universal.node')) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.darwin-universal.node') + nativeBinding = require('../../libp2p-quic.darwin-universal.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-darwin-universal') } @@ -123,10 +128,10 @@ switch (platform) { } catch {} switch (arch) { case 'x64': - localFileExisted = existsSync(join(__dirname, '../libp2p-quic.darwin-x64.node')) + localFileExisted = existsSync(join(__dirname, '../../libp2p-quic.darwin-x64.node')) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.darwin-x64.node') + nativeBinding = require('../../libp2p-quic.darwin-x64.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-darwin-x64') } @@ -136,11 +141,11 @@ switch (platform) { break case 'arm64': localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.darwin-arm64.node') + join(__dirname, '../../libp2p-quic.darwin-arm64.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.darwin-arm64.node') + nativeBinding = require('../../libp2p-quic.darwin-arm64.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-darwin-arm64') } @@ -156,10 +161,10 @@ switch (platform) { if (arch !== 'x64') { throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) } - localFileExisted = existsSync(join(__dirname, '../libp2p-quic.freebsd-x64.node')) + localFileExisted = existsSync(join(__dirname, '../../libp2p-quic.freebsd-x64.node')) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.freebsd-x64.node') + nativeBinding = require('../../libp2p-quic.freebsd-x64.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-freebsd-x64') } @@ -172,11 +177,11 @@ switch (platform) { case 'x64': if (isMusl()) { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-x64-musl.node') + join(__dirname, '../../libp2p-quic.linux-x64-musl.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-x64-musl.node') + nativeBinding = require('../../libp2p-quic.linux-x64-musl.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-x64-musl') } @@ -185,11 +190,11 @@ switch (platform) { } } else { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-x64-gnu.node') + join(__dirname, '../../libp2p-quic.linux-x64-gnu.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-x64-gnu.node') + nativeBinding = require('../../libp2p-quic.linux-x64-gnu.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-x64-gnu') } @@ -201,11 +206,11 @@ switch (platform) { case 'arm64': if (isMusl()) { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-arm64-musl.node') + join(__dirname, '../../libp2p-quic.linux-arm64-musl.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-arm64-musl.node') + nativeBinding = require('../../libp2p-quic.linux-arm64-musl.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-arm64-musl') } @@ -214,11 +219,11 @@ switch (platform) { } } else { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-arm64-gnu.node') + join(__dirname, '../../libp2p-quic.linux-arm64-gnu.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-arm64-gnu.node') + nativeBinding = require('../../libp2p-quic.linux-arm64-gnu.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-arm64-gnu') } @@ -230,11 +235,11 @@ switch (platform) { case 'arm': if (isMusl()) { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-arm-musleabihf.node') + join(__dirname, '../../libp2p-quic.linux-arm-musleabihf.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-arm-musleabihf.node') + nativeBinding = require('../../libp2p-quic.linux-arm-musleabihf.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-arm-musleabihf') } @@ -243,11 +248,11 @@ switch (platform) { } } else { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-arm-gnueabihf.node') + join(__dirname, '../../libp2p-quic.linux-arm-gnueabihf.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-arm-gnueabihf.node') + nativeBinding = require('../../libp2p-quic.linux-arm-gnueabihf.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-arm-gnueabihf') } @@ -259,11 +264,11 @@ switch (platform) { case 'riscv64': if (isMusl()) { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-riscv64-musl.node') + join(__dirname, '../../libp2p-quic.linux-riscv64-musl.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-riscv64-musl.node') + nativeBinding = require('../../libp2p-quic.linux-riscv64-musl.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-riscv64-musl') } @@ -272,11 +277,11 @@ switch (platform) { } } else { localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-riscv64-gnu.node') + join(__dirname, '../../libp2p-quic.linux-riscv64-gnu.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-riscv64-gnu.node') + nativeBinding = require('../../libp2p-quic.linux-riscv64-gnu.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-riscv64-gnu') } @@ -287,11 +292,11 @@ switch (platform) { break case 's390x': localFileExisted = existsSync( - join(__dirname, '../libp2p-quic.linux-s390x-gnu.node') + join(__dirname, '../../libp2p-quic.linux-s390x-gnu.node') ) try { if (localFileExisted) { - nativeBinding = require('../libp2p-quic.linux-s390x-gnu.node') + nativeBinding = require('../../libp2p-quic.linux-s390x-gnu.node') } else { nativeBinding = require('@chainsafe/libp2p-quic-linux-s390x-gnu') } @@ -316,10 +321,10 @@ if (!nativeBinding) { const { QuinnConfig, ConnectionStats, SocketFamily, Server, Client, Connection, Stream } = nativeBinding -module.exports.QuinnConfig = QuinnConfig -module.exports.ConnectionStats = ConnectionStats -module.exports.SocketFamily = SocketFamily -module.exports.Server = Server -module.exports.Client = Client -module.exports.Connection = Connection -module.exports.Stream = Stream +export { QuinnConfig } +export { ConnectionStats } +export { SocketFamily } +export { Server } +export { Client } +export { Connection } +export { Stream }