mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-10-15 20:16:02 +00:00
test[typescript]: ts protocol test
This commit is contained in:
1 parent
231f010270
commit
52b2bfbd82
11 files changed
+129
-46
No files matched your search
@@ -0,0 +1,11 @@
|
|||||||
|
import IByteBuffer from "./IByteBuffer";
|
||||||
|
|
||||||
|
interface IProtocolRegistration<T> {
|
||||||
|
protocolId(): number;
|
||||||
|
|
||||||
|
write(buffer: IByteBuffer, packet: T | null): void;
|
||||||
|
|
||||||
|
read(buffer: IByteBuffer): T | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default IProtocolRegistration;
|
||||||
@@ -1,34 +1,58 @@
|
|||||||
import EmptyObject from './packet/EmptyObject';
|
import EmptyObject from './packet/EmptyObject';
|
||||||
|
import { EmptyObjectRegistration } from './packet/EmptyObject';
|
||||||
import VeryBigObject from './packet/VeryBigObject';
|
import VeryBigObject from './packet/VeryBigObject';
|
||||||
|
import { VeryBigObjectRegistration } from './packet/VeryBigObject';
|
||||||
import ComplexObject from './packet/ComplexObject';
|
import ComplexObject from './packet/ComplexObject';
|
||||||
|
import { ComplexObjectRegistration } from './packet/ComplexObject';
|
||||||
import NormalObject from './packet/NormalObject';
|
import NormalObject from './packet/NormalObject';
|
||||||
|
import { NormalObjectRegistration } from './packet/NormalObject';
|
||||||
import ObjectA from './packet/ObjectA';
|
import ObjectA from './packet/ObjectA';
|
||||||
|
import { ObjectARegistration } from './packet/ObjectA';
|
||||||
import ObjectB from './packet/ObjectB';
|
import ObjectB from './packet/ObjectB';
|
||||||
|
import { ObjectBRegistration } from './packet/ObjectB';
|
||||||
import SimpleObject from './packet/SimpleObject';
|
import SimpleObject from './packet/SimpleObject';
|
||||||
|
import { SimpleObjectRegistration } from './packet/SimpleObject';
|
||||||
import IByteBuffer from "./IByteBuffer";
|
import IByteBuffer from "./IByteBuffer";
|
||||||
|
import IProtocolRegistration from "./IProtocolRegistration";
|
||||||
|
|
||||||
const protocols = new Map<number, any>();
|
const protocols = new Map<number, IProtocolRegistration<unknown>>();
|
||||||
|
const protocolIdMap = new Map<any, number>();
|
||||||
|
|
||||||
// initProtocol
|
// initProtocol
|
||||||
protocols.set(0, EmptyObject);
|
protocols.set(0, new EmptyObjectRegistration());
|
||||||
protocols.set(1, VeryBigObject);
|
protocolIdMap.set(EmptyObject, 0);
|
||||||
protocols.set(100, ComplexObject);
|
protocols.set(1, new VeryBigObjectRegistration());
|
||||||
protocols.set(101, NormalObject);
|
protocolIdMap.set(VeryBigObject, 1);
|
||||||
protocols.set(102, ObjectA);
|
protocols.set(100, new ComplexObjectRegistration());
|
||||||
protocols.set(103, ObjectB);
|
protocolIdMap.set(ComplexObject, 100);
|
||||||
protocols.set(104, SimpleObject);
|
protocols.set(101, new NormalObjectRegistration());
|
||||||
|
protocolIdMap.set(NormalObject, 101);
|
||||||
|
protocols.set(102, new ObjectARegistration());
|
||||||
|
protocolIdMap.set(ObjectA, 102);
|
||||||
|
protocols.set(103, new ObjectBRegistration());
|
||||||
|
protocolIdMap.set(ObjectB, 103);
|
||||||
|
protocols.set(104, new SimpleObjectRegistration());
|
||||||
|
protocolIdMap.set(SimpleObject, 104);
|
||||||
|
|
||||||
class ProtocolManager {
|
class ProtocolManager {
|
||||||
static getProtocol(protocolId: number): any {
|
static getProtocolId(clazz: any): number {
|
||||||
|
const protocolId = protocolIdMap.get(clazz);
|
||||||
|
if (protocolId === null || protocolId === undefined) {
|
||||||
|
throw '[protocol:' + clazz + '] not exist';
|
||||||
|
}
|
||||||
|
return protocolId;
|
||||||
|
}
|
||||||
|
|
||||||
|
static getProtocol(protocolId: number): IProtocolRegistration<unknown> {
|
||||||
const protocol = protocols.get(protocolId);
|
const protocol = protocols.get(protocolId);
|
||||||
if (protocol === null) {
|
if (protocol === null || protocol === undefined) {
|
||||||
throw '[protocolId:' + protocolId + '] not exist';
|
throw '[protocolId:' + protocolId + '] not exist';
|
||||||
}
|
}
|
||||||
return protocol;
|
return protocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: any): void {
|
static write(buffer: IByteBuffer, packet: any): void {
|
||||||
const protocolId = packet.protocolId();
|
const protocolId = ProtocolManager.getProtocolId(packet.constructor);
|
||||||
buffer.writeShort(protocolId);
|
buffer.writeShort(protocolId);
|
||||||
const protocol = ProtocolManager.getProtocol(protocolId);
|
const protocol = ProtocolManager.getProtocol(protocolId);
|
||||||
protocol.write(buffer, packet);
|
protocol.write(buffer, packet);
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ const util = require('util');
|
|||||||
const encoder = new util.TextEncoder('utf-8');
|
const encoder = new util.TextEncoder('utf-8');
|
||||||
const decoder = new util.TextDecoder('utf-8');
|
const decoder = new util.TextDecoder('utf-8');
|
||||||
|
|
||||||
|
// 现在所有主流浏览器都支持TextDecoder,只有微信小程序不支持TextDecoder(微信浏览器也支持,微信的小程序和浏览器不是同一个js环境)
|
||||||
|
// https://developers.weixin.qq.com/community/develop/doc/000ca85023ce78c8484e0d1d256400
|
||||||
|
// 如果在微信小程序中使用,需要按照上面的链接全局引入TextEncoder相关依赖
|
||||||
|
|
||||||
// 在js中long可以支持的最大值
|
// 在js中long可以支持的最大值
|
||||||
// const maxLong = 9007199254740992;
|
// const maxLong = 9007199254740992;
|
||||||
// const minLong = -9007199254740992;
|
// const minLong = -9007199254740992;
|
||||||
|
|||||||
@@ -12,6 +12,35 @@ type WasmExports = {
|
|||||||
|
|
||||||
let wasm: WasmExports;
|
let wasm: WasmExports;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// nodejs环境无法使用
|
||||||
|
// wasm = new WebAssembly.Instance(
|
||||||
|
// new WebAssembly.Module(
|
||||||
|
// new Uint8Array([
|
||||||
|
// 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127,
|
||||||
|
// 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11,
|
||||||
|
// 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5,
|
||||||
|
// 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114,
|
||||||
|
// 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0,
|
||||||
|
// 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173,
|
||||||
|
// 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4,
|
||||||
|
// 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32,
|
||||||
|
// 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127,
|
||||||
|
// 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0,
|
||||||
|
// 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134,
|
||||||
|
// 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126,
|
||||||
|
// 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66,
|
||||||
|
// 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36,
|
||||||
|
// 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3,
|
||||||
|
// 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167,
|
||||||
|
// 11,
|
||||||
|
// ])
|
||||||
|
// ),
|
||||||
|
// {}
|
||||||
|
// ).exports as WasmExports;
|
||||||
|
} catch {
|
||||||
|
// no wasm support
|
||||||
|
}
|
||||||
|
|
||||||
export class Long {
|
export class Long {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
import ObjectA from './ObjectA';
|
import ObjectA from './ObjectA';
|
||||||
|
|
||||||
// 复杂的对象,包括了各种复杂的结构,数组,List,Set,Map
|
// 复杂的对象,包括了各种复杂的结构,数组,List,Set,Map
|
||||||
class ComplexObject {
|
class ComplexObject {
|
||||||
// byte类型,最简单的整形
|
// byte类型,最简单的整形
|
||||||
@@ -55,14 +57,14 @@ class ComplexObject {
|
|||||||
// 如果要修改协议并且兼容老协议,需要加上Compatible注解,保持Compatible注解的value自增
|
// 如果要修改协议并且兼容老协议,需要加上Compatible注解,保持Compatible注解的value自增
|
||||||
myCompatible: number = 0;
|
myCompatible: number = 0;
|
||||||
myObject: ObjectA | null = null;
|
myObject: ObjectA | null = null;
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 100;
|
export class ComplexObjectRegistration implements IProtocolRegistration<ComplexObject> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return ComplexObject.PROTOCOL_ID;
|
return 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: ComplexObject | null) {
|
write(buffer: IByteBuffer, packet: ComplexObject | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -236,7 +238,7 @@ class ComplexObject {
|
|||||||
buffer.adjustPadding(36962, beforeWriteIndex);
|
buffer.adjustPadding(36962, beforeWriteIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): ComplexObject | null {
|
read(buffer: IByteBuffer): ComplexObject | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
|
|
||||||
|
|
||||||
class EmptyObject {
|
class EmptyObject {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 0;
|
export class EmptyObjectRegistration implements IProtocolRegistration<EmptyObject> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return EmptyObject.PROTOCOL_ID;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: EmptyObject | null) {
|
write(buffer: IByteBuffer, packet: EmptyObject | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -17,7 +19,7 @@ class EmptyObject {
|
|||||||
buffer.writeInt(-1);
|
buffer.writeInt(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): EmptyObject | null {
|
read(buffer: IByteBuffer): EmptyObject | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
import ObjectA from './ObjectA';
|
import ObjectA from './ObjectA';
|
||||||
|
|
||||||
|
// 常规的对象,取所有语言语法的交集,基本上所有语言都支持下面的语法
|
||||||
class NormalObject {
|
class NormalObject {
|
||||||
a: number = 0;
|
a: number = 0;
|
||||||
aaa: Array<number> = [];
|
aaa: Array<number> = [];
|
||||||
b: number = 0;
|
b: number = 0;
|
||||||
|
// 整数类型
|
||||||
c: number = 0;
|
c: number = 0;
|
||||||
d: number = 0;
|
d: number = 0;
|
||||||
e: number = 0;
|
e: number = 0;
|
||||||
@@ -22,14 +25,14 @@ class NormalObject {
|
|||||||
ssss: Set<string> = new Set();
|
ssss: Set<string> = new Set();
|
||||||
outCompatibleValue: number = 0;
|
outCompatibleValue: number = 0;
|
||||||
outCompatibleValue2: number = 0;
|
outCompatibleValue2: number = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 101;
|
export class NormalObjectRegistration implements IProtocolRegistration<NormalObject> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return NormalObject.PROTOCOL_ID;
|
return 101;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: NormalObject | null) {
|
write(buffer: IByteBuffer, packet: NormalObject | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -59,7 +62,7 @@ class NormalObject {
|
|||||||
buffer.adjustPadding(857, beforeWriteIndex);
|
buffer.adjustPadding(857, beforeWriteIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): NormalObject | null {
|
read(buffer: IByteBuffer): NormalObject | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
import ObjectB from './ObjectB';
|
import ObjectB from './ObjectB';
|
||||||
|
|
||||||
|
|
||||||
class ObjectA {
|
class ObjectA {
|
||||||
a: number = 0;
|
a: number = 0;
|
||||||
m: Map<number, string> = new Map();
|
m: Map<number, string> = new Map();
|
||||||
objectB: ObjectB | null = null;
|
objectB: ObjectB | null = null;
|
||||||
innerCompatibleValue: number = 0;
|
innerCompatibleValue: number = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 102;
|
export class ObjectARegistration implements IProtocolRegistration<ObjectA> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return ObjectA.PROTOCOL_ID;
|
return 102;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: ObjectA | null) {
|
write(buffer: IByteBuffer, packet: ObjectA | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -27,7 +29,7 @@ class ObjectA {
|
|||||||
buffer.adjustPadding(201, beforeWriteIndex);
|
buffer.adjustPadding(201, beforeWriteIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): ObjectA | null {
|
read(buffer: IByteBuffer): ObjectA | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
|
|
||||||
|
|
||||||
class ObjectB {
|
class ObjectB {
|
||||||
flag: boolean = false;
|
flag: boolean = false;
|
||||||
innerCompatibleValue: number = 0;
|
innerCompatibleValue: number = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 103;
|
export class ObjectBRegistration implements IProtocolRegistration<ObjectB> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return ObjectB.PROTOCOL_ID;
|
return 103;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: ObjectB | null) {
|
write(buffer: IByteBuffer, packet: ObjectB | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -22,7 +24,7 @@ class ObjectB {
|
|||||||
buffer.adjustPadding(4, beforeWriteIndex);
|
buffer.adjustPadding(4, beforeWriteIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): ObjectB | null {
|
read(buffer: IByteBuffer): ObjectB | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
|
|
||||||
|
|
||||||
class SimpleObject {
|
class SimpleObject {
|
||||||
c: number = 0;
|
c: number = 0;
|
||||||
g: boolean = false;
|
g: boolean = false;
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 104;
|
export class SimpleObjectRegistration implements IProtocolRegistration<SimpleObject> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return SimpleObject.PROTOCOL_ID;
|
return 104;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: SimpleObject | null) {
|
write(buffer: IByteBuffer, packet: SimpleObject | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -20,7 +22,7 @@ class SimpleObject {
|
|||||||
buffer.writeBoolean(packet.g);
|
buffer.writeBoolean(packet.g);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): SimpleObject | null {
|
read(buffer: IByteBuffer): SimpleObject | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import IByteBuffer from '../IByteBuffer';
|
import IByteBuffer from '../IByteBuffer';
|
||||||
|
import IProtocolRegistration from '../IProtocolRegistration';
|
||||||
import ObjectA from './ObjectA';
|
import ObjectA from './ObjectA';
|
||||||
|
|
||||||
|
|
||||||
class VeryBigObject {
|
class VeryBigObject {
|
||||||
a1: number = 0;
|
a1: number = 0;
|
||||||
aa1: number = 0;
|
aa1: number = 0;
|
||||||
@@ -3346,14 +3348,14 @@ class VeryBigObject {
|
|||||||
mm88: Map<number, ObjectA> = new Map();
|
mm88: Map<number, ObjectA> = new Map();
|
||||||
s88: Set<number> = new Set();
|
s88: Set<number> = new Set();
|
||||||
ssss88: Set<string> = new Set();
|
ssss88: Set<string> = new Set();
|
||||||
|
}
|
||||||
|
|
||||||
static PROTOCOL_ID: number = 1;
|
export class VeryBigObjectRegistration implements IProtocolRegistration<VeryBigObject> {
|
||||||
|
|
||||||
protocolId(): number {
|
protocolId(): number {
|
||||||
return VeryBigObject.PROTOCOL_ID;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static write(buffer: IByteBuffer, packet: VeryBigObject | null) {
|
write(buffer: IByteBuffer, packet: VeryBigObject | null) {
|
||||||
if (packet === null) {
|
if (packet === null) {
|
||||||
buffer.writeInt(0);
|
buffer.writeInt(0);
|
||||||
return;
|
return;
|
||||||
@@ -6705,7 +6707,7 @@ class VeryBigObject {
|
|||||||
buffer.writeStringSet(packet.ssss9);
|
buffer.writeStringSet(packet.ssss9);
|
||||||
}
|
}
|
||||||
|
|
||||||
static read(buffer: IByteBuffer): VeryBigObject | null {
|
read(buffer: IByteBuffer): VeryBigObject | null {
|
||||||
const length = buffer.readInt();
|
const length = buffer.readInt();
|
||||||
if (length === 0) {
|
if (length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in new issue
Block a user