@seriousme/opifex 2.3.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/client.ts +5 -0
- package/connNext/baseConnNext.ts +123 -0
- package/deno/tlsServer.test.ts +1 -1
- package/deno/wsServer.ts +11 -3
- package/dev_utils/WebStreamEndpoint.ts +5 -0
- package/dev_utils/asyncStreamEndpoint.ts +5 -0
- package/dev_utils/asyncStreamPair.ts +4 -9
- package/dev_utils/asyncStreamPairToNext.ts +45 -0
- package/dev_utils/asyncStreamToNext.ts +30 -137
- package/dev_utils/connNextPair.test.ts +2 -2
- package/dev_utils/generateCert.ts +297 -77
- package/dev_utils/mockConn.ts +37 -93
- package/dev_utils/mockServer.ts +1 -1
- package/dev_utils/webStreamPair.ts +3 -7
- package/dev_utils/webStreamPairToNext.ts +48 -0
- package/dev_utils/webStreamToNext.ts +28 -161
- package/dist/client/client.d.ts +4 -0
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +3 -0
- package/dist/client/client.js.map +1 -1
- package/dist/connNext/baseConnNext.d.ts +20 -0
- package/dist/connNext/baseConnNext.d.ts.map +1 -0
- package/dist/connNext/baseConnNext.js +95 -0
- package/dist/connNext/baseConnNext.js.map +1 -0
- package/dist/dev_utils/generateCert.d.ts +5 -4
- package/dist/dev_utils/generateCert.d.ts.map +1 -1
- package/dist/dev_utils/generateCert.js +230 -65
- package/dist/dev_utils/generateCert.js.map +1 -1
- package/dist/examples/mqtt+mqtts.test.js +1 -1
- package/dist/examples/mqtt+mqtts.test.js.map +1 -1
- package/dist/examples/mqtts.test.js +1 -1
- package/dist/examples/mqtts.test.js.map +1 -1
- package/dist/node/nodeSocketToNext.d.ts +10 -13
- package/dist/node/nodeSocketToNext.d.ts.map +1 -1
- package/dist/node/nodeSocketToNext.js +75 -131
- package/dist/node/nodeSocketToNext.js.map +1 -1
- package/dist/web/webSocketToNext.d.ts +18 -1
- package/dist/web/webSocketToNext.d.ts.map +1 -1
- package/dist/web/webSocketToNext.js +92 -127
- package/dist/web/webSocketToNext.js.map +1 -1
- package/dist/web/wsClient.d.ts.map +1 -1
- package/dist/web/wsClient.js +4 -3
- package/dist/web/wsClient.js.map +1 -1
- package/examples/mqtt+mqtts.test.ts +1 -1
- package/examples/mqtts.test.ts +1 -1
- package/node/nodeSocketToNext.ts +85 -148
- package/node/tlsServer.test.ts +1 -1
- package/package.json +2 -4
- package/web/webSocketToNext.ts +108 -145
- package/web/wsClient.ts +10 -3
- package/dev_utils/webStreamPair.test.ts +0 -171
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { test } from "node:test";
|
|
2
|
-
import assert from "node:assert";
|
|
3
|
-
import { createWebStreamPair } from "./webStreamPair.ts";
|
|
4
|
-
|
|
5
|
-
test("Echo server shuts down cleanly when client closes input", async () => {
|
|
6
|
-
const { input, output } = createWebStreamPair();
|
|
7
|
-
|
|
8
|
-
const echoPromise = output.readable.pipeTo(output.writable);
|
|
9
|
-
|
|
10
|
-
const writer = input.writable.getWriter();
|
|
11
|
-
const reader = input.readable.getReader();
|
|
12
|
-
|
|
13
|
-
// Client closes their side
|
|
14
|
-
await writer.close();
|
|
15
|
-
|
|
16
|
-
// The echo server's pipeTo should resolve and finish successfully
|
|
17
|
-
await assert.doesNotReject(echoPromise);
|
|
18
|
-
|
|
19
|
-
// The client's reader should now receive the end-of-stream signal
|
|
20
|
-
const { done } = await reader.read();
|
|
21
|
-
assert.strictEqual(done, true);
|
|
22
|
-
|
|
23
|
-
writer.releaseLock();
|
|
24
|
-
reader.releaseLock();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test("Data written to input.writable arrives at output.readable", async () => {
|
|
28
|
-
const { input, output } = createWebStreamPair();
|
|
29
|
-
|
|
30
|
-
const echoPromise = output.readable.pipeTo(output.writable);
|
|
31
|
-
|
|
32
|
-
const writer = input.writable.getWriter();
|
|
33
|
-
const reader = input.readable.getReader();
|
|
34
|
-
|
|
35
|
-
const encoder = new TextEncoder();
|
|
36
|
-
const decoder = new TextDecoder();
|
|
37
|
-
|
|
38
|
-
// Write data to the input side
|
|
39
|
-
await writer.write(encoder.encode("Hello streaming world!"));
|
|
40
|
-
await writer.close(); // Close the stream after writing
|
|
41
|
-
|
|
42
|
-
// The echo server's pipeTo should resolve and finish successfully
|
|
43
|
-
await assert.doesNotReject(echoPromise);
|
|
44
|
-
|
|
45
|
-
// Read the data from the input side
|
|
46
|
-
const chunks: Uint8Array[] = [];
|
|
47
|
-
|
|
48
|
-
while (true) {
|
|
49
|
-
const { value, done } = await reader.read();
|
|
50
|
-
if (done) break;
|
|
51
|
-
if (value) chunks.push(value);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Combine chunks and decode to string
|
|
55
|
-
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
56
|
-
const resultUint8 = new Uint8Array(totalLength);
|
|
57
|
-
let offset = 0;
|
|
58
|
-
for (const chunk of chunks) {
|
|
59
|
-
resultUint8.set(chunk, offset);
|
|
60
|
-
offset += chunk.length;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const readText = decoder.decode(resultUint8);
|
|
64
|
-
|
|
65
|
-
// Verify the text matches exactly
|
|
66
|
-
assert.strictEqual(readText, "Hello streaming world!");
|
|
67
|
-
reader.releaseLock();
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("Data can be written and read sequentially before closing", async () => {
|
|
71
|
-
const { input, output } = createWebStreamPair();
|
|
72
|
-
const echoPromise = output.readable.pipeTo(output.writable);
|
|
73
|
-
|
|
74
|
-
const writer = input.writable.getWriter();
|
|
75
|
-
const reader = input.readable.getReader();
|
|
76
|
-
|
|
77
|
-
const encoder = new TextEncoder();
|
|
78
|
-
const decoder = new TextDecoder();
|
|
79
|
-
|
|
80
|
-
// 1. First Write & Read chunk
|
|
81
|
-
await writer.write(encoder.encode("Chunk 1"));
|
|
82
|
-
const result1 = await reader.read();
|
|
83
|
-
assert.strictEqual(result1.done, false);
|
|
84
|
-
assert.strictEqual(decoder.decode(result1.value), "Chunk 1");
|
|
85
|
-
|
|
86
|
-
// 2. Second Write & Read chunk
|
|
87
|
-
await writer.write(encoder.encode("Chunk 2"));
|
|
88
|
-
const result2 = await reader.read();
|
|
89
|
-
assert.strictEqual(result2.done, false);
|
|
90
|
-
assert.strictEqual(decoder.decode(result2.value), "Chunk 2");
|
|
91
|
-
|
|
92
|
-
// 3. Now we close the writable side mid-stream
|
|
93
|
-
await writer.close();
|
|
94
|
-
|
|
95
|
-
// The echo server's pipeTo should resolve and finish successfully
|
|
96
|
-
await assert.doesNotReject(echoPromise);
|
|
97
|
-
|
|
98
|
-
// 4. Verify that the readable side now registers the close signal
|
|
99
|
-
const finalResult = await reader.read();
|
|
100
|
-
assert.strictEqual(finalResult.done, true);
|
|
101
|
-
assert.strictEqual(finalResult.value, undefined);
|
|
102
|
-
|
|
103
|
-
writer.releaseLock();
|
|
104
|
-
reader.releaseLock();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
test("Client detects when the echo server abruptly closes its end", async () => {
|
|
108
|
-
const { input, output } = createWebStreamPair();
|
|
109
|
-
const encoder = new TextEncoder();
|
|
110
|
-
|
|
111
|
-
// Set up a manual echo server so we can manipulate its controls
|
|
112
|
-
const serverReader = output.readable.getReader();
|
|
113
|
-
const serverWriter = output.writable.getWriter();
|
|
114
|
-
|
|
115
|
-
// Start a basic manual loop in the background
|
|
116
|
-
const serverLoop = (async () => {
|
|
117
|
-
try {
|
|
118
|
-
while (true) {
|
|
119
|
-
const { value, done } = await serverReader.read();
|
|
120
|
-
if (done) break;
|
|
121
|
-
await serverWriter.write(value);
|
|
122
|
-
}
|
|
123
|
-
} finally {
|
|
124
|
-
serverReader.releaseLock();
|
|
125
|
-
serverWriter.releaseLock();
|
|
126
|
-
}
|
|
127
|
-
})();
|
|
128
|
-
|
|
129
|
-
const clientWriter = input.writable.getWriter();
|
|
130
|
-
const clientReader = input.readable.getReader();
|
|
131
|
-
|
|
132
|
-
// --- Simulate Server Shutdown ---
|
|
133
|
-
// The echo server decides to close its writing side out of nowhere
|
|
134
|
-
try {
|
|
135
|
-
await serverWriter.close();
|
|
136
|
-
await serverReader.cancel();
|
|
137
|
-
await serverLoop;
|
|
138
|
-
|
|
139
|
-
const first = await clientReader.read();
|
|
140
|
-
assert.strictEqual(first.done, true);
|
|
141
|
-
|
|
142
|
-
await assert.rejects(
|
|
143
|
-
() => clientWriter.write(encoder.encode("Is anyone there?")),
|
|
144
|
-
/close|invalid/i,
|
|
145
|
-
);
|
|
146
|
-
} finally {
|
|
147
|
-
clientWriter.releaseLock();
|
|
148
|
-
clientReader.releaseLock();
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
test("Repeated close and cancel calls are idempotent", async () => {
|
|
153
|
-
const { input, output } = createWebStreamPair();
|
|
154
|
-
|
|
155
|
-
const inputWriter = input.writable.getWriter();
|
|
156
|
-
const inputReader = input.readable.getReader();
|
|
157
|
-
const outputWriter = output.writable.getWriter();
|
|
158
|
-
const outputReader = output.readable.getReader();
|
|
159
|
-
|
|
160
|
-
await Promise.allSettled([
|
|
161
|
-
inputWriter.close(),
|
|
162
|
-
outputWriter.close(),
|
|
163
|
-
inputReader.cancel(),
|
|
164
|
-
outputReader.cancel(),
|
|
165
|
-
]);
|
|
166
|
-
|
|
167
|
-
inputWriter.releaseLock();
|
|
168
|
-
inputReader.releaseLock();
|
|
169
|
-
outputWriter.releaseLock();
|
|
170
|
-
outputReader.releaseLock();
|
|
171
|
-
});
|