diff --git a/eslint.config.js b/eslint.config.js index f132673d..2073f13f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -12,39 +12,3 @@ export default antfu({ 'no-console': 'off', }, }) - .append({ - files: ['pnpm-workspace.yaml'], - name: 'antfu/yaml/pnpm-workspace', - rules: { - 'yaml/sort-keys': [ - 'error', - { - order: [ - 'packages', - 'overrides', - 'patchedDependencies', - 'hoistPattern', - 'catalog', - 'catalogs', - - 'allowedDeprecatedVersions', - 'allowNonAppliedPatches', - 'configDependencies', - 'ignoredBuiltDependencies', - 'ignoredOptionalDependencies', - 'neverBuiltDependencies', - 'onlyBuiltDependencies', - 'onlyBuiltDependenciesFile', - 'packageExtensions', - 'peerDependencyRules', - 'supportedArchitectures', - ], - pathPattern: '^$', - }, - { - order: { type: 'asc' }, - pathPattern: '.*', - }, - ], - }, - }) diff --git a/package.json b/package.json index 6afcdd8d..3dc058c6 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ }, "resolutions": { "@nuxt/devtools": "catalog:devtools", + "@nuxt/kit": "catalog:build", "@rolldown/debug": "catalog:deps", "esbuild": "catalog:build", "nitropack": "catalog:build", diff --git a/packages/devtools-rpc/package.json b/packages/devtools-rpc/package.json index aa99608b..124cd300 100644 --- a/packages/devtools-rpc/package.json +++ b/packages/devtools-rpc/package.json @@ -18,7 +18,10 @@ ], "sideEffects": false, "exports": { - ".": "./dist/index.mjs" + ".": "./dist/index.mjs", + "./presets/ws/server": "./dist/presets/ws/server.mjs", + "./presets/ws/client": "./dist/presets/ws/client.mjs", + "./presets": "./dist/presets/index.mjs" }, "main": "./dist/index.mjs", "types": "./dist/index.d.mts", @@ -30,6 +33,11 @@ "dev": "tsdown --watch", "prepack": "pnpm build" }, + "peerDependenciesMeta": { + "ws": { + "optional": true + } + }, "dependencies": { "birpc": "catalog:deps", "structured-clone-es": "catalog:deps" diff --git a/packages/devtools-rpc/src/client.ts b/packages/devtools-rpc/src/client.ts index 5d55dddf..15ad3ae4 100644 --- a/packages/devtools-rpc/src/client.ts +++ b/packages/devtools-rpc/src/client.ts @@ -8,7 +8,7 @@ export function createRpcClient< functions: ClientFunctions, options: { preset: BirpcOptions - rpcOptions?: BirpcOptions + rpcOptions?: Partial> }, ) { const { preset, rpcOptions = {} } = options diff --git a/packages/devtools-rpc/src/presets/index.ts b/packages/devtools-rpc/src/presets/index.ts new file mode 100644 index 00000000..661fc690 --- /dev/null +++ b/packages/devtools-rpc/src/presets/index.ts @@ -0,0 +1,17 @@ +import type { BirpcGroup, BirpcOptions, ChannelOptions } from 'birpc' + +export type RpcServerPresetReturnType = (rpc: BirpcGroup, options?: Pick, 'serialize' | 'deserialize'>) => void +export type RpcServerPresetBasicType = (...args: any[]) => RpcServerPresetReturnType +export type RpcServerPreset = (...args: Parameters) => RpcServerPresetReturnType + +export function defineRpcServerPreset(preset: T): RpcServerPreset { + return preset +} + +export type RpcClientPresetReturnType = Omit +export type RpcClientPresetBasicType = (...args: any[]) => RpcClientPresetReturnType +export type RpcClientPreset = (...args: Parameters) => RpcClientPresetReturnType + +export function defineRpcClientPreset(preset: T): RpcClientPreset { + return preset +} diff --git a/packages/devtools-rpc/src/presets/ws/client.ts b/packages/devtools-rpc/src/presets/ws/client.ts index 480b0a49..066b8733 100644 --- a/packages/devtools-rpc/src/presets/ws/client.ts +++ b/packages/devtools-rpc/src/presets/ws/client.ts @@ -1,11 +1,36 @@ import { parse, stringify } from 'structured-clone-es' +import { defineRpcClientPreset } from '..' export interface WebSocketRpcClientOptions { url: string + onConnected?: (e: Event) => void + onError?: (e: Error) => void + onDisconnected?: (e: CloseEvent) => void } -export function createWsRpcPreset(options: WebSocketRpcClientOptions) { +function NOOP() {} + +export const createWsRpcPreset = defineRpcClientPreset((options: WebSocketRpcClientOptions) => { const ws = new WebSocket(options.url) + const { + onConnected = NOOP, + onError = NOOP, + onDisconnected = NOOP, + } = options + + ws.addEventListener('open', (e) => { + onConnected(e) + }) + + ws.addEventListener('error', (e) => { + const _e = e instanceof Error ? e : new Error(e.type) + onError(_e) + }) + + ws.addEventListener('close', (e) => { + onDisconnected(e) + }) + return { on: (handler: (data: string) => void) => { ws.addEventListener('message', (e) => { @@ -27,4 +52,4 @@ export function createWsRpcPreset(options: WebSocketRpcClientOptions) { serialize: stringify, deserialize: parse, } -} +}) diff --git a/packages/devtools-rpc/src/presets/ws/server.ts b/packages/devtools-rpc/src/presets/ws/server.ts index 1b2832e8..1be309cc 100644 --- a/packages/devtools-rpc/src/presets/ws/server.ts +++ b/packages/devtools-rpc/src/presets/ws/server.ts @@ -1,14 +1,22 @@ import type { BirpcGroup, BirpcOptions, ChannelOptions } from 'birpc' +import type { WebSocket } from 'ws' import { parse, stringify } from 'structured-clone-es' import { WebSocketServer } from 'ws' +import { defineRpcServerPreset } from '..' export interface WebSocketRpcServerOptions { port: number + onConnected?: (ws: WebSocket) => void + onDisconnected?: (ws: WebSocket) => void } -export function createWsRpcPreset(options: WebSocketRpcServerOptions) { +function NOOP() {} + +export const createWsRpcPreset = defineRpcServerPreset((options: WebSocketRpcServerOptions) => { const { port, + onConnected = NOOP, + onDisconnected = NOOP, } = options const wss = new WebSocketServer({ port, @@ -44,7 +52,9 @@ export function createWsRpcPreset(options: WebSocketRpcServerOptions) { if (index >= 0) channels.splice(index, 1) }) + onDisconnected(ws) }) + onConnected(ws) }) } -} +}) diff --git a/packages/devtools-rpc/src/server.ts b/packages/devtools-rpc/src/server.ts index e9992991..4c1c31a6 100644 --- a/packages/devtools-rpc/src/server.ts +++ b/packages/devtools-rpc/src/server.ts @@ -1,4 +1,4 @@ -import type { BirpcGroup, BirpcOptions } from 'birpc' +import type { BirpcGroup, EventOptions } from 'birpc' import { createBirpcGroup } from 'birpc' export function createRpcServer< @@ -8,7 +8,7 @@ export function createRpcServer< functions: ServerFunctions, options: { preset: (rpc: BirpcGroup) => void - rpcOptions?: BirpcOptions + rpcOptions?: EventOptions }, ) { const rpc = createBirpcGroup(functions, [], options?.rpcOptions ?? {}) diff --git a/packages/devtools-rpc/tsdown.config.ts b/packages/devtools-rpc/tsdown.config.ts index 6db80964..34ed6d67 100644 --- a/packages/devtools-rpc/tsdown.config.ts +++ b/packages/devtools-rpc/tsdown.config.ts @@ -1,9 +1,14 @@ import { defineConfig } from 'tsdown' -export default defineConfig({ +export default defineConfig([{ entry: [ 'src/index.ts', ], clean: true, fixedExtension: true, -}) +}, { + entry: ['src/presets/ws/client.ts', 'src/presets/ws/server.ts', 'src/presets/index.ts'], + clean: true, + fixedExtension: true, + outDir: 'dist/presets', +}]) diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 4189ac5d..85eaac5c 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -36,6 +36,7 @@ }, "dependencies": { "@rolldown/debug": "catalog:deps", + "@vitejs/devtools-rpc": "workspace:*", "ansis": "catalog:deps", "birpc": "catalog:deps", "cac": "catalog:deps", diff --git a/packages/devtools/src/app/app.vue b/packages/devtools/src/app/app.vue index 78bff20d..947e9e34 100644 --- a/packages/devtools/src/app/app.vue +++ b/packages/devtools/src/app/app.vue @@ -1,9 +1,7 @@