Skip to content

Commit 253d0cc

Browse files
committed
Remove dependency: ws
1 parent 151747b commit 253d0cc

5 files changed

Lines changed: 49 additions & 66 deletions

File tree

lib/metacom.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
const { Emitter, generateUUID, jsonParse } = require('metautil');
4-
const WebSocket = globalThis.WebSocket || require('ws');
4+
const { WebSocket } = globalThis;
55
const { chunkDecode } = require('./chunks.js');
66
const { MetaReadable, MetaWritable } = require('./streams.js');
77

package-lock.json

Lines changed: 1 addition & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,13 @@
6464
"node": ">=18"
6565
},
6666
"dependencies": {
67-
"metautil": "^5.4.0",
68-
"ws": "^8.21.0"
67+
"metautil": "^5.4.0"
6968
},
7069
"devDependencies": {
7170
"@types/node": "^25.9.3",
72-
"@types/ws": "^8.18.1",
7371
"eslint": "^9.39.4",
7472
"eslint-config-metarhia": "^9.1.9",
7573
"metarhia-build": "^0.0.3",
76-
"metaskills": "^1.0.4",
7774
"prettier": "^3.8.4",
7875
"typescript": "^5.9.3"
7976
}

test/client.js

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
'use strict';
22

3+
const http = require('node:http');
34
const timers = require('node:timers/promises');
45
const { Blob } = require('node:buffer');
56
const { test } = require('node:test');
67
const assert = require('node:assert');
7-
const { WebSocketServer } = require('ws');
88
const metautil = require('metautil');
9+
const { WebsocketServer } = require('#ws');
910
const { randomUUID } = require('node:crypto');
1011
const { Metacom } = require('../lib/metacom.js');
1112
const { chunkEncode, chunkDecode } = require('../lib/chunks.js');
@@ -16,6 +17,17 @@ process.emitWarning = (warning, type, ...args) => {
1617
emitWarning(warning, type, ...args);
1718
};
1819

20+
const createWsServer = () => {
21+
const httpServer = http.createServer();
22+
const wsServer = new WebsocketServer({ server: httpServer });
23+
return { httpServer, wsServer };
24+
};
25+
26+
const listen = (httpServer, port) =>
27+
new Promise((resolve, reject) => {
28+
httpServer.listen(port, (error) => (error ? reject(error) : resolve()));
29+
});
30+
1931
test('Client / calls', async (t) => {
2032
const api = {
2133
system: {
@@ -43,11 +55,12 @@ test('Client / calls', async (t) => {
4355
};
4456

4557
let serverWs = null;
46-
const mockServer = new WebSocketServer({ port: 8000 });
58+
const { httpServer, wsServer: mockServer } = createWsServer();
59+
await listen(httpServer, 8000);
4760
mockServer.on('connection', (ws) => {
4861
serverWs = ws;
4962
ws.on('message', async (raw) => {
50-
const packet = metautil.jsonParse(raw) || {};
63+
const packet = metautil.jsonParse(raw.toString()) || {};
5164
const { type, id, method } = packet;
5265
const [unit, name] = method.split('/');
5366
if (type !== 'call') return;
@@ -63,7 +76,7 @@ test('Client / calls', async (t) => {
6376

6477
let client;
6578

66-
t.after(() => void mockServer.close());
79+
t.after(() => void httpServer.close());
6780

6881
t.beforeEach(async () => {
6982
const options = { callTimeout: 300 };
@@ -123,10 +136,11 @@ test('Client / stale callback', async (t) => {
123136
},
124137
};
125138

126-
const mockServer = new WebSocketServer({ port: 8010 });
139+
const { httpServer, wsServer: mockServer } = createWsServer();
140+
await listen(httpServer, 8010);
127141
mockServer.on('connection', (ws) => {
128142
ws.on('message', async (raw) => {
129-
const packet = metautil.jsonParse(raw) || {};
143+
const packet = metautil.jsonParse(raw.toString()) || {};
130144
const { type, id, method } = packet;
131145
const [unit, name] = method?.split('/') || [];
132146
if (type !== 'call') return;
@@ -152,7 +166,7 @@ test('Client / stale callback', async (t) => {
152166
});
153167
});
154168

155-
t.after(() => void mockServer.close());
169+
t.after(() => void httpServer.close());
156170

157171
await t.test('throws on stale callback for unknown id', async () => {
158172
const client = await Metacom.connect('ws://localhost:8010/');
@@ -190,15 +204,16 @@ test('Client / events', async (t) => {
190204
},
191205
};
192206

193-
const mockServer = new WebSocketServer({ port: 8001 });
207+
const { httpServer, wsServer: mockServer } = createWsServer();
208+
await listen(httpServer, 8001);
194209
mockServer.on('connection', (ws) => {
195210
const pingInterval = setInterval(() => {
196211
const packet = { type: 'event', name: 'test/ping', data: { ping: true } };
197212
ws.send(JSON.stringify(packet));
198213
}, 100);
199214
ws.on('close', () => void clearInterval(pingInterval));
200215
ws.on('message', async (raw) => {
201-
const packet = metautil.jsonParse(raw) || {};
216+
const packet = metautil.jsonParse(raw.toString()) || {};
202217
if (packet.type === 'call' && packet.method === 'system/introspect') {
203218
const introspection = { type: 'callback', id: packet.id, result: api };
204219
ws.send(JSON.stringify(introspection));
@@ -214,7 +229,7 @@ test('Client / events', async (t) => {
214229

215230
let client;
216231

217-
t.after(() => void mockServer.close());
232+
t.after(() => void httpServer.close());
218233

219234
t.beforeEach(async () => {
220235
client = await Metacom.connect('ws://localhost:8001/');
@@ -249,7 +264,7 @@ test('Client / stream', async (t) => {
249264
const reader = blob.stream().getReader();
250265
let chunk;
251266
while (!(chunk = await reader.read()).done) {
252-
ws.send(chunkEncode(id, chunk.value));
267+
ws.sendBinary(Buffer.from(chunkEncode(id, chunk.value)));
253268
}
254269
ws.send(JSON.stringify(endPacket));
255270
};
@@ -291,7 +306,8 @@ test('Client / stream', async (t) => {
291306
},
292307
};
293308

294-
const mockServer = new WebSocketServer({ port: 8002 });
309+
const { httpServer, wsServer: mockServer } = createWsServer();
310+
await listen(httpServer, 8002);
295311
mockServer.on('connection', (ws) => {
296312
const pingInterval = setInterval(() => {
297313
const packet = { type: 'event', name: 'test/ping', data: { ping: true } };
@@ -300,7 +316,7 @@ test('Client / stream', async (t) => {
300316
ws.on('close', () => void clearInterval(pingInterval));
301317
ws.on('message', async (raw, isBinary) => {
302318
if (isBinary) return void handleBinary(new Uint8Array(raw));
303-
const packet = metautil.jsonParse(raw) || {};
319+
const packet = metautil.jsonParse(raw.toString()) || {};
304320
if (packet.type === 'call' && packet.method === 'system/introspect') {
305321
const introspection = { type: 'callback', id: packet.id, result: api };
306322
return void ws.send(JSON.stringify(introspection));
@@ -316,7 +332,7 @@ test('Client / stream', async (t) => {
316332

317333
let client;
318334

319-
t.after(() => void mockServer.close());
335+
t.after(() => void httpServer.close());
320336

321337
t.beforeEach(async () => {
322338
client = await Metacom.connect('ws://localhost:8002/');
@@ -364,10 +380,11 @@ test('Client / different ID generation strategies', async (t) => {
364380
},
365381
};
366382

367-
const mockServer = new WebSocketServer({ port: 8004 });
383+
const { httpServer, wsServer: mockServer } = createWsServer();
384+
await listen(httpServer, 8004);
368385
mockServer.on('connection', (ws) => {
369386
ws.on('message', async (raw) => {
370-
const packet = metautil.jsonParse(raw) || {};
387+
const packet = metautil.jsonParse(raw.toString()) || {};
371388
const { type, id, method } = packet;
372389
const [unit, name] = method.split('/');
373390
if (type !== 'call') return;
@@ -381,7 +398,7 @@ test('Client / different ID generation strategies', async (t) => {
381398
});
382399
});
383400

384-
t.after(() => void mockServer.close());
401+
t.after(() => void httpServer.close());
385402

386403
await t.test('works with UUID generation', async () => {
387404
const client = await Metacom.connect('ws://localhost:8004/');

test/server.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict';
22

33
const timers = require('node:timers/promises');
4-
const { WebSocket } = require('ws');
54
const { randomUUID } = require('node:crypto');
65
const { test } = require('node:test');
76
const assert = require('node:assert');
@@ -94,11 +93,12 @@ test('Server / calls', async (t) => {
9493
const id = randomUUID();
9594
const args = { name: 'Max' };
9695
const packet = { type: 'call', id, method: 'test/hello', args };
97-
const socket = new WebSocket(`ws://${options.host}:${options.port}`);
98-
await new Promise((res) => socket.on('open', res));
96+
const socket = new ProtocolClient(`ws://${options.host}:${options.port}`);
97+
await new Promise((res) => socket.once('open', res));
9998
socket.send(JSON.stringify(packet));
100-
const resPacket = await new Promise((res) => socket.on('message', res));
101-
const response = JSON.parse(resPacket);
99+
const resPacket = await new Promise((res) => socket.once('message', res));
100+
const response = JSON.parse(resPacket.toString());
101+
socket.close();
102102
assert.strictEqual(response.id, id);
103103
assert.strictEqual(response.type, 'callback');
104104
assert.strictEqual(response.result, `Hello, ${args.name}`);
@@ -108,11 +108,14 @@ test('Server / calls', async (t) => {
108108
const id = randomUUID();
109109
const args = { name: 'Max' };
110110
const packet = { type: 'call', id, method: 'test/hello', args };
111-
const socket = new WebSocket(`ws://${options.host}:${options.port}/api`);
112-
await new Promise((res) => socket.on('open', res));
111+
const socket = new ProtocolClient(
112+
`ws://${options.host}:${options.port}/api`,
113+
);
114+
await new Promise((res) => socket.once('open', res));
113115
socket.send(JSON.stringify(packet));
114-
const resPacket = await new Promise((res) => socket.on('message', res));
115-
const response = JSON.parse(resPacket);
116+
const resPacket = await new Promise((res) => socket.once('message', res));
117+
const response = JSON.parse(resPacket.toString());
118+
socket.close();
116119
assert.strictEqual(response.id, id);
117120
assert.strictEqual(response.type, 'callback');
118121
assert.strictEqual(response.result, `Hello, ${args.name}`);

0 commit comments

Comments
 (0)