@seriousme/opifex 2.2.0 → 2.4.0
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/README.md +7 -6
- package/bin/mqtt.ts +1 -1
- package/client/client.ts +62 -7
- package/client/context.ts +2 -2
- package/client/deps.ts +3 -3
- package/client/mod.ts +2 -2
- package/connNext/baseConnNext.ts +123 -0
- package/connNext/connNext.ts +44 -0
- package/deno/README.md +1 -1
- package/deno/denoConnToNext.ts +104 -0
- package/deno/tcpClient.ts +8 -24
- package/deno/tcpServer.test.ts +14 -103
- package/deno/tcpServer.ts +14 -6
- package/deno/tlsServer.test.ts +14 -58
- package/deno/tlsServer.ts +14 -6
- package/deno/wsServer.test.ts +15 -61
- package/deno/wsServer.ts +82 -32
- package/dev_utils/WebStreamEndpoint.ts +5 -0
- package/dev_utils/asyncStreamEndpoint.ts +5 -0
- package/dev_utils/asyncStreamPair.ts +109 -0
- package/dev_utils/asyncStreamPairToNext.ts +45 -0
- package/dev_utils/asyncStreamToNext.ts +64 -0
- package/dev_utils/connNextPair.test.ts +179 -0
- package/dev_utils/mockConn.ts +59 -29
- package/dev_utils/mockServer.ts +3 -4
- package/dev_utils/mod.ts +1 -2
- package/dev_utils/testClient.ts +64 -0
- package/dev_utils/webStreamPair.ts +3 -7
- package/dev_utils/webStreamPairToNext.ts +48 -0
- package/dev_utils/webStreamToNext.ts +54 -0
- package/dist/bin/mqtt.js +1 -1
- package/dist/bin/mqtt.js.map +1 -1
- package/dist/client/client.d.ts +24 -3
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +45 -5
- package/dist/client/client.js.map +1 -1
- package/dist/client/context.d.ts +2 -2
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/deps.d.ts +1 -1
- package/dist/client/deps.d.ts.map +1 -1
- package/dist/client/mod.d.ts +1 -1
- package/dist/client/mod.d.ts.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/connNext/connNext.d.ts +43 -0
- package/dist/connNext/connNext.d.ts.map +1 -0
- package/dist/connNext/connNext.js +2 -0
- package/dist/connNext/connNext.js.map +1 -0
- package/dist/examples/authHandler.test.js +2 -2
- package/dist/examples/authHandler.test.js.map +1 -1
- package/dist/examples/mqtt+mqtts.test.d.ts +2 -0
- package/dist/examples/mqtt+mqtts.test.d.ts.map +1 -0
- package/dist/examples/mqtt+mqtts.test.js +104 -0
- package/dist/examples/mqtt+mqtts.test.js.map +1 -0
- package/dist/examples/mqtt.test.js +2 -2
- package/dist/examples/mqtt.test.js.map +1 -1
- package/dist/examples/mqtts.test.js +2 -2
- package/dist/examples/mqtts.test.js.map +1 -1
- package/dist/mqttConn/mqttConn.d.ts +5 -6
- package/dist/mqttConn/mqttConn.d.ts.map +1 -1
- package/dist/mqttConn/mqttConn.js +2 -3
- package/dist/mqttConn/mqttConn.js.map +1 -1
- package/dist/node/nodeSocketToNext.d.ts +17 -0
- package/dist/node/nodeSocketToNext.d.ts.map +1 -0
- package/dist/node/nodeSocketToNext.js +105 -0
- package/dist/node/nodeSocketToNext.js.map +1 -0
- package/dist/node/tcpClient.d.ts +4 -6
- package/dist/node/tcpClient.d.ts.map +1 -1
- package/dist/node/tcpClient.js +6 -21
- package/dist/node/tcpClient.js.map +1 -1
- package/dist/node/tcpServer.d.ts +8 -4
- package/dist/node/tcpServer.d.ts.map +1 -1
- package/dist/node/tcpServer.js +14 -6
- package/dist/node/tcpServer.js.map +1 -1
- package/dist/node/tlsServer.d.ts +7 -3
- package/dist/node/tlsServer.d.ts.map +1 -1
- package/dist/node/tlsServer.js +13 -5
- package/dist/node/tlsServer.js.map +1 -1
- package/dist/server/context.d.ts +5 -5
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +4 -1
- package/dist/server/context.js.map +1 -1
- package/dist/server/deps.d.ts +1 -1
- package/dist/server/deps.d.ts.map +1 -1
- package/dist/server/mod.d.ts +1 -1
- package/dist/server/mod.d.ts.map +1 -1
- package/dist/server/server.d.ts +3 -3
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +3 -3
- package/dist/utils/utils.d.ts +1 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +3 -2
- package/dist/utils/utils.js.map +1 -1
- package/dist/web/webSocketToNext.d.ts +20 -0
- package/dist/web/webSocketToNext.d.ts.map +1 -0
- package/dist/web/webSocketToNext.js +125 -0
- package/dist/web/webSocketToNext.js.map +1 -0
- package/dist/web/wsClient.d.ts +3 -3
- package/dist/web/wsClient.d.ts.map +1 -1
- package/dist/web/wsClient.js +22 -7
- package/dist/web/wsClient.js.map +1 -1
- package/dist/web/wsClient.test.js +15 -0
- package/dist/web/wsClient.test.js.map +1 -1
- package/examples/README.md +21 -0
- package/examples/authHandler.test.ts +2 -2
- package/examples/mqtt+mqtts.test.ts +122 -0
- package/examples/mqtt.test.ts +2 -2
- package/examples/mqtts.test.ts +2 -2
- package/examples/webSocket.test.ts +10 -64
- package/examples/webSocketServer.ts +98 -0
- package/mqttConn/mqttConn.test.ts +6 -6
- package/mqttConn/mqttConn.ts +8 -9
- package/node/README.md +1 -1
- package/node/nodeSocketToNext.ts +124 -0
- package/node/tcpClient.ts +13 -27
- package/node/tcpServer.test.ts +12 -58
- package/node/tcpServer.ts +18 -8
- package/node/tlsServer.test.ts +11 -58
- package/node/tlsServer.ts +17 -7
- package/package.json +4 -3
- package/server/context.ts +9 -6
- package/server/deps.ts +1 -1
- package/server/mod.ts +1 -1
- package/server/server.ts +6 -6
- package/utils/utils.ts +3 -2
- package/web/webSocketToNext.ts +146 -0
- package/web/wsClient.test.ts +22 -0
- package/web/wsClient.ts +29 -9
- package/dev_utils/webStreamPair.test.ts +0 -171
- package/dist/node/wrapNodeSocket.d.ts +0 -12
- package/dist/node/wrapNodeSocket.d.ts.map +0 -1
- package/dist/node/wrapNodeSocket.js +0 -36
- package/dist/node/wrapNodeSocket.js.map +0 -1
- package/dist/socket/socket.d.ts +0 -58
- package/dist/socket/socket.d.ts.map +0 -1
- package/dist/socket/socket.js +0 -99
- package/dist/socket/socket.js.map +0 -1
- package/dist/web/webSocketStream.d.ts +0 -29
- package/dist/web/webSocketStream.d.ts.map +0 -1
- package/dist/web/webSocketStream.js +0 -69
- package/dist/web/webSocketStream.js.map +0 -1
- package/dist/web/wrapWebSocket.d.ts +0 -12
- package/dist/web/wrapWebSocket.d.ts.map +0 -1
- package/dist/web/wrapWebSocket.js +0 -41
- package/dist/web/wrapWebSocket.js.map +0 -1
- package/node/socket-node-stream.test.ts +0 -322
- package/node/socket-node-stream.ts +0 -174
- package/node/wrapNodeSocket.ts +0 -44
- package/socket/socket.test.ts +0 -91
- package/socket/socket.ts +0 -149
- package/web/webSocketStream.ts +0 -97
- package/web/wrapWebSocket.ts +0 -52
package/socket/socket.ts
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/** Net addresses */
|
|
2
|
-
export type NetAddr = {
|
|
3
|
-
/** The IP-based transport protocol */
|
|
4
|
-
transport: "tcp" | "udp";
|
|
5
|
-
/** The hostname */
|
|
6
|
-
hostname: string;
|
|
7
|
-
/** The port number */
|
|
8
|
-
port: number;
|
|
9
|
-
};
|
|
10
|
-
/** Unix addresses */
|
|
11
|
-
export type UnixAddr = {
|
|
12
|
-
/** The Unix domain socket transport protocol */
|
|
13
|
-
transport: "unix" | "unixpacket";
|
|
14
|
-
/** The file system path to the socket to connect to */
|
|
15
|
-
path: string;
|
|
16
|
-
};
|
|
17
|
-
/** vSock addresses */
|
|
18
|
-
export type VsockAddr = {
|
|
19
|
-
/** The VSOCK transport protocol */
|
|
20
|
-
transport: "vsock";
|
|
21
|
-
/** The context identifier (CID) of the peer */
|
|
22
|
-
cid: number;
|
|
23
|
-
/** The port number */
|
|
24
|
-
port: number;
|
|
25
|
-
};
|
|
26
|
-
/** Socket addresses */
|
|
27
|
-
export type SockAddr = NetAddr | UnixAddr | VsockAddr;
|
|
28
|
-
/** Socket connection descriptor. */
|
|
29
|
-
export type SockConn = {
|
|
30
|
-
/** The stream to read from */
|
|
31
|
-
readable: ReadableStream<Uint8Array>;
|
|
32
|
-
/** The stream to write to */
|
|
33
|
-
writable: WritableStream<Uint8Array>;
|
|
34
|
-
/** The callback to call on close */
|
|
35
|
-
close: () => void;
|
|
36
|
-
/** The local address of the connection */
|
|
37
|
-
localAddr?: SockAddr;
|
|
38
|
-
/** The remote address of the connection */
|
|
39
|
-
remoteAddr?: SockAddr;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/** Connection class */
|
|
43
|
-
export class Conn {
|
|
44
|
-
reader: ReadableStreamDefaultReader<Uint8Array>;
|
|
45
|
-
writer: WritableStreamDefaultWriter<Uint8Array>;
|
|
46
|
-
closed: boolean;
|
|
47
|
-
remoteAddr: SockAddr | undefined;
|
|
48
|
-
closer: () => void;
|
|
49
|
-
|
|
50
|
-
private leftover: Uint8Array = new Uint8Array(0);
|
|
51
|
-
|
|
52
|
-
/** Create a new Conn object from a SockConn */
|
|
53
|
-
constructor(sockConn: SockConn) {
|
|
54
|
-
this.closed = false;
|
|
55
|
-
this.reader = sockConn.readable.getReader();
|
|
56
|
-
this.writer = sockConn.writable.getWriter();
|
|
57
|
-
this.closer = sockConn.close.bind(sockConn);
|
|
58
|
-
this.reader.closed.catch(() => {});
|
|
59
|
-
this.writer.closed.catch(() => {});
|
|
60
|
-
this.remoteAddr = sockConn.remoteAddr;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Read bytes from the connection */
|
|
64
|
-
async read(length: number): Promise<Uint8Array | null> {
|
|
65
|
-
if (this.closed || length < 0) {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (length === 0) {
|
|
70
|
-
return new Uint8Array(0);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const result = new Uint8Array(length);
|
|
74
|
-
let bytesAccumulated = 0;
|
|
75
|
-
|
|
76
|
-
// Do we have data from the previous read()
|
|
77
|
-
if (this.leftover.length > 0) {
|
|
78
|
-
const take = Math.min(this.leftover.length, length);
|
|
79
|
-
result.set(this.leftover.subarray(0, take), bytesAccumulated);
|
|
80
|
-
bytesAccumulated += take;
|
|
81
|
-
this.leftover = this.leftover.subarray(take);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Keep readin until we have enough data
|
|
85
|
-
while (bytesAccumulated < length) {
|
|
86
|
-
const { value, done } = await this.reader.read();
|
|
87
|
-
|
|
88
|
-
if (value) {
|
|
89
|
-
const needed = length - bytesAccumulated;
|
|
90
|
-
|
|
91
|
-
if (value.length <= needed) {
|
|
92
|
-
// We need the whole chunk
|
|
93
|
-
result.set(value, bytesAccumulated);
|
|
94
|
-
bytesAccumulated += value.length;
|
|
95
|
-
} else {
|
|
96
|
-
// Chunk is bigger than what we need
|
|
97
|
-
result.set(value.subarray(0, needed), bytesAccumulated);
|
|
98
|
-
bytesAccumulated += needed;
|
|
99
|
-
// Save the rest for the next read() call
|
|
100
|
-
this.leftover = value.subarray(needed);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
if (done) {
|
|
104
|
-
// if the stream closed and not enough data was returned, return null
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return result;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** Write bytes to the connection */
|
|
112
|
-
async write(data: Uint8Array): Promise<number> {
|
|
113
|
-
if (this.closed) {
|
|
114
|
-
return Promise.reject(new Error("Connection closed"));
|
|
115
|
-
}
|
|
116
|
-
try {
|
|
117
|
-
await this.writer.write(data);
|
|
118
|
-
return data.length;
|
|
119
|
-
} catch (err) {
|
|
120
|
-
this.closed = true;
|
|
121
|
-
throw err;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/** close the connection */
|
|
126
|
-
close() {
|
|
127
|
-
if (!this.closed) {
|
|
128
|
-
this.closed = true;
|
|
129
|
-
|
|
130
|
-
// deno-coverage-ignore-start
|
|
131
|
-
void this.writer.close().catch(() => {
|
|
132
|
-
// ignore duplicate/late close attempts; the stream may already be closed
|
|
133
|
-
});
|
|
134
|
-
// deno-coverage-ignore-stop
|
|
135
|
-
|
|
136
|
-
try {
|
|
137
|
-
void this.reader.cancel().catch(() => {
|
|
138
|
-
// ignore duplicate/late cancel attempts; the stream may already be closed
|
|
139
|
-
});
|
|
140
|
-
this.reader?.releaseLock();
|
|
141
|
-
// deno-coverage-ignore
|
|
142
|
-
} catch (_err) { /* swallow */ }
|
|
143
|
-
|
|
144
|
-
try {
|
|
145
|
-
this.closer();
|
|
146
|
-
} catch (_err) { /* swallow */ }
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
package/web/webSocketStream.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for wrapping standard WebSockets into standard web streams.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export interface WebSocketConnection<
|
|
6
|
-
T extends Uint8Array | string = Uint8Array | string,
|
|
7
|
-
> {
|
|
8
|
-
readable: ReadableStream<T>;
|
|
9
|
-
writable: WritableStream<T>;
|
|
10
|
-
protocol: string;
|
|
11
|
-
extensions: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface WebSocketCloseInfo {
|
|
15
|
-
closeCode?: number;
|
|
16
|
-
reason?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface WebSocketStreamOptions {
|
|
20
|
-
protocols?: string[];
|
|
21
|
-
signal?: AbortSignal;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) with [Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API)
|
|
26
|
-
*
|
|
27
|
-
* @see https://web.dev/websocketstream/
|
|
28
|
-
*/
|
|
29
|
-
export class WebSocketStream<
|
|
30
|
-
T extends Uint8Array | string = Uint8Array | string,
|
|
31
|
-
> {
|
|
32
|
-
readonly opened: Promise<WebSocketConnection<T>>;
|
|
33
|
-
|
|
34
|
-
readonly closed: Promise<WebSocketCloseInfo>;
|
|
35
|
-
|
|
36
|
-
readonly close: (closeInfo?: WebSocketCloseInfo) => void;
|
|
37
|
-
|
|
38
|
-
constructor(ws: WebSocket, options: WebSocketStreamOptions = {}) {
|
|
39
|
-
if (options.signal?.aborted) {
|
|
40
|
-
throw new DOMException("This operation was aborted", "AbortError");
|
|
41
|
-
}
|
|
42
|
-
const closeWithInfo = (
|
|
43
|
-
{ closeCode: code, reason }: WebSocketCloseInfo = {},
|
|
44
|
-
) => ws.close(code, reason);
|
|
45
|
-
|
|
46
|
-
this.opened = new Promise((resolve, reject) => {
|
|
47
|
-
ws.onopen = () => {
|
|
48
|
-
resolve({
|
|
49
|
-
readable: new ReadableStream<T>({
|
|
50
|
-
start(controller) {
|
|
51
|
-
ws.onmessage = ({ data }) => {
|
|
52
|
-
if (data instanceof ArrayBuffer) {
|
|
53
|
-
controller.enqueue(new Uint8Array(data) as T);
|
|
54
|
-
} else {
|
|
55
|
-
controller.enqueue(data as T);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
ws.onerror = (e) => controller.error(e);
|
|
59
|
-
},
|
|
60
|
-
cancel: closeWithInfo,
|
|
61
|
-
}),
|
|
62
|
-
writable: new WritableStream<T>({
|
|
63
|
-
write(chunk) {
|
|
64
|
-
if (chunk instanceof Uint8Array) {
|
|
65
|
-
ws.send(chunk.buffer as ArrayBuffer);
|
|
66
|
-
} else {
|
|
67
|
-
ws.send(chunk);
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
abort() {
|
|
71
|
-
ws.close();
|
|
72
|
-
},
|
|
73
|
-
close: closeWithInfo,
|
|
74
|
-
}),
|
|
75
|
-
protocol: ws.protocol,
|
|
76
|
-
extensions: ws.extensions,
|
|
77
|
-
});
|
|
78
|
-
ws.removeEventListener("error", reject);
|
|
79
|
-
};
|
|
80
|
-
ws.addEventListener("error", reject);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
this.closed = new Promise<WebSocketCloseInfo>((resolve, reject) => {
|
|
84
|
-
ws.onclose = ({ code, reason }) => {
|
|
85
|
-
resolve({ closeCode: code, reason });
|
|
86
|
-
ws.removeEventListener("error", reject);
|
|
87
|
-
};
|
|
88
|
-
ws.addEventListener("error", reject);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
if (options.signal) {
|
|
92
|
-
options.signal.onabort = () => ws.close();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
this.close = closeWithInfo;
|
|
96
|
-
}
|
|
97
|
-
}
|
package/web/wrapWebSocket.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for wrapping WebSocketStream sockets into standard web streams.
|
|
3
|
-
*/
|
|
4
|
-
import { WebSocketStream } from "./webSocketStream.ts";
|
|
5
|
-
import type { SockConn } from "../socket/socket.ts";
|
|
6
|
-
import { logger } from "../utils/logger.ts";
|
|
7
|
-
|
|
8
|
-
export type HostnamePort = {
|
|
9
|
-
hostname?: string;
|
|
10
|
-
port?: string | number;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Closes a WebSocketStream socket if it is not already closed
|
|
15
|
-
* @param sock - The WebSocketStream socket to close
|
|
16
|
-
*/
|
|
17
|
-
async function closer(stream: WebSocketStream) {
|
|
18
|
-
if (!await stream.closed) {
|
|
19
|
-
stream.close();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Wraps a WebSocketStream socket into a standard web streams-based socket connection
|
|
25
|
-
* @param ws - The WebSocket to wrap
|
|
26
|
-
* @returns A SockConn object
|
|
27
|
-
*/
|
|
28
|
-
export async function wrapWebSocket(
|
|
29
|
-
ws: WebSocket,
|
|
30
|
-
remoteAddr?: HostnamePort,
|
|
31
|
-
): Promise<SockConn> {
|
|
32
|
-
ws.binaryType = "arraybuffer";
|
|
33
|
-
const wsstream = new WebSocketStream<Uint8Array>(ws);
|
|
34
|
-
logger.debug("created wsstream");
|
|
35
|
-
const stream = await wsstream.opened;
|
|
36
|
-
logger.debug("wsstream is opened");
|
|
37
|
-
const readable = stream.readable;
|
|
38
|
-
const writable = stream.writable;
|
|
39
|
-
const { hostname = "localhost", port = 0 } = remoteAddr || {};
|
|
40
|
-
|
|
41
|
-
const conn: SockConn = {
|
|
42
|
-
readable: readable as ReadableStream<Uint8Array>,
|
|
43
|
-
writable: writable as WritableStream<Uint8Array>,
|
|
44
|
-
close: () => closer(wsstream),
|
|
45
|
-
remoteAddr: {
|
|
46
|
-
hostname,
|
|
47
|
-
port: Number(port),
|
|
48
|
-
transport: "tcp",
|
|
49
|
-
},
|
|
50
|
-
};
|
|
51
|
-
return conn;
|
|
52
|
-
}
|