@mtcute/bun 0.9.0 → 0.9.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/package.json +2 -2
- package/utils/tcp.d.ts +2 -0
- package/utils/tcp.js +18 -2
- package/utils/tcp.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mtcute/bun",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "Meta-package for Bun",
|
|
5
5
|
"author": "alina sireneva <alina@tei.su>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"./utils.js": "./utils.js"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@mtcute/core": "^0.9.
|
|
16
|
+
"@mtcute/core": "^0.9.1",
|
|
17
17
|
"@mtcute/wasm": "^0.9.0",
|
|
18
18
|
"@mtcute/markdown-parser": "^0.9.0",
|
|
19
19
|
"@mtcute/html-parser": "^0.9.0"
|
package/utils/tcp.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export declare abstract class BaseTcpTransport extends EventEmitter implements I
|
|
|
25
25
|
handleError(socket: unknown, error: Error): void;
|
|
26
26
|
handleConnect(socket: Socket): void;
|
|
27
27
|
send(bytes: Uint8Array): Promise<void>;
|
|
28
|
+
private _sendOnceDrained;
|
|
29
|
+
private handleDrained;
|
|
28
30
|
}
|
|
29
31
|
export declare class TcpTransport extends BaseTcpTransport {
|
|
30
32
|
_packetCodec: IntermediatePacketCodec;
|
package/utils/tcp.js
CHANGED
|
@@ -11,6 +11,7 @@ export class BaseTcpTransport extends EventEmitter {
|
|
|
11
11
|
this._state = TransportState.Idle;
|
|
12
12
|
this._socket = null;
|
|
13
13
|
this.packetCodecInitialized = false;
|
|
14
|
+
this._sendOnceDrained = [];
|
|
14
15
|
}
|
|
15
16
|
_updateLogPrefix() {
|
|
16
17
|
if (this._currentDc) {
|
|
@@ -54,6 +55,7 @@ export class BaseTcpTransport extends EventEmitter {
|
|
|
54
55
|
error: this.handleError.bind(this),
|
|
55
56
|
data: (socket, data) => this._packetCodec.feed(data),
|
|
56
57
|
close: this.close.bind(this),
|
|
58
|
+
drain: this.handleDrained.bind(this),
|
|
57
59
|
},
|
|
58
60
|
}).catch((err) => {
|
|
59
61
|
this.handleError(null, err);
|
|
@@ -64,12 +66,13 @@ export class BaseTcpTransport extends EventEmitter {
|
|
|
64
66
|
if (this._state === TransportState.Idle)
|
|
65
67
|
return;
|
|
66
68
|
this.log.info('connection closed');
|
|
67
|
-
this.emit('close');
|
|
68
69
|
this._state = TransportState.Idle;
|
|
69
70
|
this._socket?.end();
|
|
70
71
|
this._socket = null;
|
|
71
72
|
this._currentDc = null;
|
|
72
73
|
this._packetCodec.reset();
|
|
74
|
+
this._sendOnceDrained = [];
|
|
75
|
+
this.emit('close');
|
|
73
76
|
}
|
|
74
77
|
handleError(socket, error) {
|
|
75
78
|
this.log.error('error: %s', error.stack);
|
|
@@ -97,7 +100,20 @@ export class BaseTcpTransport extends EventEmitter {
|
|
|
97
100
|
if (this._state !== TransportState.Ready) {
|
|
98
101
|
throw new MtcuteError('Transport is not READY');
|
|
99
102
|
}
|
|
100
|
-
this._socket.write(framed);
|
|
103
|
+
const written = this._socket.write(framed);
|
|
104
|
+
if (written < framed.length) {
|
|
105
|
+
this._sendOnceDrained.push(framed.subarray(written));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
handleDrained() {
|
|
109
|
+
while (this._sendOnceDrained.length) {
|
|
110
|
+
const data = this._sendOnceDrained.shift();
|
|
111
|
+
const written = this._socket.write(data);
|
|
112
|
+
if (written < data.length) {
|
|
113
|
+
this._sendOnceDrained.unshift(data.subarray(written));
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
101
117
|
}
|
|
102
118
|
}
|
|
103
119
|
export class TcpTransport extends BaseTcpTransport {
|
package/utils/tcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/utils/tcp.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,uBAAuB,EAAoC,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGrH;;;GAGG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,YAAY;IAA3D;;QACc,eAAU,GAAyB,IAAI,CAAA;QACvC,WAAM,GAAmB,cAAc,CAAC,IAAI,CAAA;QAC5C,YAAO,GAAkB,IAAI,CAAA;QAMvC,2BAAsB,GAAG,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/utils/tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import { Socket } from 'bun'\nimport EventEmitter from 'events'\n\nimport { IntermediatePacketCodec, IPacketCodec, ITelegramTransport, MtcuteError, TransportState } from '@mtcute/core'\nimport { BasicDcOption, ICryptoProvider, Logger } from '@mtcute/core/utils.js'\n\n/**\n * Base for TCP transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseTcpTransport extends EventEmitter implements ITelegramTransport {\n protected _currentDc: BasicDcOption | null = null\n protected _state: TransportState = TransportState.Idle\n protected _socket: Socket | null = null\n\n abstract _packetCodec: IPacketCodec\n protected _crypto!: ICryptoProvider\n protected log!: Logger\n\n packetCodecInitialized = false\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `\n } else {\n this.log.prefix = '[TCP:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('tcp')\n this._updateLogPrefix()\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): BasicDcOption | null {\n return this._currentDc\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connect(dc: BasicDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._updateLogPrefix()\n\n this.log.debug('connecting to %j', dc)\n\n Bun.connect({\n hostname: dc.ipAddress,\n port: dc.port,\n socket: {\n open: this.handleConnect.bind(this),\n error: this.handleError.bind(this),\n data: (socket, data) => this._packetCodec.feed(data),\n close: this.close.bind(this),\n drain: this.handleDrained.bind(this),\n },\n }).catch((err) => {\n this.handleError(null, err as Error)\n this.close()\n })\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this._state = TransportState.Idle\n this._socket?.end()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n this._sendOnceDrained = []\n this.emit('close')\n }\n\n handleError(socket: unknown, error: Error): void {\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(socket: Socket): void {\n this._socket = socket\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n if (initialMessage.length) {\n this._socket!.write(initialMessage)\n this._state = TransportState.Ready\n this.emit('ready')\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n const framed = await this._packetCodec.encode(bytes)\n\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n const written = this._socket!.write(framed)\n\n if (written < framed.length) {\n this._sendOnceDrained.push(framed.subarray(written))\n }\n }\n\n private _sendOnceDrained: Uint8Array[] = []\n private handleDrained(): void {\n while (this._sendOnceDrained.length) {\n const data = this._sendOnceDrained.shift()!\n const written = this._socket!.write(data)\n\n if (written < data.length) {\n this._sendOnceDrained.unshift(data.subarray(written))\n break\n }\n }\n }\n}\n\nexport class TcpTransport extends BaseTcpTransport {\n _packetCodec = new IntermediatePacketCodec()\n}\n"]}
|