Skip to content

Commit 04a0c07

Browse files
webfansplzantfu
andauthored
feat: migrate to rpc package (#3)
Co-authored-by: Anthony Fu <github@antfu.me>
1 parent fbde82e commit 04a0c07

File tree

27 files changed

+388
-251
lines changed

27 files changed

+388
-251
lines changed

eslint.config.js

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,3 @@ export default antfu({
1212
'no-console': 'off',
1313
},
1414
})
15-
.append({
16-
files: ['pnpm-workspace.yaml'],
17-
name: 'antfu/yaml/pnpm-workspace',
18-
rules: {
19-
'yaml/sort-keys': [
20-
'error',
21-
{
22-
order: [
23-
'packages',
24-
'overrides',
25-
'patchedDependencies',
26-
'hoistPattern',
27-
'catalog',
28-
'catalogs',
29-
30-
'allowedDeprecatedVersions',
31-
'allowNonAppliedPatches',
32-
'configDependencies',
33-
'ignoredBuiltDependencies',
34-
'ignoredOptionalDependencies',
35-
'neverBuiltDependencies',
36-
'onlyBuiltDependencies',
37-
'onlyBuiltDependenciesFile',
38-
'packageExtensions',
39-
'peerDependencyRules',
40-
'supportedArchitectures',
41-
],
42-
pathPattern: '^$',
43-
},
44-
{
45-
order: { type: 'asc' },
46-
pathPattern: '.*',
47-
},
48-
],
49-
},
50-
})

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
},
5353
"resolutions": {
5454
"@nuxt/devtools": "catalog:devtools",
55+
"@nuxt/kit": "catalog:build",
5556
"@rolldown/debug": "catalog:deps",
5657
"esbuild": "catalog:build",
5758
"nitropack": "catalog:build",

packages/devtools-rpc/package.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
],
1919
"sideEffects": false,
2020
"exports": {
21-
".": "./dist/index.mjs"
21+
".": "./dist/index.mjs",
22+
"./presets/ws/server": "./dist/presets/ws/server.mjs",
23+
"./presets/ws/client": "./dist/presets/ws/client.mjs",
24+
"./presets": "./dist/presets/index.mjs"
2225
},
2326
"main": "./dist/index.mjs",
2427
"types": "./dist/index.d.mts",
@@ -30,6 +33,11 @@
3033
"dev": "tsdown --watch",
3134
"prepack": "pnpm build"
3235
},
36+
"peerDependenciesMeta": {
37+
"ws": {
38+
"optional": true
39+
}
40+
},
3341
"dependencies": {
3442
"birpc": "catalog:deps",
3543
"structured-clone-es": "catalog:deps"

packages/devtools-rpc/src/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export function createRpcClient<
88
functions: ClientFunctions,
99
options: {
1010
preset: BirpcOptions<ServerFunctions>
11-
rpcOptions?: BirpcOptions<ServerFunctions>
11+
rpcOptions?: Partial<BirpcOptions<ServerFunctions>>
1212
},
1313
) {
1414
const { preset, rpcOptions = {} } = options
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { BirpcGroup, BirpcOptions, ChannelOptions } from 'birpc'
2+
3+
export type RpcServerPresetReturnType = <ClientFunctions, ServerFunctions>(rpc: BirpcGroup<ClientFunctions, ServerFunctions>, options?: Pick<BirpcOptions<ClientFunctions>, 'serialize' | 'deserialize'>) => void
4+
export type RpcServerPresetBasicType = (...args: any[]) => RpcServerPresetReturnType
5+
export type RpcServerPreset<T extends RpcServerPresetBasicType> = (...args: Parameters<T>) => RpcServerPresetReturnType
6+
7+
export function defineRpcServerPreset<T extends RpcServerPresetBasicType>(preset: T): RpcServerPreset<T> {
8+
return preset
9+
}
10+
11+
export type RpcClientPresetReturnType = Omit<ChannelOptions, 'bind'>
12+
export type RpcClientPresetBasicType = (...args: any[]) => RpcClientPresetReturnType
13+
export type RpcClientPreset<T extends RpcClientPresetBasicType> = (...args: Parameters<T>) => RpcClientPresetReturnType
14+
15+
export function defineRpcClientPreset<T extends RpcClientPresetBasicType>(preset: T): RpcClientPreset<T> {
16+
return preset
17+
}

packages/devtools-rpc/src/presets/ws/client.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,36 @@
11
import { parse, stringify } from 'structured-clone-es'
2+
import { defineRpcClientPreset } from '..'
23

34
export interface WebSocketRpcClientOptions {
45
url: string
6+
onConnected?: (e: Event) => void
7+
onError?: (e: Error) => void
8+
onDisconnected?: (e: CloseEvent) => void
59
}
610

7-
export function createWsRpcPreset(options: WebSocketRpcClientOptions) {
11+
function NOOP() {}
12+
13+
export const createWsRpcPreset = defineRpcClientPreset((options: WebSocketRpcClientOptions) => {
814
const ws = new WebSocket(options.url)
15+
const {
16+
onConnected = NOOP,
17+
onError = NOOP,
18+
onDisconnected = NOOP,
19+
} = options
20+
21+
ws.addEventListener('open', (e) => {
22+
onConnected(e)
23+
})
24+
25+
ws.addEventListener('error', (e) => {
26+
const _e = e instanceof Error ? e : new Error(e.type)
27+
onError(_e)
28+
})
29+
30+
ws.addEventListener('close', (e) => {
31+
onDisconnected(e)
32+
})
33+
934
return {
1035
on: (handler: (data: string) => void) => {
1136
ws.addEventListener('message', (e) => {
@@ -27,4 +52,4 @@ export function createWsRpcPreset(options: WebSocketRpcClientOptions) {
2752
serialize: stringify,
2853
deserialize: parse,
2954
}
30-
}
55+
})

packages/devtools-rpc/src/presets/ws/server.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import type { BirpcGroup, BirpcOptions, ChannelOptions } from 'birpc'
2+
import type { WebSocket } from 'ws'
23
import { parse, stringify } from 'structured-clone-es'
34
import { WebSocketServer } from 'ws'
5+
import { defineRpcServerPreset } from '..'
46

57
export interface WebSocketRpcServerOptions {
68
port: number
9+
onConnected?: (ws: WebSocket) => void
10+
onDisconnected?: (ws: WebSocket) => void
711
}
812

9-
export function createWsRpcPreset(options: WebSocketRpcServerOptions) {
13+
function NOOP() {}
14+
15+
export const createWsRpcPreset = defineRpcServerPreset((options: WebSocketRpcServerOptions) => {
1016
const {
1117
port,
18+
onConnected = NOOP,
19+
onDisconnected = NOOP,
1220
} = options
1321
const wss = new WebSocketServer({
1422
port,
@@ -44,7 +52,9 @@ export function createWsRpcPreset(options: WebSocketRpcServerOptions) {
4452
if (index >= 0)
4553
channels.splice(index, 1)
4654
})
55+
onDisconnected(ws)
4756
})
57+
onConnected(ws)
4858
})
4959
}
50-
}
60+
})

packages/devtools-rpc/src/server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { BirpcGroup, BirpcOptions } from 'birpc'
1+
import type { BirpcGroup, EventOptions } from 'birpc'
22
import { createBirpcGroup } from 'birpc'
33

44
export function createRpcServer<
@@ -8,7 +8,7 @@ export function createRpcServer<
88
functions: ServerFunctions,
99
options: {
1010
preset: (rpc: BirpcGroup<ClientFunctions, ServerFunctions>) => void
11-
rpcOptions?: BirpcOptions<ClientFunctions>
11+
rpcOptions?: EventOptions<ClientFunctions>
1212
},
1313
) {
1414
const rpc = createBirpcGroup<ClientFunctions, ServerFunctions>(functions, [], options?.rpcOptions ?? {})
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import { defineConfig } from 'tsdown'
22

3-
export default defineConfig({
3+
export default defineConfig([{
44
entry: [
55
'src/index.ts',
66
],
77
clean: true,
88
fixedExtension: true,
9-
})
9+
}, {
10+
entry: ['src/presets/ws/client.ts', 'src/presets/ws/server.ts', 'src/presets/index.ts'],
11+
clean: true,
12+
fixedExtension: true,
13+
outDir: 'dist/presets',
14+
}])

packages/devtools/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
},
3737
"dependencies": {
3838
"@rolldown/debug": "catalog:deps",
39+
"@vitejs/devtools-rpc": "workspace:*",
3940
"ansis": "catalog:deps",
4041
"birpc": "catalog:deps",
4142
"cac": "catalog:deps",

0 commit comments

Comments
 (0)