Skip to content

Commit a3b61f5

Browse files
committed
feat: auto generated peer id
1 parent cbeb472 commit a3b61f5

File tree

11 files changed

+56
-52
lines changed

11 files changed

+56
-52
lines changed

docs/1.guide/3.peer.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@ Websocket [hooks](/guide/hooks) accept a peer instance as their first argument.
1717

1818
Send a message to the connected client
1919

20+
### `peer.addr`
21+
22+
The peer address (might be `undefined`)
23+
2024
### `peer.id`
2125

22-
The peer address or unique id (might be `undefined`)
26+
A unique id assigned to the peer.
2327

2428
### `peer.readyState`
2529

examples/h3/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ export const websocket = {
1010
hooks: defineHooks({
1111
open(peer) {
1212
console.log("[ws] open", peer);
13-
peer.send({ user: "system", message: `Welcome ${peer}!` });
13+
peer.send({ user: "server", message: `Welcome ${peer}!` });
1414
},
1515

1616
message(peer, message) {
1717
console.log("[ws] message", peer, message);
1818
if (message.text().includes("ping")) {
19-
peer.send({ user: "system", message: "pong" });
19+
peer.send({ user: "server", message: "pong" });
2020
} else {
2121
peer.send({ user: peer.toString(), message: message.toString() });
2222
}

examples/h3/public/index.html

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@
6464
const isSecure = location.protocol === "https:";
6565
const url = (isSecure ? "wss://" : "ws://") + location.host + "/_ws";
6666
if (ws) {
67-
log("system", "Closing previous connection before reconnecting...");
67+
log("ws", "Closing previous connection before reconnecting...");
6868
ws.close();
6969
clear();
7070
}
7171

72-
log("system", "Connecting to", url, "...");
72+
log("ws", "Connecting to", url, "...");
7373
ws = new WebSocket(url);
7474

7575
ws.addEventListener("message", (event) => {
@@ -83,7 +83,7 @@
8383
});
8484

8585
await new Promise((resolve) => ws.addEventListener("open", resolve));
86-
log("system", "Connected!");
86+
log("ws", "Connected!");
8787
};
8888

8989
const clear = () => {
@@ -100,7 +100,7 @@
100100
};
101101

102102
const ping = () => {
103-
log("you", "Sending ping");
103+
log("ws", "Sending ping");
104104
ws.send("ping");
105105
};
106106

@@ -114,7 +114,6 @@
114114
}).mount();
115115

116116
await connect();
117-
ping();
118117
</script>
119118
</head>
120119
<body class="h-screen flex flex-col justify-between">
@@ -126,7 +125,7 @@
126125
<p class="text-gray-500 mb-1 text-xs ml-10">{{ message.user }}</p>
127126
<div class="flex items-center">
128127
<img
129-
:src="'https://www.gravatar.com/avatar/' + (message.user + rand) + '?s=512&d=monsterid'"
128+
:src="'https://www.gravatar.com/avatar/' + encodeURIComponent(message.user + rand) + '?s=512&d=monsterid'"
130129
alt="Avatar"
131130
class="w-8 h-8 rounded-full"
132131
/>

playground/_index.html.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ export default /* html */ `
6565
const isSecure = location.protocol === "https:";
6666
const url = (isSecure ? "wss://" : "ws://") + location.host + "/_ws";
6767
if (ws) {
68-
log("system", "Closing previous connection before reconnecting...");
68+
log("ws", "Closing previous connection before reconnecting...");
6969
ws.close();
7070
clear();
7171
}
7272
73-
log("system", "Connecting to", url, "...");
73+
log("ws", "Connecting to", url, "...");
7474
ws = new WebSocket(url);
7575
7676
ws.addEventListener("message", (event) => {
@@ -84,7 +84,7 @@ export default /* html */ `
8484
});
8585
8686
await new Promise((resolve) => ws.addEventListener("open", resolve));
87-
log("system", "Connected!");
87+
log("ws", "Connected!");
8888
};
8989
9090
const clear = () => {
@@ -101,7 +101,7 @@ export default /* html */ `
101101
};
102102
103103
const ping = () => {
104-
log("you", "Sending ping");
104+
log("ws", "Sending ping");
105105
ws.send("ping");
106106
};
107107
@@ -115,7 +115,6 @@ export default /* html */ `
115115
}).mount();
116116
117117
await connect();
118-
ping();
119118
</script>
120119
</head>
121120
<body class="h-screen flex flex-col justify-between">
@@ -127,7 +126,7 @@ export default /* html */ `
127126
<p class="text-gray-500 mb-1 text-xs ml-10">{{ message.user }}</p>
128127
<div class="flex items-center">
129128
<img
130-
:src="'https://www.gravatar.com/avatar/' + (message.user + rand) + '?s=512&d=monsterid'"
129+
:src="'https://www.gravatar.com/avatar/' + encodeURIComponent(message.user + rand) + '?s=512&d=monsterid'"
131130
alt="Avatar"
132131
class="w-8 h-8 rounded-full"
133132
/>
@@ -187,5 +186,5 @@ export default /* html */ `
187186
</div>
188187
</main>
189188
</body>
190-
</html>
189+
</html>\
191190
`.trim();

playground/_shared.ts

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,16 @@ export function createDemo<T extends Adapter<any, any>>(
88
options?: Parameters<T>[0],
99
): ReturnType<T> {
1010
const hooks = defineHooks({
11-
$(name, peer, ...args) {
12-
console.log(
13-
`$ ${peer} ${name} (${args.map((arg) => stringify(arg)).join(", ")})`,
14-
);
15-
},
1611
open(peer) {
17-
peer.send({ user: "system", message: `Welcome to the server ${peer}!` });
12+
console.log(`[ws] open ${peer}`);
13+
peer.send({ user: "server", message: `Welcome to the server ${peer}!` });
1814
peer.subscribe("chat");
19-
peer.publish("chat", { user: "system", message: `${peer} joined!` });
15+
peer.publish("chat", { user: "server", message: `${peer} joined!` });
2016
},
2117
message(peer, message) {
18+
console.log(`[ws] message ${peer} ${message.text()}`);
2219
if (message.text() === "ping") {
23-
peer.send({ user: "system", message: "pong" });
20+
peer.send({ user: "server", message: "pong" });
2421
} else {
2522
const _message = {
2623
user: peer.toString(),
@@ -31,35 +28,26 @@ export function createDemo<T extends Adapter<any, any>>(
3128
}
3229
},
3330
upgrade(req) {
31+
console.log("[ws] upgrade", req.url);
3432
return {
3533
headers: {
3634
"x-powered-by": "cross-ws",
3735
"set-cookie": "cross-ws=1; SameSite=None; Secure",
3836
},
3937
};
4038
},
39+
close(peer, details) {
40+
console.log(`[ws] close ${peer}`, details);
41+
},
42+
error(peer, error) {
43+
console.log(`[ws] error ${peer}`, error);
44+
},
4145
});
4246

43-
const resolve: ResolveHooks = (info) => {
44-
return {
45-
open: (peer) => {
46-
peer.send({
47-
message: {
48-
info: {
49-
url: info.url,
50-
headers:
51-
info.headers && Object.fromEntries(new Headers(info.headers)),
52-
},
53-
},
54-
});
55-
},
56-
};
57-
};
58-
5947
return adapter({
6048
...options,
6149
hooks,
62-
resolve,
50+
// resolve,
6351
});
6452
}
6553

src/adapters/bun.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export default defineWebSocketAdapter<BunAdapter, BunOptions>(
8181
class BunPeer extends Peer<{
8282
bun: { ws: ServerWebSocket<ContextData> };
8383
}> {
84-
get id() {
84+
get addr() {
8585
let addr = this.ctx.bun.ws.remoteAddress;
8686
if (addr.includes(":")) {
8787
addr = `[${addr}]`;

src/adapters/cloudflare.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class CloudflarePeer extends Peer<{
8888
context: _cf.ExecutionContext;
8989
};
9090
}> {
91-
get id() {
91+
get addr() {
9292
return undefined;
9393
}
9494

src/adapters/deno.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class DenoPeer extends Peer<{
7373
info: ServeHandlerInfo;
7474
};
7575
}> {
76-
get id() {
76+
get addr() {
7777
// @ts-expect-error types missing
7878
return this.ctx.deno.ws.remoteAddress;
7979
}

src/adapters/node.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ class NodePeer extends Peer<{
114114
ws: WebSocketT;
115115
};
116116
}> {
117-
get id() {
117+
get addr() {
118118
const socket = this.ctx.node.req.socket;
119119
if (!socket) {
120120
return undefined;

src/adapters/uws.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class UWSPeer extends Peer<{
149149
_headers: HeadersInit | undefined;
150150
_decoder = new TextDecoder();
151151

152-
get id() {
152+
get addr() {
153153
try {
154154
const addr = this._decoder.decode(
155155
this.ctx.uws.ws?.getRemoteAddressAsText(),

src/peer.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,21 @@ const ReadyStateMap = {
1111
} as const;
1212

1313
export abstract class Peer<AdapterContext = any> implements WSRequest {
14-
_subscriptions: Set<string> = new Set();
14+
private _subscriptions: Set<string> = new Set();
1515

16-
constructor(public ctx: AdapterContext) {}
16+
static _idCounter = 0;
17+
private _id: string;
1718

18-
get id(): string | undefined {
19-
return "??";
19+
constructor(public ctx: AdapterContext) {
20+
this._id = ++Peer._idCounter + "";
21+
}
22+
23+
get id(): string {
24+
return this._id.toString();
25+
}
26+
27+
get addr(): string | undefined {
28+
return undefined;
2029
}
2130

2231
get url(): string {
@@ -46,10 +55,15 @@ export abstract class Peer<AdapterContext = any> implements WSRequest {
4655
}
4756

4857
toString() {
49-
return `${this.id || ""}${this.readyState === 1 || this.readyState === -1 ? "" : ` [${ReadyStateMap[this.readyState]}]`}`;
58+
return `#${this.id}`;
5059
}
5160

5261
[Symbol.for("nodejs.util.inspect.custom")]() {
53-
return this.toString();
62+
const _addr = this.addr || "??";
63+
const _state =
64+
this.readyState === 1 || this.readyState === -1
65+
? ""
66+
: ` [${ReadyStateMap[this.readyState]}]`;
67+
return `Peer<${_addr}${_state}>`;
5468
}
5569
}

0 commit comments

Comments
 (0)