two-pack 1.0.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.
@@ -0,0 +1,7 @@
1
+ export * from "./packet";
2
+ export * from "./packet-buffer";
3
+ export * from "./packet-client";
4
+ export * from "./packet-codec";
5
+ export * from "./packet-registry";
6
+ export * from "./types/packet.types";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./packet"), exports);
18
+ __exportStar(require("./packet-buffer"), exports);
19
+ __exportStar(require("./packet-client"), exports);
20
+ __exportStar(require("./packet-codec"), exports);
21
+ __exportStar(require("./packet-registry"), exports);
22
+ __exportStar(require("./types/packet.types"), exports);
@@ -0,0 +1,23 @@
1
+ export declare class PacketWriter {
2
+ private buffer;
3
+ private offset;
4
+ constructor(initialSize?: number);
5
+ writeInt32(value: number): void;
6
+ writeString(value: string): void;
7
+ writeBoolean(value: boolean): void;
8
+ writeDouble(value: number): void;
9
+ toBuffer(): Buffer;
10
+ private ensureCapacity;
11
+ }
12
+ export declare class PacketReader {
13
+ private readonly buffer;
14
+ private offset;
15
+ constructor(buffer: Buffer);
16
+ readInt32(): number;
17
+ readString(): string;
18
+ readBoolean(): boolean;
19
+ readFloat(): number;
20
+ readDouble(): number;
21
+ getRemaining(): number;
22
+ }
23
+ //# sourceMappingURL=packet-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-buffer.d.ts","sourceRoot":"","sources":["../src/packet-buffer.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;gBAEf,WAAW,GAAE,MAAY;IAIrC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM/B,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQhC,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAMlC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,QAAQ,IAAI,MAAM;IAIlB,OAAO,CAAC,cAAc;CAOvB;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,MAAM,CAAa;gBAEE,MAAM,EAAE,MAAM;IAE3C,SAAS,IAAI,MAAM;IAMnB,UAAU,IAAI,MAAM;IAWpB,WAAW,IAAI,OAAO;IAMtB,SAAS,IAAI,MAAM;IAMnB,UAAU,IAAI,MAAM;IAMpB,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PacketReader = exports.PacketWriter = void 0;
4
+ class PacketWriter {
5
+ buffer;
6
+ offset = 0;
7
+ constructor(initialSize = 256) {
8
+ this.buffer = Buffer.alloc(initialSize);
9
+ }
10
+ writeInt32(value) {
11
+ this.ensureCapacity(4);
12
+ this.buffer.writeInt32BE(value, this.offset);
13
+ this.offset += 4;
14
+ }
15
+ writeString(value) {
16
+ const encoded = Buffer.from(value, 'utf-8');
17
+ this.writeInt32(encoded.length);
18
+ this.ensureCapacity(encoded.length);
19
+ encoded.copy(this.buffer, this.offset);
20
+ this.offset += encoded.length;
21
+ }
22
+ writeBoolean(value) {
23
+ this.ensureCapacity(1);
24
+ this.buffer.writeUInt8(value ? 1 : 0, this.offset);
25
+ this.offset += 1;
26
+ }
27
+ writeDouble(value) {
28
+ this.ensureCapacity(8);
29
+ this.buffer.writeDoubleBE(value, this.offset);
30
+ this.offset += 8;
31
+ }
32
+ toBuffer() {
33
+ return this.buffer.slice(0, this.offset);
34
+ }
35
+ ensureCapacity(bytes) {
36
+ while (this.offset + bytes > this.buffer.length) {
37
+ const newBuffer = Buffer.alloc(this.buffer.length * 2);
38
+ this.buffer.copy(newBuffer);
39
+ this.buffer = newBuffer;
40
+ }
41
+ }
42
+ }
43
+ exports.PacketWriter = PacketWriter;
44
+ class PacketReader {
45
+ buffer;
46
+ offset = 0;
47
+ constructor(buffer) {
48
+ this.buffer = buffer;
49
+ }
50
+ readInt32() {
51
+ const value = this.buffer.readInt32BE(this.offset);
52
+ this.offset += 4;
53
+ return value;
54
+ }
55
+ readString() {
56
+ const length = this.readInt32();
57
+ const value = this.buffer.toString('utf-8', this.offset, this.offset + length);
58
+ this.offset += length;
59
+ return value;
60
+ }
61
+ readBoolean() {
62
+ const value = this.buffer.readUInt8(this.offset);
63
+ this.offset += 1;
64
+ return value === 1;
65
+ }
66
+ readFloat() {
67
+ const value = this.buffer.readFloatBE(this.offset);
68
+ this.offset += 4;
69
+ return value;
70
+ }
71
+ readDouble() {
72
+ const value = this.buffer.readDoubleBE(this.offset);
73
+ this.offset += 8;
74
+ return value;
75
+ }
76
+ getRemaining() {
77
+ return this.buffer.length - this.offset;
78
+ }
79
+ }
80
+ exports.PacketReader = PacketReader;
@@ -0,0 +1,45 @@
1
+ import { Packet } from './packet';
2
+ import { PacketClientCallbacks } from './types/packet.types';
3
+ import { FrameAccumulator } from "./packet-codec";
4
+ import * as tls from "node:tls";
5
+ import { Observable } from "rxjs";
6
+ import { PacketRegistry } from "./packet-registry";
7
+ export interface TLSClientOptions {
8
+ host: string;
9
+ port: number;
10
+ pfx: Buffer;
11
+ passphrase: string;
12
+ reconnectDelay?: number;
13
+ ciphers?: string;
14
+ }
15
+ export declare abstract class PacketClient {
16
+ private readonly _listeners;
17
+ private _socket;
18
+ private readonly _frameAccumulator;
19
+ private reconnectTimer;
20
+ private _destroyed;
21
+ private readonly packetSubject;
22
+ readonly packets$: Observable<Packet>;
23
+ private readonly _options;
24
+ private readonly _registry;
25
+ protected constructor(_options: TLSClientOptions, _registry: PacketRegistry);
26
+ get listeners(): Map<PacketClientCallbacks, (...args: any[]) => void>;
27
+ get socket(): tls.TLSSocket | null;
28
+ set socket(value: tls.TLSSocket | null);
29
+ get frameAccumulator(): FrameAccumulator;
30
+ get destroyed(): boolean;
31
+ set destroyed(value: boolean);
32
+ get options(): TLSClientOptions;
33
+ get registry(): PacketRegistry;
34
+ get localHost(): string;
35
+ get remoteHost(): string;
36
+ get connected(): boolean;
37
+ send(packet: Packet): void;
38
+ connect(): void;
39
+ disconnect(): void;
40
+ on(event: PacketClientCallbacks, listener: (...args: any[]) => void): this;
41
+ callback(event: PacketClientCallbacks, ...args: any[]): void;
42
+ private scheduleReconnect;
43
+ private clearReconnect;
44
+ }
45
+ //# sourceMappingURL=packet-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-client.d.ts","sourceRoot":"","sources":["../src/packet-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAA6B,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,UAAU,EAAU,MAAM,MAAM,CAAC;AACzC,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8BAAsB,YAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGvB;IACJ,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;IAC5D,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAqC;IAC1E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAE3C,SAAS,aAAa,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc;IAK3E,IAAI,SAAS,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAEpE;IAED,IAAI,MAAM,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAEjC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,EAErC;IAED,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAGD,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,EAE3B;IAED,IAAI,OAAO,IAAI,gBAAgB,CAE9B;IAED,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW1B,OAAO,IAAI,IAAI;IA6Cf,UAAU,IAAI,IAAI;IAUlB,EAAE,CACA,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GACjC,IAAI;IAKP,QAAQ,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAO5D,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,cAAc;CAMvB"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) Tristan Landry
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.PacketClient = void 0;
40
+ const packet_codec_1 = require("./packet-codec");
41
+ const tls = __importStar(require("node:tls"));
42
+ const rxjs_1 = require("rxjs");
43
+ class PacketClient {
44
+ _listeners = new Map();
45
+ _socket = null;
46
+ _frameAccumulator = new packet_codec_1.FrameAccumulator();
47
+ reconnectTimer = null;
48
+ _destroyed = false;
49
+ packetSubject = new rxjs_1.Subject();
50
+ packets$ = this.packetSubject.asObservable();
51
+ _options;
52
+ _registry;
53
+ constructor(_options, _registry) {
54
+ this._options = _options;
55
+ this._registry = _registry;
56
+ }
57
+ get listeners() {
58
+ return this._listeners;
59
+ }
60
+ get socket() {
61
+ return this._socket;
62
+ }
63
+ set socket(value) {
64
+ this._socket = value;
65
+ }
66
+ get frameAccumulator() {
67
+ return this._frameAccumulator;
68
+ }
69
+ get destroyed() {
70
+ return this._destroyed;
71
+ }
72
+ set destroyed(value) {
73
+ this._destroyed = value;
74
+ }
75
+ get options() {
76
+ return this._options;
77
+ }
78
+ get registry() {
79
+ return this._registry;
80
+ }
81
+ get localHost() {
82
+ return this.socket?.localAddress || 'unknown';
83
+ }
84
+ get remoteHost() {
85
+ return this.socket?.remoteAddress || 'unknown';
86
+ }
87
+ get connected() {
88
+ return !!this.socket && !this.socket.destroyed;
89
+ }
90
+ send(packet) {
91
+ if (!this.socket || this.socket.destroyed) {
92
+ console.error('Socket is not connected');
93
+ return;
94
+ }
95
+ const frame = (0, packet_codec_1.encodePacket)(packet);
96
+ this.socket.write(frame);
97
+ this.callback("packetSent", packet);
98
+ }
99
+ connect() {
100
+ this.destroyed = false;
101
+ if (this.destroyed)
102
+ return;
103
+ const { host, port, pfx, ciphers, passphrase } = this.options;
104
+ this.socket = tls.connect({
105
+ host,
106
+ port,
107
+ pfx,
108
+ passphrase,
109
+ ciphers,
110
+ minVersion: 'TLSv1.2',
111
+ rejectUnauthorized: false,
112
+ }, () => {
113
+ this.callback("connected", this);
114
+ });
115
+ this.socket.on('data', (chunk) => {
116
+ const frames = this.frameAccumulator.push(chunk);
117
+ for (const frame of frames) {
118
+ try {
119
+ const packet = (0, packet_codec_1.decodePacket)(frame, this.registry);
120
+ if (packet) {
121
+ this.packetSubject.next(packet);
122
+ }
123
+ }
124
+ catch (err) {
125
+ console.error('Error decoding packet:', err instanceof Error ? err.message : err);
126
+ }
127
+ }
128
+ });
129
+ this.socket.on('error', (err) => {
130
+ console.error('Socket error:', err.message);
131
+ });
132
+ this.socket.on('close', () => {
133
+ console.warn('Socket closed');
134
+ this.frameAccumulator.reset();
135
+ this.scheduleReconnect();
136
+ });
137
+ }
138
+ disconnect() {
139
+ this.destroyed = true;
140
+ this.clearReconnect();
141
+ this.socket?.destroy();
142
+ this.socket = null;
143
+ this.frameAccumulator.reset();
144
+ this.callback("disconnected", this);
145
+ }
146
+ on(event, listener) {
147
+ this.listeners.set(event, listener);
148
+ return this;
149
+ }
150
+ callback(event, ...args) {
151
+ const listener = this.listeners.get(event);
152
+ if (listener) {
153
+ listener(...args);
154
+ }
155
+ }
156
+ scheduleReconnect() {
157
+ if (this.destroyed)
158
+ return;
159
+ const delay = this.options.reconnectDelay ?? 5_000;
160
+ console.log(`Reconnecting in ${delay}ms...`);
161
+ this.reconnectTimer = setTimeout(() => {
162
+ this.connect();
163
+ }, delay);
164
+ }
165
+ clearReconnect() {
166
+ if (this.reconnectTimer) {
167
+ clearTimeout(this.reconnectTimer);
168
+ this.reconnectTimer = null;
169
+ }
170
+ }
171
+ }
172
+ exports.PacketClient = PacketClient;
@@ -0,0 +1,10 @@
1
+ import { Packet } from './packet';
2
+ import { PacketRegistry } from './packet-registry';
3
+ export declare function encodePacket(packet: Packet): Buffer;
4
+ export declare function decodePacket(data: Buffer, registry: PacketRegistry): Packet | undefined;
5
+ export declare class FrameAccumulator {
6
+ private buffer;
7
+ push(chunk: Buffer): Buffer[];
8
+ reset(): void;
9
+ }
10
+ //# sourceMappingURL=packet-codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-codec.d.ts","sourceRoot":"","sources":["../src/packet-codec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG,SAAS,CAYpB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA2B;IAEzC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAoB7B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FrameAccumulator = void 0;
4
+ exports.encodePacket = encodePacket;
5
+ exports.decodePacket = decodePacket;
6
+ const common_1 = require("@nestjs/common");
7
+ const packet_buffer_1 = require("./packet-buffer");
8
+ const logger = new common_1.Logger('PacketCodec');
9
+ function encodePacket(packet) {
10
+ const writer = new packet_buffer_1.PacketWriter();
11
+ writer.writeString(packet.packetName);
12
+ packet.write(writer);
13
+ const body = writer.toBuffer();
14
+ const frame = Buffer.alloc(4 + body.length);
15
+ frame.writeInt32BE(body.length, 0);
16
+ body.copy(frame, 4);
17
+ return frame;
18
+ }
19
+ function decodePacket(data, registry) {
20
+ const reader = new packet_buffer_1.PacketReader(data);
21
+ const packetName = reader.readString();
22
+ const packet = registry.create(packetName);
23
+ if (!packet) {
24
+ logger.warn(`Unknown packet received: ${packetName}`);
25
+ return undefined;
26
+ }
27
+ packet.read(reader);
28
+ return packet;
29
+ }
30
+ class FrameAccumulator {
31
+ buffer = Buffer.alloc(0);
32
+ push(chunk) {
33
+ this.buffer = Buffer.concat([this.buffer, chunk]);
34
+ const frames = [];
35
+ while (this.buffer.length >= 4) {
36
+ const bodyLength = this.buffer.readInt32BE(0);
37
+ if (this.buffer.length < 4 + bodyLength) {
38
+ break;
39
+ }
40
+ const body = this.buffer.subarray(4, 4 + bodyLength);
41
+ frames.push(body);
42
+ this.buffer = this.buffer.subarray(4 + bodyLength);
43
+ }
44
+ return frames;
45
+ }
46
+ reset() {
47
+ this.buffer = Buffer.alloc(0);
48
+ }
49
+ }
50
+ exports.FrameAccumulator = FrameAccumulator;
@@ -0,0 +1,11 @@
1
+ import { Packet } from './packet';
2
+ type PacketConstructor = new () => Packet;
3
+ export declare class PacketRegistry {
4
+ private readonly packets;
5
+ register(packetClass: PacketConstructor): void;
6
+ get(name: string): PacketConstructor | undefined;
7
+ create(name: string): Packet | undefined;
8
+ has(name: string): boolean;
9
+ }
10
+ export {};
11
+ //# sourceMappingURL=packet-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-registry.d.ts","sourceRoot":"","sources":["../src/packet-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,KAAK,iBAAiB,GAAG,UAAU,MAAM,CAAC;AAE1C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE,QAAQ,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI;IAM9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIhD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKxC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG3B"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PacketRegistry = void 0;
4
+ class PacketRegistry {
5
+ packets = new Map();
6
+ register(packetClass) {
7
+ const instance = new packetClass();
8
+ const name = instance.packetName;
9
+ this.packets.set(name, packetClass);
10
+ }
11
+ get(name) {
12
+ return this.packets.get(name.toLowerCase());
13
+ }
14
+ create(name) {
15
+ const ctor = this.get(name);
16
+ return ctor ? new ctor() : undefined;
17
+ }
18
+ has(name) {
19
+ return this.packets.has(name.toLowerCase());
20
+ }
21
+ }
22
+ exports.PacketRegistry = PacketRegistry;
@@ -0,0 +1,23 @@
1
+ import { PacketReader, PacketWriter } from './packet-buffer';
2
+ import { PacketClient } from './packet-client';
3
+ import { Logger } from '@nestjs/common';
4
+ /**
5
+ * Abstract base class for all packets.
6
+ *
7
+ * Naming convention (informational only, both sides use this same class):
8
+ * - SPacket* = server-side (sent FROM server)
9
+ * - CPacket* = client-side (sent FROM client)
10
+ *
11
+ * Packets are matched by their lowercase name without the S/C prefix:
12
+ * SPacketKiosks -> "packetkiosks"
13
+ * CPacketKiosks -> "packetkiosks"
14
+ */
15
+ export declare abstract class Packet {
16
+ readonly logger: Logger;
17
+ get packetName(): string;
18
+ log(...args: any[]): void;
19
+ abstract read(reader: PacketReader): void;
20
+ abstract write(writer: PacketWriter): void;
21
+ abstract handle(client: PacketClient): void;
22
+ }
23
+ //# sourceMappingURL=packet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../src/packet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC;;;;;;;;;;GAUG;AACH,8BAAsB,MAAM;IACxB,QAAQ,CAAC,MAAM,SAAkD;IAGjE,IAAI,UAAU,IAAI,MAAM,CAIvB;IAED,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IAOlB,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAEzC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAE1C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CAC9C"}
package/dist/packet.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) Tristan Landry
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Packet = void 0;
7
+ const common_1 = require("@nestjs/common");
8
+ /**
9
+ * Abstract base class for all packets.
10
+ *
11
+ * Naming convention (informational only, both sides use this same class):
12
+ * - SPacket* = server-side (sent FROM server)
13
+ * - CPacket* = client-side (sent FROM client)
14
+ *
15
+ * Packets are matched by their lowercase name without the S/C prefix:
16
+ * SPacketKiosks -> "packetkiosks"
17
+ * CPacketKiosks -> "packetkiosks"
18
+ */
19
+ class Packet {
20
+ logger = new common_1.Logger(this.constructor.name.substring(1));
21
+ // Strip the S/C prefix: "SPacketKiosks" -> "PacketKiosks" -> "packetkiosks"
22
+ get packetName() {
23
+ const className = this.constructor.name;
24
+ const stripped = className.replace(/^[SC](?=Packet)/i, '');
25
+ return stripped.toLowerCase();
26
+ }
27
+ log(...args) {
28
+ this.logger.verbose((this.constructor.name.startsWith('S') ? '[CLIENT] ' : '[SERVER] ') +
29
+ args);
30
+ }
31
+ }
32
+ exports.Packet = Packet;
@@ -0,0 +1,8 @@
1
+ export declare const PACKET_CLIENT_CALLBACKS: {
2
+ readonly packetSent: "packetSent";
3
+ readonly packetReceived: "packetReceived";
4
+ readonly connected: "connected";
5
+ readonly disconnected: "disconnected";
6
+ };
7
+ export type PacketClientCallbacks = (typeof PACKET_CLIENT_CALLBACKS)[keyof typeof PACKET_CLIENT_CALLBACKS];
8
+ //# sourceMappingURL=packet.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet.types.d.ts","sourceRoot":"","sources":["../../src/types/packet.types.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) Tristan Landry
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PACKET_CLIENT_CALLBACKS = void 0;
7
+ exports.PACKET_CLIENT_CALLBACKS = {
8
+ packetSent: 'packetSent',
9
+ packetReceived: 'packetReceived',
10
+ connected: 'connected',
11
+ disconnected: 'disconnected',
12
+ };
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "two-pack",
3
+ "version": "1.0.0",
4
+ "description": "Original: TwoPack (Java) Library rewritten using TypeScript/JavaScript.",
5
+ "author": "Tristan Landry",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./src": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc"
23
+ },
24
+ "dependencies": {
25
+ "rxjs": "^7.8.2"
26
+ },
27
+ "devDependencies": {
28
+ "@nestjs/common": "^11.1.19",
29
+ "@types/node": "^25.6.0",
30
+ "node": "^25.9.0",
31
+ "typescript": "^5.5.3"
32
+ },
33
+ "private": false
34
+ }