sonic-ws 1.0.0-rc.7 → 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.
Files changed (40) hide show
  1. package/README.md +19 -11
  2. package/dist/index.js +1 -1
  3. package/dist/version.d.ts +5 -3
  4. package/dist/version.js +8 -5
  5. package/dist/ws/Connection.d.ts +19 -0
  6. package/dist/ws/Connection.js +17 -0
  7. package/dist/ws/client/core/ClientCore.d.ts +27 -9
  8. package/dist/ws/client/core/ClientCore.js +162 -64
  9. package/dist/ws/client/node/ClientNode.js +2 -2
  10. package/dist/ws/packets/PacketProcessors.d.ts +11 -6
  11. package/dist/ws/packets/PacketProcessors.js +233 -175
  12. package/dist/ws/packets/PacketType.d.ts +30 -16
  13. package/dist/ws/packets/PacketType.js +31 -17
  14. package/dist/ws/packets/Packets.d.ts +15 -14
  15. package/dist/ws/packets/Packets.js +117 -99
  16. package/dist/ws/server/SonicWSConnection.d.ts +30 -8
  17. package/dist/ws/server/SonicWSConnection.js +67 -25
  18. package/dist/ws/server/SonicWSServer.d.ts +22 -0
  19. package/dist/ws/server/SonicWSServer.js +50 -8
  20. package/dist/ws/util/ArrayUtil.js +1 -1
  21. package/dist/ws/util/BufferUtil.d.ts +4 -0
  22. package/dist/ws/util/BufferUtil.js +40 -0
  23. package/dist/ws/util/StringUtil.d.ts +6 -0
  24. package/dist/ws/util/StringUtil.js +66 -0
  25. package/dist/ws/util/enums/EnumHandler.d.ts +2 -3
  26. package/dist/ws/util/enums/EnumHandler.js +4 -7
  27. package/dist/ws/util/enums/EnumType.d.ts +3 -2
  28. package/dist/ws/util/enums/EnumType.js +21 -10
  29. package/dist/ws/util/packets/BatchHelper.d.ts +10 -6
  30. package/dist/ws/util/packets/BatchHelper.js +28 -16
  31. package/dist/ws/util/packets/CompressionUtil.d.ts +44 -0
  32. package/dist/ws/util/packets/CompressionUtil.js +321 -0
  33. package/dist/ws/util/packets/PacketHolder.d.ts +5 -10
  34. package/dist/ws/util/packets/PacketHolder.js +25 -13
  35. package/dist/ws/util/packets/PacketUtils.d.ts +11 -8
  36. package/dist/ws/util/packets/PacketUtils.js +31 -26
  37. package/dist/ws/util/packets/RateHandler.js +16 -1
  38. package/package.json +2 -2
  39. package/dist/ws/util/packets/CodePointUtil.d.ts +0 -22
  40. package/dist/ws/util/packets/CodePointUtil.js +0 -220
@@ -1,35 +1,37 @@
1
1
  import { EnumPackage } from "../util/enums/EnumType";
2
2
  import { SonicWSConnection } from "../server/SonicWSConnection";
3
3
  import { PacketType } from "./PacketType";
4
+ export type ValidatorFunction = ((socket: SonicWSConnection, values: any[]) => boolean) | null;
4
5
  export declare class Packet {
5
6
  tag: string;
7
+ defaultEnabled: boolean;
6
8
  maxSize: number;
7
9
  minSize: number;
8
10
  type: PacketType | PacketType[];
9
11
  enumData: EnumPackage[];
10
12
  dataMax: number | number[];
11
13
  dataMin: number | number[];
12
- packetDelimitSize: number;
13
14
  dataBatching: number;
14
15
  maxBatchSize: number;
15
16
  dontSpread: boolean;
16
17
  autoFlatten: boolean;
17
18
  rateLimit: number;
18
19
  object: boolean;
20
+ client: boolean;
19
21
  private receiveProcessor;
20
22
  private sendProcessor;
21
- private validifier;
22
- processReceive: (data: string) => any;
23
- processSend: (data: any[]) => string;
24
- validate: (data: string) => boolean;
23
+ private validator;
24
+ processReceive: (data: Uint8Array, validationResult: any) => any;
25
+ processSend: (data: any[]) => number[];
26
+ validate: (data: Uint8Array) => boolean;
25
27
  customValidator: ((socket: SonicWSConnection, ...values: any[]) => boolean) | null;
26
- constructor(tag: string, schema: PacketSchema, customValidator: ((socket: SonicWSConnection, values: any[]) => boolean) | null, client: boolean);
27
- listen(value: string, socket: SonicWSConnection | null): [processed: any, flatten: boolean] | string;
28
- private serializeINT_D;
29
- serialize(): string;
30
- private static processINT_Ds;
31
- static deserialize(text: string, offset: number, client: boolean): [packet: Packet, offset: number];
32
- static deserializeAll(text: string, client: boolean): Packet[];
28
+ constructor(tag: string, schema: PacketSchema, customValidator: ValidatorFunction, enabled: boolean, client: boolean);
29
+ listen(value: Uint8Array, socket: SonicWSConnection | null): [processed: any, flatten: boolean] | string;
30
+ private serializeNumber;
31
+ serialize(): number[];
32
+ private static readVarInts;
33
+ static deserialize(data: Uint8Array, offset: number, client: boolean): [packet: Packet, offset: number];
34
+ static deserializeAll(data: Uint8Array, client: boolean): Packet[];
33
35
  }
34
36
  export declare class PacketSchema {
35
37
  types: PacketType[];
@@ -38,7 +40,6 @@ export declare class PacketSchema {
38
40
  type: PacketType;
39
41
  dataMax: number;
40
42
  dataMin: number;
41
- packetDelimitSize: number;
42
43
  dataBatching: number;
43
44
  maxBatchSize: number;
44
45
  rateLimit: number;
@@ -48,5 +49,5 @@ export declare class PacketSchema {
48
49
  object: boolean;
49
50
  constructor(object: boolean);
50
51
  static single(type: PacketType | EnumPackage, dataMax: number, dataMin: number, dontSpread: boolean, dataBatching: number, maxBatchSize: number, rateLimit: number): PacketSchema;
51
- static object(types: (PacketType | EnumPackage)[], dataMaxes: number[], dataMins: number[], dontSpread: boolean, autoFlatten: boolean, packetDelimitSize: number, dataBatching: number, maxBatchSize: number, rateLimit: number): PacketSchema;
52
+ static object(types: (PacketType | EnumPackage)[], dataMaxes: number[], dataMins: number[], dontSpread: boolean, autoFlatten: boolean, dataBatching: number, maxBatchSize: number, rateLimit: number): PacketSchema;
52
53
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- * Copyright 2025 Lily (cutelittlelily)
3
+ * Copyright 2025 Lily (liwybloc)
4
4
  *
5
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
6
  * you may not use this file except in compliance with the License.
@@ -27,32 +27,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.PacketSchema = exports.Packet = void 0;
28
28
  var EnumHandler_1 = require("../util/enums/EnumHandler");
29
29
  var EnumType_1 = require("../util/enums/EnumType");
30
- var ArrayUtil_1 = require("../util/ArrayUtil");
31
- var CodePointUtil_1 = require("../util/packets/CodePointUtil");
30
+ var CompressionUtil_1 = require("../util/packets/CompressionUtil");
32
31
  var PacketUtils_1 = require("../util/packets/PacketUtils");
33
32
  var PacketProcessors_1 = require("./PacketProcessors");
34
33
  var PacketType_1 = require("./PacketType");
34
+ var BufferUtil_1 = require("../util/BufferUtil");
35
+ var StringUtil_1 = require("../util/StringUtil");
35
36
  var Packet = /** @class */ (function () {
36
- function Packet(tag, schema, customValidator, client) {
37
+ function Packet(tag, schema, customValidator, enabled, client) {
37
38
  var _this = this;
38
39
  this.tag = tag;
40
+ this.defaultEnabled = enabled;
41
+ this.client = client;
39
42
  this.enumData = schema.enumData;
40
43
  this.rateLimit = schema.rateLimit;
41
44
  this.dontSpread = schema.dontSpread;
42
45
  this.autoFlatten = schema.autoFlatten;
43
46
  this.dataBatching = schema.dataBatching;
44
47
  this.maxBatchSize = client ? Infinity : schema.maxBatchSize;
45
- this.packetDelimitSize = schema.packetDelimitSize;
46
- if (schema.object) {
48
+ this.object = schema.object;
49
+ if (this.object) {
47
50
  this.type = schema.types;
48
51
  this.dataMax = schema.dataMaxes;
49
52
  this.dataMin = schema.dataMins;
50
53
  this.maxSize = this.type.length;
51
54
  this.minSize = this.type.length;
52
- this.object = true;
53
- this.receiveProcessor = (0, PacketProcessors_1.createObjReceiveProcessor)(this.type, this.packetDelimitSize);
54
- this.validifier = (0, PacketProcessors_1.createObjValidator)(this.type, this.packetDelimitSize);
55
- this.sendProcessor = (0, PacketProcessors_1.createObjSendProcessor)(this.type, this.packetDelimitSize);
55
+ this.receiveProcessor = (0, PacketProcessors_1.createObjReceiveProcessor)(this);
56
+ this.validator = (0, PacketProcessors_1.createObjValidator)(this);
57
+ this.sendProcessor = (0, PacketProcessors_1.createObjSendProcessor)(this);
56
58
  }
57
59
  else {
58
60
  this.type = schema.type;
@@ -60,21 +62,22 @@ var Packet = /** @class */ (function () {
60
62
  this.dataMin = schema.dataMin;
61
63
  this.maxSize = this.dataMax;
62
64
  this.minSize = this.dataMin;
63
- this.object = false;
64
- this.receiveProcessor = PacketProcessors_1.PacketReceiveProcessors[this.type];
65
- this.validifier = PacketProcessors_1.PacketValidityProcessors[this.type];
66
- this.sendProcessor = PacketProcessors_1.PacketSendProcessors[this.type];
65
+ this.receiveProcessor = (0, PacketProcessors_1.createReceiveProcessor)(this.type, this.enumData, this.dataMax);
66
+ this.validator = (0, PacketProcessors_1.createValidator)(this.type, this.dataMax, this.dataMin, this.enumData);
67
+ this.sendProcessor = (0, PacketProcessors_1.createSendProcessor)(this.type);
67
68
  }
68
- this.processReceive = function (data) { return _this.receiveProcessor(data, _this.dataMax, _this, 0); };
69
+ this.processReceive = function (data, validationResult) { return _this.receiveProcessor(data, validationResult, 0); };
69
70
  this.processSend = function (data) { return _this.sendProcessor(data); };
70
- this.validate = client ? function () { return true; } : function (data) { return _this.validifier(data, _this.dataMax, _this.dataMin, _this, 0); };
71
+ this.validate = function (data) { return _this.validator(data, 0); };
71
72
  this.customValidator = customValidator;
73
+ this.serializeNumber = this.serializeNumber.bind(this);
72
74
  }
73
75
  Packet.prototype.listen = function (value, socket) {
74
76
  try {
75
- if (!this.validate(value))
77
+ var validationResult = this.validate(value);
78
+ if (!this.client && validationResult == false)
76
79
  return "Invalid packet";
77
- var processed = this.processReceive(value);
80
+ var processed = this.processReceive(value, validationResult);
78
81
  var useableData = this.autoFlatten ? (0, PacketUtils_1.UnFlattenData)(processed) : processed;
79
82
  if (this.customValidator != null) {
80
83
  if (!this.dontSpread) {
@@ -93,114 +96,129 @@ var Packet = /** @class */ (function () {
93
96
  return "Error: " + err;
94
97
  }
95
98
  };
96
- Packet.prototype.serializeINT_D = function (n) {
97
- return String.fromCharCode.apply(String, (0, CodePointUtil_1.processCharCodes)((0, CodePointUtil_1.convertINT_D)(n, this.packetDelimitSize)).map(function (x) { return x + 1; }));
99
+ Packet.prototype.serializeNumber = function (n) {
100
+ return (0, CompressionUtil_1.convertVarInt)(n, false);
98
101
  };
99
102
  Packet.prototype.serialize = function () {
100
- var _this = this;
101
- // spread flag; ETX for "2", STX for "1", avoid NULL for delimiting
102
- var spreadFlag = this.dontSpread ? CodePointUtil_1.ETX : CodePointUtil_1.STX;
103
- // enum data, avoid null
104
- var enumData = String.fromCharCode(this.enumData.length + 1) + this.enumData.map(function (x) { return x.serialize(); }).join("");
105
- // data batching, also avoid null
106
- var dataBatching = String.fromCharCode(this.dataBatching + 1) + String.fromCharCode(this.maxBatchSize + 1);
107
- // rate limit, avoiding null again... ugh i should prob fix this with a map-
108
- var rateLimit = String.fromCharCode(this.rateLimit + 1);
103
+ // shared values for both
104
+ var sharedData = __spreadArray(__spreadArray(__spreadArray([
105
+ this.tag.length
106
+ ], (0, StringUtil_1.processCharCodes)(this.tag), true), [
107
+ this.dontSpread ? 1 : 0,
108
+ this.dataBatching, this.maxBatchSize,
109
+ this.enumData.length
110
+ ], false), this.enumData.map(function (x) { return x.serialize(); }).flat(), true);
109
111
  // single-value packet (not an object schema)
110
112
  if (!this.object) {
111
- return spreadFlag + dataBatching + rateLimit + enumData +
112
- CodePointUtil_1.STX + // dummy byte flag for consistent deserialization; becomes -1 to indicate single
113
- String.fromCharCode(this.dataMax + 1) + // the data max, offset by 1 for NULL
114
- String.fromCharCode(this.dataMin + 1) + // the data min, offset by 1 for NULL
115
- String.fromCharCode(this.type + 1) + // the type, offset by 1 for NULL
116
- String.fromCharCode(this.tag.length + 1) + // tag length, offset by 1 for NULL
117
- this.tag; // the tag
113
+ return __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], sharedData, true), [
114
+ 0
115
+ ], false), this.serializeNumber(this.dataMax), true), this.serializeNumber(this.dataMin), true), [
116
+ this.type,
117
+ ], false);
118
118
  }
119
119
  // object packet
120
- return spreadFlag + dataBatching + rateLimit + enumData +
121
- String.fromCharCode(this.maxSize + 2) + // size, and +2 because of NULL and STX (STX is for single)
122
- (this.autoFlatten ? CodePointUtil_1.ETX : CodePointUtil_1.STX) + // auto flatten flag
123
- String.fromCharCode(this.packetDelimitSize + 1) + // packet delimit size, offset by 1 for NULL
124
- this.dataMax.map(function (x) { return _this.serializeINT_D(x); }).join("") + // all data maxes, serialized
125
- this.dataMin.map(function (x) { return _this.serializeINT_D(x); }).join("") + // all data mins, serialized
126
- this.type.map(function (x) { return String.fromCharCode(x + 1); }).join("") + // all types, offset by 1 for NULL
127
- String.fromCharCode(this.tag.length + 1) + // tag length, offset by 1 for NULL
128
- this.tag; // the tag
120
+ return __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], sharedData, true), [
121
+ this.maxSize + 1, // size, and +1 because of 0 for single
122
+ this.autoFlatten ? 1 : 0
123
+ ], false), this.dataMax.map(this.serializeNumber).flat(), true), this.dataMin.map(this.serializeNumber).flat(), true), this.type, true), [
124
+ this.tag.length, // tag length, offset by 1 for NULL
125
+ ], false);
129
126
  };
130
- Packet.processINT_Ds = function (area, packetDelimitSize) {
131
- return (0, ArrayUtil_1.splitArray)((0, CodePointUtil_1.processCharCodes)(area), packetDelimitSize).map(function (x) { return (0, CodePointUtil_1.deconvertINT_DCodes)(x.map(function (y) { return y - 1; })); }); // subtract 1 to reverse
127
+ Packet.readVarInts = function (data, offset, size) {
128
+ var res = [];
129
+ for (var i = 0; i < size; i++) {
130
+ var _a = (0, CompressionUtil_1.readVarInt)(data, offset, false), off = _a[0], varint = _a[1];
131
+ offset = off;
132
+ res.push(varint);
133
+ }
134
+ return [res, offset];
132
135
  };
133
- // i think i was high when i made these,
134
- // probably ^^
135
- Packet.deserialize = function (text, offset, client) {
136
+ Packet.deserialize = function (data, offset, client) {
136
137
  var beginningOffset = offset;
137
- var dontSpread = text[offset] == CodePointUtil_1.ETX;
138
- var dataBatching = text.charCodeAt(++offset) - 1;
139
- var maxBatchSize = text.charCodeAt(++offset) - 1;
140
- var rateLimit = text.charCodeAt(++offset) - 1;
141
- var enumLength = text.charCodeAt(++offset) - 1;
138
+ // read length, go up 1
139
+ var tagLength = data[offset++];
140
+ // read tag as it's up 1, and add offset
141
+ var tag = (0, BufferUtil_1.as8String)(data.slice(offset, offset += tagLength));
142
+ // then read dont spread, go up 1
143
+ var dontSpread = data[offset++] == 1;
144
+ // read batching, up 1
145
+ var dataBatching = data[offset++];
146
+ // read max batch size, up 1; can prob remove? idk
147
+ var maxBatchSize = data[offset++];
148
+ // read enum length, up 1
149
+ var enumLength = data[offset++];
142
150
  var enums = [];
143
151
  for (var i = 0; i < enumLength; i++) {
144
- var enumTagLength = text.charCodeAt(++offset) - 1;
145
- var enumTag = text.slice(++offset, offset += enumTagLength);
146
- offset--;
147
- var valueCount = text.charCodeAt(++offset) - 1;
152
+ // read tag length, go up 1
153
+ var enumTagLength = data[offset++];
154
+ // up 1 so read offset -> offset += tag length, to add tag length and skip over it
155
+ var enumTag = (0, BufferUtil_1.as8String)(data.slice(offset, offset += enumTagLength));
156
+ // read amount of values
157
+ var valueCount = data[offset++];
148
158
  var values = [];
149
159
  for (var j = 0; j < valueCount; j++) {
150
- var valueLength = text.charCodeAt(++offset) - 1;
151
- var valueType = text.charCodeAt(++offset) - 1;
152
- var value = text.slice(++offset, offset += valueLength);
153
- offset--;
160
+ // read the length of the value, go up 1
161
+ var valueLength = data[offset++];
162
+ // then read the type of value, up 1
163
+ var valueType = data[offset++];
164
+ // now can just read the values, increase offset for later use
165
+ var value = (0, BufferUtil_1.as8String)(data.slice(offset, offset += valueLength));
166
+ // process it
154
167
  values.push(EnumType_1.TYPE_CONVERSION_MAP[valueType](value));
155
168
  }
169
+ // define the enum with the values
156
170
  enums.push((0, EnumHandler_1.DefineEnum)(enumTag, values));
157
171
  }
158
- var size = text.charCodeAt(++offset) - 2;
172
+ // read type count; prob should change sometime
173
+ var size = data[offset++] - 1;
159
174
  // objects
160
- // the single packet is STX so STX - 2 = -1
175
+ // single packet is 0, 0 - 1 = -1
161
176
  if (size != -1) {
162
- // ETX for true, STX for false
163
- var autoFlatten = text[++offset] == CodePointUtil_1.ETX;
164
- // delimiting size for huge packets
165
- var packetDelimitSize = text.charCodeAt(++offset) - 1;
166
- var areaSize = size * packetDelimitSize;
167
- var dcStart = ++offset; // data maxes section start
168
- var dcEnd = dcStart + areaSize; // data maxes section end
169
- var dmStart = dcEnd; // data mins section start
170
- var dmEnd = dmStart + areaSize; // data mins section end
171
- var tStart = dmEnd; // types section start
172
- var tEnd = tStart + size; // types section end
173
- var tagStart_1 = tEnd + 1; // tag string starts after tag length byte
174
- var dataMaxes = this.processINT_Ds(text.substring(dcStart, dcEnd), packetDelimitSize);
175
- var dataMins = this.processINT_Ds(text.substring(dmStart, dmEnd), packetDelimitSize);
176
- var types = (0, CodePointUtil_1.processCharCodes)(text.substring(tStart, tEnd)).map(function (x) { return x - 1; });
177
+ // 1 for true, 0 for false
178
+ var autoFlatten = data[offset++] == 1;
179
+ // read var ints for the datamaxes
180
+ var _a = this.readVarInts(data, offset, size), dataMaxes = _a[0], o1_1 = _a[1];
181
+ offset = o1_1;
182
+ // read var ints for the datamins
183
+ var _b = this.readVarInts(data, offset, size), dataMins = _b[0], o2_1 = _b[1];
184
+ offset = o2_1;
185
+ // get types, skip past size since there'll be size of these
186
+ var types = Array.from(data.slice(offset, offset += size));
187
+ // convert any enums into their indexed form for best bandwidth
177
188
  var index_1 = 0;
178
189
  var finalTypes = types.map(function (x) { return x == PacketType_1.PacketType.ENUMS ? enums[index_1++] : x; }); // convert enums to their enum packages
179
- var tagLength_1 = text.charCodeAt(tagStart_1 - 1) - 1; // tag length is right behind tag, subtracting 1 to reverse
180
- var tag_1 = text.substring(tagStart_1, tagStart_1 + tagLength_1); // tag is tag length long. yeah
190
+ // make schema
191
+ var schema_1 = PacketSchema.object(finalTypes, dataMaxes, dataMins, dontSpread, autoFlatten, dataBatching, maxBatchSize, -1);
181
192
  return [
182
- new Packet(tag_1, PacketSchema.object(finalTypes, dataMaxes, dataMins, dontSpread, autoFlatten, packetDelimitSize, dataBatching, maxBatchSize, rateLimit), null, client),
183
- (offset - beginningOffset) + 1 + areaSize + areaSize + size + tagLength_1,
193
+ new Packet(tag, schema_1, null, false, client),
194
+ // +1 to go next
195
+ (offset - beginningOffset) + 1,
184
196
  ];
185
197
  }
186
- // single packet; subtracting 1 to revere.
187
- var dataMax = text.charCodeAt(++offset) - 1;
188
- var dataMin = text.charCodeAt(++offset) - 1;
189
- var type = (text.charCodeAt(++offset) - 1);
198
+ // single packet
199
+ // read varint for datamax
200
+ var _c = (0, CompressionUtil_1.readVarInt)(data, offset, false), o1 = _c[0], dataMax = _c[1];
201
+ offset = o1;
202
+ // read varint for datamin
203
+ var _d = (0, CompressionUtil_1.readVarInt)(data, offset, false), o2 = _d[0], dataMin = _d[1];
204
+ offset = o2;
205
+ // read type, no more so no +1
206
+ var type = data[offset];
207
+ // do enum stuff
190
208
  var finalType = type == PacketType_1.PacketType.ENUMS ? enums[0] : type; // convert enum to enum package
191
- var tagStart = ++offset;
192
- var tagLength = text.charCodeAt(tagStart) - 1;
193
- var tag = text.substring(tagStart + 1, tagStart + 1 + tagLength);
209
+ // make schema
210
+ var schema = PacketSchema.single(finalType, dataMax, dataMin, dontSpread, dataBatching, maxBatchSize, -1);
194
211
  return [
195
- new Packet(tag, PacketSchema.single(finalType, dataMax, dataMin, dontSpread, dataBatching, maxBatchSize, rateLimit), null, client),
196
- (offset - beginningOffset) + 1 + tagLength
212
+ new Packet(tag, schema, null, false, client),
213
+ // +1 to go next
214
+ (offset - beginningOffset) + 1,
197
215
  ];
198
216
  };
199
- Packet.deserializeAll = function (text, client) {
217
+ Packet.deserializeAll = function (data, client) {
200
218
  var arr = [];
201
219
  var offset = 0;
202
- while (offset < text.length) {
203
- var _a = this.deserialize(text, offset, client), packet = _a[0], len = _a[1];
220
+ while (offset < data.length) {
221
+ var _a = this.deserialize(data, offset, client), packet = _a[0], len = _a[1];
204
222
  arr.push(packet);
205
223
  offset += len;
206
224
  }
@@ -217,7 +235,6 @@ var PacketSchema = /** @class */ (function () {
217
235
  this.type = PacketType_1.PacketType.NONE;
218
236
  this.dataMax = -1;
219
237
  this.dataMin = -1;
220
- this.packetDelimitSize = 1;
221
238
  this.dataBatching = 0;
222
239
  this.maxBatchSize = 10;
223
240
  this.rateLimit = 0;
@@ -230,6 +247,8 @@ var PacketSchema = /** @class */ (function () {
230
247
  var schema = new PacketSchema(false);
231
248
  if (typeof type == 'number') {
232
249
  schema.type = type;
250
+ if (type == PacketType_1.PacketType.NONE)
251
+ dataMax = dataMin = 0; // remove garbage data issues
233
252
  }
234
253
  else {
235
254
  schema.type = PacketType_1.PacketType.ENUMS;
@@ -243,7 +262,7 @@ var PacketSchema = /** @class */ (function () {
243
262
  schema.rateLimit = rateLimit;
244
263
  return schema;
245
264
  };
246
- PacketSchema.object = function (types, dataMaxes, dataMins, dontSpread, autoFlatten, packetDelimitSize, dataBatching, maxBatchSize, rateLimit) {
265
+ PacketSchema.object = function (types, dataMaxes, dataMins, dontSpread, autoFlatten, dataBatching, maxBatchSize, rateLimit) {
247
266
  if (types.length != dataMaxes.length || types.length != dataMins.length)
248
267
  throw new Error("There is an inbalance between the amount of types, data maxes, and data mins!");
249
268
  var schema = new PacketSchema(true);
@@ -260,7 +279,6 @@ var PacketSchema = /** @class */ (function () {
260
279
  schema.dataMins = dataMins;
261
280
  schema.dontSpread = dontSpread;
262
281
  schema.autoFlatten = autoFlatten;
263
- schema.packetDelimitSize = packetDelimitSize;
264
282
  schema.dataBatching = dataBatching;
265
283
  schema.maxBatchSize = maxBatchSize;
266
284
  schema.rateLimit = rateLimit;
@@ -1,25 +1,25 @@
1
1
  import * as WS from 'ws';
2
2
  import { SonicWSServer } from './SonicWSServer';
3
3
  import { Packet } from '../packets/Packets';
4
- export declare class SonicWSConnection {
4
+ import { Connection } from '../Connection';
5
+ export declare class SonicWSConnection implements Connection {
5
6
  /** Raw 'ws' library socket */
6
7
  socket: WS.WebSocket;
7
8
  private host;
8
9
  private listeners;
9
10
  private print;
10
- private timers;
11
11
  private handshakePacket;
12
12
  private handshakeLambda;
13
13
  private messageLambda;
14
14
  private handshakedMessageLambda;
15
15
  private batcher;
16
16
  private rater;
17
+ private enabledPackets;
17
18
  /** If the packet handshake has been completed; `wss.requireHandshake(packet)` */
18
19
  handshakeComplete: boolean;
19
20
  /** The index of the connection; unique for all connected, recycles old disconnected ids. Should be safe for INTS_C unless you have more than 27,647 connected at once. */
20
21
  id: number;
21
- /** The indexed character of the connection. Smaller data packet in strings. */
22
- code: string;
22
+ timers: Record<number, number>;
23
23
  constructor(socket: WS.WebSocket, host: SonicWSServer, id: number, handshakePacket: string | null, clientRateLimit: number, serverRateLimit: number);
24
24
  private parseData;
25
25
  private handshakeHandler;
@@ -28,7 +28,17 @@ export declare class SonicWSConnection {
28
28
  private messageHandler;
29
29
  private hideNewLines;
30
30
  /** Sends raw data to the user; will likely fail validity checks if used externally */
31
- raw_send(data: string): void;
31
+ raw_send(data: Uint8Array): void;
32
+ /**
33
+ * Enables a packet for the client.
34
+ * @param tag The tag of the packet
35
+ */
36
+ enablePacket(tag: string): void;
37
+ /**
38
+ * Disables a packet for the client.
39
+ * @param tag The tag of the packet
40
+ */
41
+ disablePacket(tag: string): void;
32
42
  /**
33
43
  * Checks if the connection is closed
34
44
  * @returns If it's closed or not
@@ -48,7 +58,7 @@ export declare class SonicWSConnection {
48
58
  /**
49
59
  * For internal use.
50
60
  */
51
- send_processed(code: string, data: string, packet: Packet): void;
61
+ send_processed(code: number, data: number[], packet: Packet): void;
52
62
  /**
53
63
  * Sends a packet with the tag and values
54
64
  * @param tag The tag to send
@@ -72,19 +82,31 @@ export declare class SonicWSConnection {
72
82
  */
73
83
  togglePrint(): void;
74
84
  /**
75
- * Closes the socket
85
+ * Closes the connection
76
86
  */
77
- close(code?: number): void;
87
+ close(code?: number, reason?: string): void;
78
88
  /**
79
89
  * Sets a timeout that will automatically end when the socket closes
80
90
  * @param call The function to call
81
91
  * @param time The time between now and the call (ms)
92
+ * @returns The timeout id to be used with socket.clearInterval(id)
82
93
  */
83
94
  setTimeout(call: () => void, time: number): number;
84
95
  /**
85
96
  * Sets an interval that will automatically end when the socket closes
86
97
  * @param call The function to call
87
98
  * @param time The time between calls (ms)
99
+ * @returns The interval id to be used with socket.clearInterval(id)
88
100
  */
89
101
  setInterval(call: () => void, time: number): number;
102
+ /**
103
+ * Clears a timeout
104
+ * @param id The timeout id
105
+ */
106
+ clearTimeout(id: number): void;
107
+ /**
108
+ * Clears an interval
109
+ * @param id The interval id
110
+ */
111
+ clearInterval(id: number): void;
90
112
  }