tcpip 0.1.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/dist/cjs/go/wasm_exec.js +619 -0
- package/dist/cjs/go/wasm_exec.js.map +1 -0
- package/dist/cjs/index.js +97 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/loopback-interface.js +12 -0
- package/dist/cjs/interfaces/loopback-interface.js.map +1 -0
- package/dist/cjs/interfaces/tap-interface.js +31 -0
- package/dist/cjs/interfaces/tap-interface.js.map +1 -0
- package/dist/cjs/interfaces/tun-interface.js +31 -0
- package/dist/cjs/interfaces/tun-interface.js.map +1 -0
- package/dist/cjs/platforms/browser.js +76 -0
- package/dist/cjs/platforms/browser.js.map +1 -0
- package/dist/cjs/platforms/node-polyfills.js +16 -0
- package/dist/cjs/platforms/node-polyfills.js.map +1 -0
- package/dist/cjs/platforms/node.js +80 -0
- package/dist/cjs/platforms/node.js.map +1 -0
- package/dist/cjs/server.js +32 -0
- package/dist/cjs/server.js.map +1 -0
- package/dist/cjs/socket.js +32 -0
- package/dist/cjs/socket.js.map +1 -0
- package/dist/cjs/stack.js +111 -0
- package/dist/cjs/stack.js.map +1 -0
- package/dist/esm/go/wasm_exec.js +569 -0
- package/dist/esm/go/wasm_exec.js.map +1 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces/loopback-interface.js +9 -0
- package/dist/esm/interfaces/loopback-interface.js.map +1 -0
- package/dist/esm/interfaces/tap-interface.js +11 -0
- package/dist/esm/interfaces/tap-interface.js.map +1 -0
- package/dist/esm/interfaces/tun-interface.js +11 -0
- package/dist/esm/interfaces/tun-interface.js.map +1 -0
- package/dist/esm/platforms/browser.js +8 -0
- package/dist/esm/platforms/browser.js.map +1 -0
- package/dist/esm/platforms/node-polyfills.js +14 -0
- package/dist/esm/platforms/node-polyfills.js.map +1 -0
- package/dist/esm/platforms/node.js +11 -0
- package/dist/esm/platforms/node.js.map +1 -0
- package/dist/esm/server.js +11 -0
- package/dist/esm/server.js.map +1 -0
- package/dist/esm/socket.js +11 -0
- package/dist/esm/socket.js.map +1 -0
- package/dist/esm/stack.js +76 -0
- package/dist/esm/stack.js.map +1 -0
- package/dist/tcpip.wasm +0 -0
- package/dist/types/go/wasm_exec.d.ts +35 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/interfaces/loopback-interface.d.ts +13 -0
- package/dist/types/interfaces/tap-interface.d.ts +19 -0
- package/dist/types/interfaces/tun-interface.d.ts +18 -0
- package/dist/types/platforms/browser.d.ts +2 -0
- package/dist/types/platforms/node-polyfills.d.ts +1 -0
- package/dist/types/platforms/node.d.ts +3 -0
- package/dist/types/server.d.ts +25 -0
- package/dist/types/socket.d.ts +99 -0
- package/dist/types/stack.d.ts +31 -0
- package/package.json +44 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
class TunInterface extends EventEmitter {
|
|
3
|
+
constructor(stack, options) {
|
|
4
|
+
super();
|
|
5
|
+
this.stack = stack;
|
|
6
|
+
this.options = options;
|
|
7
|
+
this._init(options);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default TunInterface;
|
|
11
|
+
//# sourceMappingURL=tun-interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tun-interface.js","sourceRoot":"","sources":["../../../src/interfaces/tun-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiB7C,MAAM,YAAa,SAAQ,YAAoC;IAC7D,YAAmB,KAAY,EAAS,OAA4B;QAClE,KAAK,EAAE,CAAC;QADS,UAAK,GAAL,KAAK,CAAO;QAAS,YAAO,GAAP,OAAO,CAAqB;QAElE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;CACF;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Go from '../go/wasm_exec.js';
|
|
2
|
+
export * from '../index.js';
|
|
3
|
+
export async function init() {
|
|
4
|
+
const go = new Go();
|
|
5
|
+
const source = await WebAssembly.instantiateStreaming(fetch(require('tcpip/tcpip.wasm')), go.importObject);
|
|
6
|
+
go.run(source.instance);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/platforms/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpC,cAAc,aAAa,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,oBAAoB,CACnD,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAClC,EAAE,CAAC,YAAY,CAChB,CAAC;IACF,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getRandomValues } from 'crypto';
|
|
2
|
+
import { TextDecoder, TextEncoder } from 'util';
|
|
3
|
+
globalThis.TextEncoder = TextEncoder;
|
|
4
|
+
globalThis.TextDecoder = TextDecoder;
|
|
5
|
+
globalThis.performance = {
|
|
6
|
+
now() {
|
|
7
|
+
const [sec, nsec] = process.hrtime();
|
|
8
|
+
return sec * 1000 + nsec / 1000000;
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
globalThis.crypto = {
|
|
12
|
+
getRandomValues,
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=node-polyfills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-polyfills.js","sourceRoot":"","sources":["../../../src/platforms/node-polyfills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAE/C,UAAkB,CAAC,WAAW,GAAG,WAAW,CAAC;AAC7C,UAAkB,CAAC,WAAW,GAAG,WAAW,CAAC;AAE7C,UAAkB,CAAC,WAAW,GAAG;IAChC,GAAG;QACD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,OAAO,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC;IACrC,CAAC;CACF,CAAC;AAED,UAAkB,CAAC,MAAM,GAAG;IAC3B,eAAe;CAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import Go from '../go/wasm_exec.js';
|
|
3
|
+
import './node-polyfills.js';
|
|
4
|
+
export * from '../index.js';
|
|
5
|
+
export async function init() {
|
|
6
|
+
const wasm = await readFile(require.resolve('tcpip/tcpip.wasm'));
|
|
7
|
+
const go = new Go();
|
|
8
|
+
const source = await WebAssembly.instantiate(wasm, go.importObject);
|
|
9
|
+
go.run(source.instance);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/platforms/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpC,OAAO,qBAAqB,CAAC;AAE7B,cAAc,aAAa,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;IACpE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
class Server extends EventEmitter {
|
|
3
|
+
constructor(stack, options = {}) {
|
|
4
|
+
super();
|
|
5
|
+
this.stack = stack;
|
|
6
|
+
this.options = options;
|
|
7
|
+
this._init(options);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default Server;
|
|
11
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAwB7C,MAAM,MAAO,SAAQ,YAA8B;IACjD,YAAmB,KAAY,EAAS,UAAyB,EAAE;QACjE,KAAK,EAAE,CAAC;QADS,UAAK,GAAL,KAAK,CAAO;QAAS,YAAO,GAAP,OAAO,CAAoB;QAEjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;CACF;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Duplex } from 'readable-stream';
|
|
2
|
+
class Socket extends Duplex {
|
|
3
|
+
constructor(stack, options = {}) {
|
|
4
|
+
super();
|
|
5
|
+
this.stack = stack;
|
|
6
|
+
this.options = options;
|
|
7
|
+
this._init(options);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default Socket;
|
|
11
|
+
//# sourceMappingURL=socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAmKzC,MAAM,MAAO,SAAQ,MAAM;IACzB,YAAmB,KAAY,EAAS,UAAiC,EAAE;QACzE,KAAK,EAAE,CAAC;QADS,UAAK,GAAL,KAAK,CAAO;QAAS,YAAO,GAAP,OAAO,CAA4B;QAEzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;CACF;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import LoopbackInterface from './interfaces/loopback-interface.js';
|
|
2
|
+
import TapInterface from './interfaces/tap-interface.js';
|
|
3
|
+
import TunInterface from './interfaces/tun-interface.js';
|
|
4
|
+
import NetServer from './server.js';
|
|
5
|
+
import NetSocket from './socket.js';
|
|
6
|
+
export function unwrap(fn) {
|
|
7
|
+
return function (...args) {
|
|
8
|
+
const [value, error] = fn.apply(this, args);
|
|
9
|
+
if (error) {
|
|
10
|
+
throw error;
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A user-space TCP/IP network stack
|
|
17
|
+
*/
|
|
18
|
+
class Stack {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
this._init(options);
|
|
22
|
+
const self = this;
|
|
23
|
+
const Socket = class Socket extends NetSocket {
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
super(self, options);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const Server = class Server extends NetServer {
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
super(self, options);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
this.net = {
|
|
34
|
+
Socket,
|
|
35
|
+
Server,
|
|
36
|
+
createServer(options = {}) {
|
|
37
|
+
return new Server(options);
|
|
38
|
+
},
|
|
39
|
+
createConnection(optionsOrPort, listenerOrHost, listener) {
|
|
40
|
+
if (typeof optionsOrPort === 'object') {
|
|
41
|
+
const socket = new Socket(optionsOrPort);
|
|
42
|
+
const { timeout } = optionsOrPort;
|
|
43
|
+
if (timeout !== undefined && timeout > 0) {
|
|
44
|
+
socket.setTimeout(timeout);
|
|
45
|
+
}
|
|
46
|
+
if (listenerOrHost === undefined) {
|
|
47
|
+
return socket.connect(optionsOrPort);
|
|
48
|
+
}
|
|
49
|
+
if (typeof listenerOrHost !== 'function') {
|
|
50
|
+
throw new Error('Expected second argument to be a listener');
|
|
51
|
+
}
|
|
52
|
+
return socket.connect(optionsOrPort, listenerOrHost);
|
|
53
|
+
}
|
|
54
|
+
const socket = new Socket();
|
|
55
|
+
if (typeof listenerOrHost === 'string') {
|
|
56
|
+
return socket.connect(optionsOrPort, listenerOrHost, listener);
|
|
57
|
+
}
|
|
58
|
+
return socket.connect(optionsOrPort, listenerOrHost);
|
|
59
|
+
},
|
|
60
|
+
connect(optionsOrPort, listenerOrHost, listener) {
|
|
61
|
+
return this.net.createConnection(optionsOrPort, listenerOrHost, listener);
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
createLoopbackInterface(options) {
|
|
66
|
+
return new LoopbackInterface(this, options);
|
|
67
|
+
}
|
|
68
|
+
createTapInterface(options) {
|
|
69
|
+
return new TapInterface(this, options);
|
|
70
|
+
}
|
|
71
|
+
createTunInterface(options) {
|
|
72
|
+
return new TunInterface(this, options);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export default Stack;
|
|
76
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/stack.ts"],"names":[],"mappings":"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"}
|
package/dist/tcpip.wasm
ADDED
|
Binary file
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export default class Go {
|
|
2
|
+
importObject: {
|
|
3
|
+
go: {
|
|
4
|
+
'runtime.wasmExit': (sp: any) => void;
|
|
5
|
+
'runtime.wasmWrite': (sp: any) => void;
|
|
6
|
+
'runtime.resetMemoryDataView': (sp: any) => void;
|
|
7
|
+
'runtime.nanotime1': (sp: any) => void;
|
|
8
|
+
'runtime.walltime': (sp: any) => void;
|
|
9
|
+
'runtime.scheduleTimeoutEvent': (sp: any) => void;
|
|
10
|
+
'runtime.clearTimeoutEvent': (sp: any) => void;
|
|
11
|
+
'runtime.getRandomData': (sp: any) => void;
|
|
12
|
+
'syscall/js.finalizeRef': (sp: any) => void;
|
|
13
|
+
'syscall/js.stringVal': (sp: any) => void;
|
|
14
|
+
'syscall/js.valueGet': (sp: any) => void;
|
|
15
|
+
'syscall/js.valueSet': (sp: any) => void;
|
|
16
|
+
'syscall/js.valueDelete': (sp: any) => void;
|
|
17
|
+
'syscall/js.valueIndex': (sp: any) => void;
|
|
18
|
+
'syscall/js.valueSetIndex': (sp: any) => void;
|
|
19
|
+
'syscall/js.valueCall': (sp: any) => void;
|
|
20
|
+
'syscall/js.valueInvoke': (sp: any) => void;
|
|
21
|
+
'syscall/js.valueNew': (sp: any) => void;
|
|
22
|
+
'syscall/js.valueLength': (sp: any) => void;
|
|
23
|
+
'syscall/js.valuePrepareString': (sp: any) => void;
|
|
24
|
+
'syscall/js.valueLoadString': (sp: any) => void;
|
|
25
|
+
'syscall/js.valueInstanceOf': (sp: any) => void;
|
|
26
|
+
'syscall/js.copyBytesToGo': (sp: any) => void;
|
|
27
|
+
'syscall/js.copyBytesToJS': (sp: any) => void;
|
|
28
|
+
debug: (value: any) => void;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
constructor();
|
|
32
|
+
run(instance: any): Promise<void>;
|
|
33
|
+
_resume(): void;
|
|
34
|
+
_makeFuncWrapper(id: any): () => any;
|
|
35
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as LoopbackInterface } from './interfaces/loopback-interface.js';
|
|
2
|
+
export { default as TapInterface } from './interfaces/tap-interface.js';
|
|
3
|
+
export { default as TunInterface } from './interfaces/tun-interface.js';
|
|
4
|
+
export { Net, default as Stack } from './stack.js';
|
|
5
|
+
export declare function init(): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Stack from '../stack.js';
|
|
2
|
+
export interface LoopbackInterfaceOptions {
|
|
3
|
+
ipAddress: string;
|
|
4
|
+
}
|
|
5
|
+
interface LoopbackInterface {
|
|
6
|
+
_init(options: LoopbackInterfaceOptions): void;
|
|
7
|
+
}
|
|
8
|
+
declare class LoopbackInterface {
|
|
9
|
+
stack: Stack;
|
|
10
|
+
options: LoopbackInterfaceOptions;
|
|
11
|
+
constructor(stack: Stack, options: LoopbackInterfaceOptions);
|
|
12
|
+
}
|
|
13
|
+
export default LoopbackInterface;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import Stack from '../stack.js';
|
|
3
|
+
export interface TapInterfaceEventTypes {
|
|
4
|
+
frame: (frame: Uint8Array) => void;
|
|
5
|
+
}
|
|
6
|
+
export interface TapInterfaceOptions {
|
|
7
|
+
ipAddress: string;
|
|
8
|
+
macAddress: string;
|
|
9
|
+
}
|
|
10
|
+
interface TapInterface {
|
|
11
|
+
_init(options: TapInterfaceOptions): void;
|
|
12
|
+
injectFrame(frame: Uint8Array): void;
|
|
13
|
+
}
|
|
14
|
+
declare class TapInterface extends EventEmitter<TapInterfaceEventTypes> {
|
|
15
|
+
stack: Stack;
|
|
16
|
+
options: TapInterfaceOptions;
|
|
17
|
+
constructor(stack: Stack, options: TapInterfaceOptions);
|
|
18
|
+
}
|
|
19
|
+
export default TapInterface;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import Stack from '../stack.js';
|
|
3
|
+
export interface TunInterfaceEventTypes {
|
|
4
|
+
packet: (packet: Uint8Array) => void;
|
|
5
|
+
}
|
|
6
|
+
export interface TunInterfaceOptions {
|
|
7
|
+
ipAddress: string;
|
|
8
|
+
}
|
|
9
|
+
interface TunInterface {
|
|
10
|
+
_init(options: TunInterfaceOptions): void;
|
|
11
|
+
injectPacket(packet: Uint8Array): void;
|
|
12
|
+
}
|
|
13
|
+
declare class TunInterface extends EventEmitter<TunInterfaceEventTypes> {
|
|
14
|
+
stack: Stack;
|
|
15
|
+
options: TunInterfaceOptions;
|
|
16
|
+
constructor(stack: Stack, options: TunInterfaceOptions);
|
|
17
|
+
}
|
|
18
|
+
export default TunInterface;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import Socket from './socket.js';
|
|
3
|
+
import Stack from './stack.js';
|
|
4
|
+
export interface ServerEventTypes {
|
|
5
|
+
connection: (socket: Socket) => void;
|
|
6
|
+
error: (err: Error) => void;
|
|
7
|
+
end: () => void;
|
|
8
|
+
close: (hadError: boolean) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface ServerOptions {
|
|
11
|
+
}
|
|
12
|
+
interface ListenOptions {
|
|
13
|
+
port: number | undefined;
|
|
14
|
+
host?: string | undefined;
|
|
15
|
+
}
|
|
16
|
+
interface Server {
|
|
17
|
+
_init(options: ServerOptions): void;
|
|
18
|
+
listen(options: ListenOptions): this;
|
|
19
|
+
}
|
|
20
|
+
declare class Server extends EventEmitter<ServerEventTypes> {
|
|
21
|
+
stack: Stack;
|
|
22
|
+
options: ServerOptions;
|
|
23
|
+
constructor(stack: Stack, options?: ServerOptions);
|
|
24
|
+
}
|
|
25
|
+
export default Server;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Duplex } from 'readable-stream';
|
|
3
|
+
import Stack from './stack.js';
|
|
4
|
+
export interface TcpNetConnectOpts extends TcpSocketConnectOpts, SocketConstructorOpts {
|
|
5
|
+
timeout?: number | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface SocketConstructorOpts {
|
|
8
|
+
}
|
|
9
|
+
export interface TcpSocketConnectOpts {
|
|
10
|
+
port: number;
|
|
11
|
+
host?: string | undefined;
|
|
12
|
+
localAddress?: string | undefined;
|
|
13
|
+
localPort?: number | undefined;
|
|
14
|
+
hints?: number | undefined;
|
|
15
|
+
family?: number | undefined;
|
|
16
|
+
noDelay?: boolean | undefined;
|
|
17
|
+
keepAlive?: boolean | undefined;
|
|
18
|
+
keepAliveInitialDelay?: number | undefined;
|
|
19
|
+
}
|
|
20
|
+
interface Socket {
|
|
21
|
+
readonly timeout?: number | undefined;
|
|
22
|
+
_init(options: SocketConstructorOpts): void;
|
|
23
|
+
write(buffer: Uint8Array | string, cb?: (err?: Error) => void): boolean;
|
|
24
|
+
write(str: Uint8Array | string, encoding?: BufferEncoding, cb?: (err?: Error) => void): boolean;
|
|
25
|
+
connect(options: TcpSocketConnectOpts, connectionListener?: () => void): this;
|
|
26
|
+
connect(port: number, host: string, connectionListener?: () => void): this;
|
|
27
|
+
connect(port: number, connectionListener?: () => void): this;
|
|
28
|
+
end(callback?: () => void): this;
|
|
29
|
+
end(buffer: Uint8Array | string, callback?: () => void): this;
|
|
30
|
+
end(str: Uint8Array | string, encoding?: BufferEncoding, callback?: () => void): this;
|
|
31
|
+
addListener(event: string, listener: (...args: any[]) => void): this;
|
|
32
|
+
addListener(event: 'close', listener: (hadError: boolean) => void): this;
|
|
33
|
+
addListener(event: 'connect', listener: () => void): this;
|
|
34
|
+
addListener(event: 'data', listener: (data: Buffer) => void): this;
|
|
35
|
+
addListener(event: 'drain', listener: () => void): this;
|
|
36
|
+
addListener(event: 'end', listener: () => void): this;
|
|
37
|
+
addListener(event: 'error', listener: (err: Error) => void): this;
|
|
38
|
+
addListener(event: 'lookup', listener: (err: Error, address: string, family: string | number, host: string) => void): this;
|
|
39
|
+
addListener(event: 'ready', listener: () => void): this;
|
|
40
|
+
addListener(event: 'timeout', listener: () => void): this;
|
|
41
|
+
emit(event: string | symbol, ...args: any[]): boolean;
|
|
42
|
+
emit(event: 'close', hadError: boolean): boolean;
|
|
43
|
+
emit(event: 'connect'): boolean;
|
|
44
|
+
emit(event: 'data', data: Buffer): boolean;
|
|
45
|
+
emit(event: 'drain'): boolean;
|
|
46
|
+
emit(event: 'end'): boolean;
|
|
47
|
+
emit(event: 'error', err: Error): boolean;
|
|
48
|
+
emit(event: 'lookup', err: Error, address: string, family: string | number, host: string): boolean;
|
|
49
|
+
emit(event: 'ready'): boolean;
|
|
50
|
+
emit(event: 'timeout'): boolean;
|
|
51
|
+
on(event: string, listener: (...args: any[]) => void): this;
|
|
52
|
+
on(event: 'close', listener: (hadError: boolean) => void): this;
|
|
53
|
+
on(event: 'connect', listener: () => void): this;
|
|
54
|
+
on(event: 'data', listener: (data: Buffer) => void): this;
|
|
55
|
+
on(event: 'drain', listener: () => void): this;
|
|
56
|
+
on(event: 'end', listener: () => void): this;
|
|
57
|
+
on(event: 'error', listener: (err: Error) => void): this;
|
|
58
|
+
on(event: 'lookup', listener: (err: Error, address: string, family: string | number, host: string) => void): this;
|
|
59
|
+
on(event: 'ready', listener: () => void): this;
|
|
60
|
+
on(event: 'timeout', listener: () => void): this;
|
|
61
|
+
once(event: string, listener: (...args: any[]) => void): this;
|
|
62
|
+
once(event: 'close', listener: (hadError: boolean) => void): this;
|
|
63
|
+
once(event: 'connect', listener: () => void): this;
|
|
64
|
+
once(event: 'data', listener: (data: Buffer) => void): this;
|
|
65
|
+
once(event: 'drain', listener: () => void): this;
|
|
66
|
+
once(event: 'end', listener: () => void): this;
|
|
67
|
+
once(event: 'error', listener: (err: Error) => void): this;
|
|
68
|
+
once(event: 'lookup', listener: (err: Error, address: string, family: string | number, host: string) => void): this;
|
|
69
|
+
once(event: 'ready', listener: () => void): this;
|
|
70
|
+
once(event: 'timeout', listener: () => void): this;
|
|
71
|
+
prependListener(event: string, listener: (...args: any[]) => void): this;
|
|
72
|
+
prependListener(event: 'close', listener: (hadError: boolean) => void): this;
|
|
73
|
+
prependListener(event: 'connect', listener: () => void): this;
|
|
74
|
+
prependListener(event: 'data', listener: (data: Buffer) => void): this;
|
|
75
|
+
prependListener(event: 'drain', listener: () => void): this;
|
|
76
|
+
prependListener(event: 'end', listener: () => void): this;
|
|
77
|
+
prependListener(event: 'error', listener: (err: Error) => void): this;
|
|
78
|
+
prependListener(event: 'lookup', listener: (err: Error, address: string, family: string | number, host: string) => void): this;
|
|
79
|
+
prependListener(event: 'ready', listener: () => void): this;
|
|
80
|
+
prependListener(event: 'timeout', listener: () => void): this;
|
|
81
|
+
prependOnceListener(event: string, listener: (...args: any[]) => void): this;
|
|
82
|
+
prependOnceListener(event: 'close', listener: (hadError: boolean) => void): this;
|
|
83
|
+
prependOnceListener(event: 'connect', listener: () => void): this;
|
|
84
|
+
prependOnceListener(event: 'data', listener: (data: Buffer) => void): this;
|
|
85
|
+
prependOnceListener(event: 'drain', listener: () => void): this;
|
|
86
|
+
prependOnceListener(event: 'end', listener: () => void): this;
|
|
87
|
+
prependOnceListener(event: 'error', listener: (err: Error) => void): this;
|
|
88
|
+
prependOnceListener(event: 'lookup', listener: (err: Error, address: string, family: string | number, host: string) => void): this;
|
|
89
|
+
prependOnceListener(event: 'ready', listener: () => void): this;
|
|
90
|
+
prependOnceListener(event: 'timeout', listener: () => void): this;
|
|
91
|
+
setNoDelay(noDelay?: boolean): this;
|
|
92
|
+
setTimeout(timeout: number, callback?: () => void): this;
|
|
93
|
+
}
|
|
94
|
+
declare class Socket extends Duplex {
|
|
95
|
+
stack: Stack;
|
|
96
|
+
options: SocketConstructorOpts;
|
|
97
|
+
constructor(stack: Stack, options?: SocketConstructorOpts);
|
|
98
|
+
}
|
|
99
|
+
export default Socket;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import LoopbackInterface, { LoopbackInterfaceOptions } from './interfaces/loopback-interface.js';
|
|
2
|
+
import TapInterface, { TapInterfaceOptions } from './interfaces/tap-interface.js';
|
|
3
|
+
import TunInterface, { TunInterfaceOptions } from './interfaces/tun-interface.js';
|
|
4
|
+
import NetServer, { ServerOptions } from './server.js';
|
|
5
|
+
import NetSocket, { TcpNetConnectOpts } from './socket.js';
|
|
6
|
+
export declare function unwrap<T, Args extends any[]>(fn: (...args: Args) => [T, Error]): (...args: Args) => T;
|
|
7
|
+
export type StackOptions = {};
|
|
8
|
+
interface Stack {
|
|
9
|
+
_init(options: StackOptions): void;
|
|
10
|
+
}
|
|
11
|
+
export interface Net {
|
|
12
|
+
Socket: typeof NetSocket;
|
|
13
|
+
Server: typeof NetServer;
|
|
14
|
+
createServer(options?: ServerOptions): NetServer;
|
|
15
|
+
createConnection(options: TcpNetConnectOpts, connectionListener?: () => void): NetSocket;
|
|
16
|
+
createConnection(port: number, host?: string, connectionListener?: () => void): NetSocket;
|
|
17
|
+
connect(options: TcpNetConnectOpts, connectionListener?: () => void): NetSocket;
|
|
18
|
+
connect(port: number, host?: string, connectionListener?: () => void): NetSocket;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A user-space TCP/IP network stack
|
|
22
|
+
*/
|
|
23
|
+
declare class Stack {
|
|
24
|
+
options: StackOptions;
|
|
25
|
+
net: Net;
|
|
26
|
+
constructor(options?: StackOptions);
|
|
27
|
+
createLoopbackInterface(options: LoopbackInterfaceOptions): LoopbackInterface;
|
|
28
|
+
createTapInterface(options: TapInterfaceOptions): TapInterface;
|
|
29
|
+
createTunInterface(options: TunInterfaceOptions): TunInterface;
|
|
30
|
+
}
|
|
31
|
+
export default Stack;
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tcpip",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Full TCP/IP stack in the browser",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"clean": "rm -rf dist",
|
|
7
|
+
"build": "npm run clean && npm run build:js && npm run build:wasm",
|
|
8
|
+
"build:js": "tsc -b tsconfig.cjs.json tsconfig.esm.json tsconfig.types.json",
|
|
9
|
+
"build:wasm": "make -C ../..",
|
|
10
|
+
"prepublishOnly": "npm run build"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/cjs/platforms/node.js",
|
|
13
|
+
"browser": "./dist/cjs/platforms/browser.js",
|
|
14
|
+
"types": "./dist/types/index.d.ts",
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*"
|
|
17
|
+
],
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"node": {
|
|
21
|
+
"types": "./dist/types/platforms/node.d.ts",
|
|
22
|
+
"module": "./dist/esm/platforms/node.js",
|
|
23
|
+
"default": "./dist/cjs/platforms/node.js"
|
|
24
|
+
},
|
|
25
|
+
"browser": {
|
|
26
|
+
"types": "./dist/types/platforms/browser.d.ts",
|
|
27
|
+
"module": "./dist/esm/platforms/browser.js",
|
|
28
|
+
"default": "./dist/cjs/platforms/browser.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"./tcpip.wasm": {
|
|
32
|
+
"default": "./dist/tcpip.wasm"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"eventemitter3": "^5.0.1",
|
|
37
|
+
"readable-stream": "^4.3.0",
|
|
38
|
+
"string_decoder": "^1.3.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/readable-stream": "^2.3.15",
|
|
42
|
+
"typescript": "^5.0.4"
|
|
43
|
+
}
|
|
44
|
+
}
|