perf[protocol]: 支持TypeScript

This commit is contained in:
jaysunxiao
2022-06-05 22:40:47 +08:00
parent fbba746574
commit 1883cc4f97
32 changed files with 2454 additions and 12 deletions
@@ -23,6 +23,7 @@ import com.zfoo.protocol.serializer.gdscript.GenerateGdUtils;
import com.zfoo.protocol.serializer.javascript.GenerateJsUtils;
import com.zfoo.protocol.serializer.lua.GenerateLuaUtils;
import com.zfoo.protocol.serializer.protobuf.GenerateProtobufUtils;
import com.zfoo.protocol.serializer.typescript.GenerateTsUtils;
import java.io.IOException;
import java.util.Arrays;
@@ -124,6 +125,15 @@ public abstract class GenerateProtocolFile {
GenerateJsUtils.createProtocolManager(allSortedGenerateProtocols);
}
// 生成TypeScript协议
if (generateLanguages.contains(CodeLanguage.TypeScript)) {
GenerateTsUtils.init(generateOperation);
for (var protocolRegistration : allSortedGenerateProtocols) {
GenerateTsUtils.createTsProtocolFile((ProtocolRegistration) protocolRegistration);
}
GenerateTsUtils.createProtocolManager(allSortedGenerateProtocols);
}
// 生成Lua协议
if (generateLanguages.contains(CodeLanguage.Lua)) {
GenerateLuaUtils.init(generateOperation);
@@ -27,6 +27,8 @@ public enum CodeLanguage {
JavaScript,
TypeScript,
Lua,
CSharp,
@@ -62,6 +62,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeBooleanArray({});", objectStr)).append(LS);
break;
default:
@@ -84,6 +85,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeBooleanArray({});", objectStr)).append(LS);
break;
default:
@@ -106,6 +108,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeByteArray({});", objectStr)).append(LS);
break;
default:
@@ -128,6 +131,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeByteArray({});", objectStr)).append(LS);
break;
default:
@@ -150,6 +154,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeShortArray({});", objectStr)).append(LS);
break;
default:
@@ -172,6 +177,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeShortArray({});", objectStr)).append(LS);
break;
default:
@@ -194,6 +200,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntArray({});", objectStr)).append(LS);
break;
default:
@@ -216,6 +223,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntArray({});", objectStr)).append(LS);
break;
default:
@@ -238,6 +246,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongArray({});", objectStr)).append(LS);
break;
default:
@@ -260,6 +269,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongArray({});", objectStr)).append(LS);
break;
default:
@@ -282,6 +292,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeFloatArray({});", objectStr)).append(LS);
break;
default:
@@ -304,6 +315,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeFloatArray({});", objectStr)).append(LS);
break;
default:
@@ -326,6 +338,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeDoubleArray({});", objectStr)).append(LS);
break;
default:
@@ -348,6 +361,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeDoubleArray({});", objectStr)).append(LS);
break;
default:
@@ -370,6 +384,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringArray({});", objectStr)).append(LS);
break;
default:
@@ -392,6 +407,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeCharArray({});", objectStr)).append(LS);
break;
default:
@@ -414,6 +430,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeCharArray({});", objectStr)).append(LS);
break;
default:
@@ -440,6 +457,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("buffer.writePacketArray<{}>({}, {});", EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), objectStr, protocolId)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writePacketArray({}, {});", objectStr, protocolId)).append(LS);
break;
default:
@@ -480,6 +498,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readBooleanArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readBooleanArray();", array)).append(LS);
break;
default:
@@ -504,6 +523,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readBooleanArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readBooleanArray();", array)).append(LS);
break;
default:
@@ -528,6 +548,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readByteArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readByteArray();", array)).append(LS);
break;
default:
@@ -552,6 +573,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readByteArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readByteArray();", array)).append(LS);
break;
default:
@@ -576,6 +598,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readShortArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readShortArray();", array)).append(LS);
break;
default:
@@ -600,6 +623,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readShortArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readShortArray();", array)).append(LS);
break;
default:
@@ -624,6 +648,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntArray();", array)).append(LS);
break;
default:
@@ -648,6 +673,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntArray();", array)).append(LS);
break;
default:
@@ -672,6 +698,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongArray();", array)).append(LS);
break;
default:
@@ -696,6 +723,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongArray();", array)).append(LS);
break;
default:
@@ -720,6 +748,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readFloatArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readFloatArray();", array)).append(LS);
break;
default:
@@ -744,6 +773,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readFloatArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readFloatArray();", array)).append(LS);
break;
default:
@@ -768,6 +798,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readDoubleArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readDoubleArray();", array)).append(LS);
break;
default:
@@ -792,6 +823,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readDoubleArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readDoubleArray();", array)).append(LS);
break;
default:
@@ -816,6 +848,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringArray();", array)).append(LS);
break;
default:
@@ -840,6 +873,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readCharArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readCharArray();", array)).append(LS);
break;
default:
@@ -864,6 +898,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readCharArray();", array)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readCharArray();", array)).append(LS);
break;
default:
@@ -888,6 +923,7 @@ public class CutDownArraySerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readPacketArray<{}>({});", array, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readPacketArray({});", array, protocolId)).append(LS);
break;
default:
@@ -61,6 +61,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeBooleanList({});", objectStr)).append(LS);
break;
default:
@@ -83,6 +84,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeByteList({});", objectStr)).append(LS);
break;
default:
@@ -105,6 +107,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeShortList({});", objectStr)).append(LS);
break;
default:
@@ -127,6 +130,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntList({});", objectStr)).append(LS);
break;
default:
@@ -149,6 +153,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongList({});", objectStr)).append(LS);
break;
default:
@@ -172,6 +177,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeFloatList({});", objectStr)).append(LS);
break;
default:
@@ -195,6 +201,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeDoubleList({});", objectStr)).append(LS);
break;
default:
@@ -218,6 +225,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringList({});", objectStr)).append(LS);
break;
default:
@@ -243,6 +251,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writePacketList({}, {});", objectStr, protocolId)).append(LS);
break;
default:
@@ -282,6 +291,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readBooleanList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readBooleanList();", list)).append(LS);
break;
default:
@@ -306,6 +316,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readByteList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readByteList();", list)).append(LS);
break;
default:
@@ -330,6 +341,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readShortList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readShortList();", list)).append(LS);
break;
default:
@@ -354,6 +366,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntList();", list)).append(LS);
break;
default:
@@ -378,6 +391,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongList();", list)).append(LS);
break;
default:
@@ -402,6 +416,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readFloatList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readFloatList();", list)).append(LS);
break;
default:
@@ -426,6 +441,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readDoubleList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readDoubleList();", list)).append(LS);
break;
default:
@@ -450,6 +466,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringList();", list)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringList();", list)).append(LS);
break;
default:
@@ -476,6 +493,7 @@ public class CutDownListSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readPacketList<{}>({});", list, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readPacketList({});", list, protocolId)).append(LS);
break;
default:
@@ -68,6 +68,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntIntMap({});", objectStr)).append(LS);
return true;
}
@@ -87,6 +88,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntLongMap({});", objectStr)).append(LS);
return true;
}
@@ -99,6 +101,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("buffer.writeIntStringMap({});", objectStr)).append(LS);
return true;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntStringMap({});", objectStr)).append(LS);
return true;
case GdScript:
@@ -127,6 +130,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntPacketMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS);
return true;
}
@@ -148,6 +152,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongIntMap({});", objectStr)).append(LS);
return true;
}
@@ -167,6 +172,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongLongMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS);
return true;
}
@@ -186,6 +192,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongStringMap({});", objectStr)).append(LS);
return true;
}
@@ -205,6 +212,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongPacketMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS);
return true;
}
@@ -226,6 +234,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringIntMap({});", objectStr)).append(LS);
return true;
}
@@ -245,6 +254,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringLongMap({});", objectStr)).append(LS);
return true;
}
@@ -264,6 +274,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringStringMap({});", objectStr)).append(LS);
return true;
}
@@ -283,6 +294,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
return true;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringPacketMap({}, {});", objectStr, ((ObjectProtocolField) valueRegistration).getProtocolId())).append(LS);
return true;
}
@@ -322,6 +334,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntIntMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntIntMap();", map)).append(LS);
return map;
}
@@ -343,6 +356,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntLongMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntLongMap();", map)).append(LS);
return map;
}
@@ -364,6 +378,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntStringMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntStringMap();", map)).append(LS);
return map;
}
@@ -386,6 +401,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntPacketMap<{}>({});", map, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntPacketMap({});", map, protocolId)).append(LS);
return map;
}
@@ -409,6 +425,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongIntMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongIntMap();", map)).append(LS);
return map;
}
@@ -430,6 +447,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongLongMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongLongMap();", map)).append(LS);
return map;
}
@@ -451,6 +469,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongStringMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongStringMap();", map)).append(LS);
return map;
}
@@ -473,6 +492,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongPacketMap<{}>({});", map, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongPacketMap({});", map, protocolId)).append(LS);
return map;
}
@@ -496,6 +516,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringIntMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringIntMap();", map)).append(LS);
return map;
}
@@ -517,6 +538,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringLongMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringLongMap();", map)).append(LS);
return map;
}
@@ -538,6 +560,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringStringMap();", map)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringStringMap();", map)).append(LS);
return map;
}
@@ -560,6 +583,7 @@ public class CutDownMapSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringPacketMap<{}>({});", map, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS);
return map;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringPacketMap({});", map, protocolId)).append(LS);
return map;
}
@@ -62,6 +62,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeBooleanSet({});", objectStr)).append(LS);
break;
default:
@@ -84,6 +85,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeByteSet({});", objectStr)).append(LS);
break;
default:
@@ -106,6 +108,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeShortSet({});", objectStr)).append(LS);
break;
default:
@@ -128,6 +131,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeIntSet({});", objectStr)).append(LS);
break;
default:
@@ -150,6 +154,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeLongSet({});", objectStr)).append(LS);
break;
default:
@@ -172,6 +177,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeFloatSet({});", objectStr)).append(LS);
break;
default:
@@ -194,6 +200,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeDoubleSet({});", objectStr)).append(LS);
break;
default:
@@ -216,6 +223,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writeStringSet({});", objectStr)).append(LS);
break;
default:
@@ -241,6 +249,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
break;
case Cpp:
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("buffer.writePacketSet({}, {});", objectStr, protocolId)).append(LS);
break;
default:
@@ -280,6 +289,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readBooleanSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readBooleanSet();", set)).append(LS);
break;
default:
@@ -304,6 +314,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readByteSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readByteSet();", set)).append(LS);
break;
default:
@@ -328,6 +339,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readShortSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readShortSet();", set)).append(LS);
break;
default:
@@ -352,6 +364,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readIntSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readIntSet();", set)).append(LS);
break;
default:
@@ -376,6 +389,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readLongSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readLongSet();", set)).append(LS);
break;
default:
@@ -400,6 +414,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readFloatSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readFloatSet();", set)).append(LS);
break;
default:
@@ -424,6 +439,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readDoubleSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readDoubleSet();", set)).append(LS);
break;
default:
@@ -448,6 +464,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readStringSet();", set)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readStringSet();", set)).append(LS);
break;
default:
@@ -474,6 +491,7 @@ public class CutDownSetSerializer implements ICutDownSerializer {
builder.append(StringUtils.format("auto {} = buffer.readPacketSet<{}>({});", set, EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId), protocolId)).append(LS);
break;
case JavaScript:
case TypeScript:
builder.append(StringUtils.format("const {} = buffer.readPacketSet({});", set, protocolId)).append(LS);
break;
default:
@@ -157,7 +157,7 @@ public abstract class GenerateCppUtils {
private static String includeSubProtocol(ProtocolRegistration registration) {
short protocolId = registration.getId();
var protocolId = registration.getId();
var subProtocols = ProtocolAnalysis.getAllSubProtocolIds(protocolId);
if (CollectionUtils.isEmpty(subProtocols)) {
@@ -48,16 +48,7 @@ public abstract class GenerateJsUtils {
private static Map<ISerializer, IJsSerializer> jsSerializerMap;
public static IJsSerializer jsSerializer(ISerializer serializer) {
return jsSerializerMap.get(serializer);
}
public static void init(GenerateOperation generateOperation) {
protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
FileUtils.deleteFile(new File(protocolOutputRootPath));
FileUtils.createDirectory(protocolOutputRootPath);
static {
jsSerializerMap = new HashMap<>();
jsSerializerMap.put(BooleanSerializer.INSTANCE, new JsBooleanSerializer());
jsSerializerMap.put(ByteSerializer.INSTANCE, new JsByteSerializer());
@@ -75,6 +66,17 @@ public abstract class GenerateJsUtils {
jsSerializerMap.put(ObjectProtocolSerializer.INSTANCE, new JsObjectProtocolSerializer());
}
public static IJsSerializer jsSerializer(ISerializer serializer) {
return jsSerializerMap.get(serializer);
}
public static void init(GenerateOperation generateOperation) {
protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
FileUtils.deleteFile(new File(protocolOutputRootPath));
FileUtils.createDirectory(protocolOutputRootPath);
}
public static void clear() {
jsSerializerMap = null;
protocolOutputRootPath = null;
@@ -13,6 +13,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import java.lang.reflect.Field;
@@ -23,6 +24,11 @@ import java.lang.reflect.Field;
*/
public interface IJsSerializer {
/**
* 获取属性的类型和名称
*/
Pair<String, String> field(Field field, IFieldRegistration fieldRegistration);
void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration);
String readObject(StringBuilder builder, int deep, Field field, IFieldRegistration fieldRegistration);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.ArrayField;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.serializer.CodeLanguage;
@@ -30,6 +31,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsArraySerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("Array", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsBooleanSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("boolean", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsByteSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("number", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsCharSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("string", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsDoubleSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("number", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsFloatSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("number", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsIntSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("number", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.ListField;
import com.zfoo.protocol.serializer.CodeLanguage;
@@ -30,6 +31,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsListSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("Array", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsLongSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("number", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.MapField;
import com.zfoo.protocol.serializer.CodeLanguage;
@@ -30,6 +31,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsMapSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("Map", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,8 +14,10 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.ObjectProtocolField;
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
import com.zfoo.protocol.util.StringUtils;
import java.lang.reflect.Field;
@@ -28,6 +30,14 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsObjectProtocolSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
var protocolSimpleName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(objectProtocolField.getProtocolId());
var type = StringUtils.format("{}", protocolSimpleName);
return new Pair<>(type, field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
ObjectProtocolField objectProtocolField = (ObjectProtocolField) fieldRegistration;
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.registration.field.SetField;
import com.zfoo.protocol.serializer.CodeLanguage;
@@ -30,6 +31,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsSetSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("Set", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsShortSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("number", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -14,6 +14,7 @@
package com.zfoo.protocol.serializer.javascript;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.field.IFieldRegistration;
import com.zfoo.protocol.util.StringUtils;
@@ -27,6 +28,11 @@ import static com.zfoo.protocol.util.FileUtils.LS;
*/
public class JsStringSerializer implements IJsSerializer {
@Override
public Pair<String, String> field(Field field, IFieldRegistration fieldRegistration) {
return new Pair<>("string", field.getName());
}
@Override
public void writeObject(StringBuilder builder, String objectStr, int deep, Field field, IFieldRegistration fieldRegistration) {
GenerateProtocolFile.addTab(builder, deep);
@@ -0,0 +1,218 @@
/*
* Copyright (C) 2020 The zfoo Authors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and limitations under the License.
*/
package com.zfoo.protocol.serializer.typescript;
import com.zfoo.protocol.collection.CollectionUtils;
import com.zfoo.protocol.generate.GenerateOperation;
import com.zfoo.protocol.generate.GenerateProtocolDocument;
import com.zfoo.protocol.generate.GenerateProtocolFile;
import com.zfoo.protocol.generate.GenerateProtocolPath;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolAnalysis;
import com.zfoo.protocol.registration.ProtocolRegistration;
import com.zfoo.protocol.registration.anno.Compatible;
import com.zfoo.protocol.serializer.enhance.EnhanceObjectProtocolSerializer;
import com.zfoo.protocol.serializer.javascript.*;
import com.zfoo.protocol.serializer.reflect.*;
import com.zfoo.protocol.util.ClassUtils;
import com.zfoo.protocol.util.FileUtils;
import com.zfoo.protocol.util.IOUtils;
import com.zfoo.protocol.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import static com.zfoo.protocol.util.FileUtils.LS;
import static com.zfoo.protocol.util.StringUtils.TAB;
/**
* @author jaysunxiao
* @version 3.0
*/
public abstract class GenerateTsUtils {
private static String protocolOutputRootPath = "tsProtocol/";
public static void init(GenerateOperation generateOperation) {
protocolOutputRootPath = FileUtils.joinPath(generateOperation.getProtocolPath(), protocolOutputRootPath);
FileUtils.deleteFile(new File(protocolOutputRootPath));
FileUtils.createDirectory(protocolOutputRootPath);
}
public static void clear() {
protocolOutputRootPath = null;
}
public static void createProtocolManager(List<IProtocolRegistration> protocolList) throws IOException {
var list = List.of("typescript/buffer/ByteBuffer.ts", "typescript/buffer/long.js", "typescript/buffer/longbits.js");
for (var fileName : list) {
var fileInputStream = ClassUtils.getFileFromClassPath(fileName);
var createFile = new File(StringUtils.format("{}/{}", protocolOutputRootPath, StringUtils.substringAfterFirst(fileName, "typescript/")));
FileUtils.writeInputStreamToFile(createFile, fileInputStream);
}
// 生成ProtocolManager.ts文件
var protocolManagerTemplate = StringUtils.bytesToString(IOUtils.toByteArray(ClassUtils.getFileFromClassPath("typescript/ProtocolManagerTemplate.ts")));
var importBuilder = new StringBuilder();
var initProtocolBuilder = new StringBuilder();
for (var protocol : protocolList) {
var protocolId = protocol.protocolId();
var protocolClassName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(protocolId);
var path = GenerateProtocolPath.getProtocolPath(protocolId);
if (StringUtils.isBlank(path)) {
importBuilder.append(StringUtils.format("import {} from './{}';", protocolClassName, protocolClassName)).append(LS);
} else {
importBuilder.append(StringUtils.format("import {} from './{}/{}';", protocolClassName, path, protocolClassName)).append(LS);
}
initProtocolBuilder.append(StringUtils.format("protocols.set({}, {});", protocolId, protocolClassName)).append(LS);
}
protocolManagerTemplate = StringUtils.format(protocolManagerTemplate, importBuilder.toString().trim(), initProtocolBuilder.toString().trim());
FileUtils.writeStringToFile(new File(StringUtils.format("{}/{}", protocolOutputRootPath, "ProtocolManager.ts")), protocolManagerTemplate);
}
public static void createTsProtocolFile(ProtocolRegistration registration) throws IOException {
// 初始化index
GenerateProtocolFile.index.set(0);
var protocolId = registration.protocolId();
var registrationConstructor = registration.getConstructor();
var protocolClazzName = registrationConstructor.getDeclaringClass().getSimpleName();
var protocolTemplate = StringUtils.bytesToString(IOUtils.toByteArray(ClassUtils.getFileFromClassPath("typescript/ProtocolTemplate.ts")));
var importSubProtocol = importSubProtocol(registration);
var docTitle = docTitle(registration);
var fieldDefinition = fieldDefinition(registration);
var valueOfMethod = valueOfMethod(registration);
var writeObject = writeObject(registration);
var readObject = readObject(registration);
protocolTemplate = StringUtils.format(protocolTemplate, importSubProtocol, docTitle, protocolClazzName, fieldDefinition.trim()
, valueOfMethod.getKey().trim(), valueOfMethod.getValue().trim(), protocolId, protocolClazzName
, writeObject.trim(), protocolClazzName, protocolClazzName, readObject.trim(), protocolClazzName);
var protocolOutputPath = StringUtils.format("{}/{}/{}.ts", protocolOutputRootPath
, GenerateProtocolPath.getProtocolPath(protocolId), protocolClazzName);
FileUtils.writeStringToFile(new File(protocolOutputPath), protocolTemplate);
}
private static String importSubProtocol(ProtocolRegistration registration) {
var protocolId = registration.getId();
var subProtocols = ProtocolAnalysis.getAllSubProtocolIds(protocolId);
if (CollectionUtils.isEmpty(subProtocols)) {
return StringUtils.EMPTY;
}
var importBuilder = new StringBuilder();
for (var subProtocolId : subProtocols) {
var protocolClassName = EnhanceObjectProtocolSerializer.getProtocolClassSimpleName(subProtocolId);
var path = GenerateProtocolPath.getProtocolPath(protocolId);
importBuilder.append(StringUtils.format("import {} from './{}';", protocolClassName, protocolClassName)).append(LS);
}
return importBuilder.toString();
}
private static String docTitle(ProtocolRegistration registration) {
var protocolId = registration.getId();
var protocolDocument = GenerateProtocolDocument.getProtocolDocument(protocolId);
var docTitle = protocolDocument.getKey();
return docTitle;
}
private static String fieldDefinition(ProtocolRegistration registration) {
var protocolId = registration.getId();
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var fieldDefinitionBuilder = new StringBuilder();
var protocolDocument = GenerateProtocolDocument.getProtocolDocument(protocolId);
var docFieldMap = protocolDocument.getValue();
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
var propertyName = field.getName();
// 生成注释
var doc = docFieldMap.get(propertyName);
if (StringUtils.isNotBlank(doc)) {
Arrays.stream(doc.split(LS)).forEach(it -> fieldDefinitionBuilder.append(TAB).append(it).append(LS));
}
var propertyTypeAndName = GenerateJsUtils.jsSerializer(fieldRegistration.serializer()).field(field, fieldRegistration);
fieldDefinitionBuilder.append(TAB).append(StringUtils.format("{}: {};", propertyTypeAndName.getValue(), propertyTypeAndName.getKey())).append(LS);
}
return fieldDefinitionBuilder.toString();
}
private static Pair<String, String> valueOfMethod(ProtocolRegistration registration) {
var protocolId = registration.getId();
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var filedList = new ArrayList<Pair<String, String>>();
for (int i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
var propertyTypeAndName = GenerateJsUtils.jsSerializer(fieldRegistration.serializer()).field(field, fieldRegistration);
filedList.add(propertyTypeAndName);
}
var valueOfParams = filedList.stream()
.map(it -> StringUtils.format("{}: {}", it.getValue(), it.getKey()))
.collect(Collectors.toList());
var valueOfParamsStr = StringUtils.joinWith(StringUtils.COMMA + " ", valueOfParams.toArray());
var cppBuilder = new StringBuilder();
filedList.forEach(it -> cppBuilder.append(TAB + TAB).append(StringUtils.format("this.{} = {};", it.getValue(), it.getValue())).append(LS));
return new Pair<>(valueOfParamsStr, cppBuilder.toString());
}
private static String writeObject(ProtocolRegistration registration) {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var jsBuilder = new StringBuilder();
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
GenerateJsUtils.jsSerializer(fieldRegistration.serializer()).writeObject(jsBuilder, "packet." + field.getName(), 2, field, fieldRegistration);
}
return jsBuilder.toString();
}
private static String readObject(ProtocolRegistration registration) {
var fields = registration.getFields();
var fieldRegistrations = registration.getFieldRegistrations();
var jsBuilder = new StringBuilder();
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
var fieldRegistration = fieldRegistrations[i];
if (field.isAnnotationPresent(Compatible.class)) {
jsBuilder.append(TAB).append("if (!buffer.isReadable()) {").append(LS);
jsBuilder.append(TAB + TAB).append("return packet;").append(LS);
jsBuilder.append(TAB).append("}").append(LS);
}
var readObject = GenerateJsUtils.jsSerializer(fieldRegistration.serializer()).readObject(jsBuilder, 2, field, fieldRegistration);
jsBuilder.append(TAB + TAB).append(StringUtils.format("packet.{} = {};", field.getName(), readObject)).append(LS);
}
return jsBuilder.toString();
}
}
@@ -0,0 +1,32 @@
{}
const protocols = new Map();
// initProtocol
{}
class ProtocolManager {
static getProtocol(): Any {
const protocol = protocols.get(protocolId);
if (protocol === null) {
throw new Error('[protocolId:' + protocolId + ']协议不存在');
}
return protocol;
}
static write(buffer: Any, packet: Any): void {
const protocolId = packet.protocolId();
buffer.writeShort(protocolId);
const protocol = getProtocol(protocolId);
protocol.write(buffer, packet);
}
static read(buffer: Any): Any {
const protocolId = buffer.readShort();
const protocol = ProtocolManager.getProtocol(protocolId);
const packet = protocol.read(buffer);
return packet;
}
}
export default ProtocolManager;
@@ -0,0 +1,29 @@
{}
{}
class {} {
{}
constructor({}) {
{}
}
protocolId(): number {
return {};
}
static write(buffer: Any, packet: {}) {
{}
}
static read(buffer: Any): {} {
if (!buffer.readBoolean()) {
return null;
}
const packet = new {}();
{}
return packet;
}
}
export default {};
@@ -0,0 +1,352 @@
const Longbits = require('./longbits.js');
const empty_str = '';
const initSize = 128;
const maxSize = 655537;
const maxShort = 32767;
const minShort = -32768;
const maxInt = 2147483647;
const minInt = -2147483648;
// UTF-8编码与解码
// const encoder = new TextEncoder('utf-8');
// const decoder = new TextDecoder('utf-8');
// nodejs的测试环境需要用以下方式特殊处理
const util = require('util');
const encoder = new util.TextEncoder('utf-8');
const decoder = new util.TextDecoder('utf-8');
// 在js中long可以支持的最大值
// const maxLong = 9007199254740992;
// const minLong = -9007199254740992;
const copy = function copy(original: ArrayBuffer, newLength: number) {
if (original.byteLength > newLength) {
throw new Error('newLength is too small');
}
const dst = new ArrayBuffer(newLength);
new Uint8Array(dst).set(new Uint8Array(original));
return dst;
};
function encodeZigzagInt(n: number) {
// 有效位左移一位+符号位右移31位
return (n << 1) ^ (n >> 31);
}
function decodeZigzagInt(n: number) {
return (n >>> 1) ^ -(n & 1);
}
class ByteBuffer {
writeOffset: number;
readOffset: number;
buffer: ArrayBuffer;
bufferView: DataView;
constructor() {
this.writeOffset = 0;
this.readOffset = 0;
this.buffer = new ArrayBuffer(initSize);
this.bufferView = new DataView(this.buffer, 0, this.buffer.byteLength);
}
setWriteOffset(writeOffset: number): void {
if (writeOffset > this.buffer.byteLength) {
throw new Error('index out of bounds exception:readerIndex:' + this.readOffset +
', writerIndex:' + this.writeOffset +
'(expected:0 <= readerIndex <= writerIndex <= capacity:' + this.buffer.byteLength);
}
this.writeOffset = writeOffset;
}
setReadOffset(readOffset: number): void {
if (readOffset > this.writeOffset) {
throw new Error('index out of bounds exception:readerIndex:' + this.readOffset +
', writerIndex:' + this.writeOffset +
'(expected:0 <= readerIndex <= writerIndex <= capacity:' + this.buffer.byteLength);
}
this.readOffset = readOffset;
}
getCapacity(): number {
return this.buffer.byteLength - this.writeOffset;
}
ensureCapacity(minCapacity: number): void {
while (minCapacity - this.getCapacity() > 0) {
const newSize = this.buffer.byteLength * 2;
if (newSize > maxSize) {
throw new Error('out of memory error');
}
this.buffer = copy(this.buffer, newSize);
this.bufferView = new DataView(this.buffer, 0, this.buffer.byteLength);
}
}
isReadable(): boolean {
return this.writeOffset > this.readOffset;
}
writeBytes(byteArray: ArrayBuffer): void {
const length = byteArray.byteLength;
this.ensureCapacity(length);
new Uint8Array(this.buffer).set(new Uint8Array(byteArray), this.writeOffset);
this.writeOffset += length;
}
toBytes(): ArrayBuffer {
const result = new ArrayBuffer(this.writeOffset);
new Uint8Array(result).set(new Uint8Array(this.buffer.slice(0, this.writeOffset)));
return result;
}
writeBoolean(value: boolean): void {
if (!(value === true || value === false)) {
throw new Error('value must be true of false');
}
this.ensureCapacity(1);
if (value === true) {
this.bufferView.setInt8(this.writeOffset, 1);
} else {
this.bufferView.setInt8(this.writeOffset, 0);
}
this.writeOffset++;
}
readBoolean(): boolean {
const value = this.bufferView.getInt8(this.readOffset);
this.readOffset++;
return (value === 1);
}
writeByte(value: number): void {
this.ensureCapacity(1);
this.bufferView.setInt8(this.writeOffset, value);
this.writeOffset++;
}
readByte(): number {
const value = this.bufferView.getInt8(this.readOffset);
this.readOffset++;
return value;
}
writeShort(value: number): void {
if (!(minShort <= value && value <= maxShort)) {
throw new Error('value must range between minShort:-32768 and maxShort:32767');
}
this.ensureCapacity(2);
this.bufferView.setInt16(this.writeOffset, value);
this.writeOffset += 2;
}
readShort(): number {
const value = this.bufferView.getInt16(this.readOffset);
this.readOffset += 2;
return value;
}
writeRawInt(value: number): void {
if (!(minInt <= value && value <= maxInt)) {
throw new Error('value must range between minInt:-2147483648 and maxInt:2147483647');
}
this.ensureCapacity(4);
this.bufferView.setInt32(this.writeOffset, value);
this.writeOffset += 4;
}
readRawInt(): number {
const value = this.bufferView.getInt32(this.readOffset);
this.readOffset += 4;
return value;
}
writeInt(value: number): void {
if (!(minInt <= value && value <= maxInt)) {
throw new Error('value must range between minInt:-2147483648 and maxInt:2147483647');
}
this.ensureCapacity(5);
value = encodeZigzagInt(value);
if (value >>> 7 === 0) {
this.writeByte(value);
return;
}
if (value >>> 14 === 0) {
this.writeByte((value & 0x7F) | 0x80);
this.writeByte((value >>> 7));
return;
}
if (value >>> 21 === 0) {
this.writeByte((value & 0x7F) | 0x80);
this.writeByte((value >>> 7 | 0x80));
this.writeByte(value >>> 14);
return;
}
if (value >>> 28 === 0) {
this.writeByte((value & 0x7F) | 0x80);
this.writeByte((value >>> 7 | 0x80));
this.writeByte((value >>> 14 | 0x80));
this.writeByte(value >>> 21);
return;
}
this.writeByte((value & 0x7F) | 0x80);
this.writeByte((value >>> 7 | 0x80));
this.writeByte((value >>> 14 | 0x80));
this.writeByte((value >>> 21 | 0x80));
this.writeByte(value >>> 28);
}
readInt(): number {
let b = this.readByte();
let value = b & 0x7F;
if ((b & 0x80) !== 0) {
b = this.readByte();
value |= (b & 0x7F) << 7;
if ((b & 0x80) !== 0) {
b = this.readByte();
value |= (b & 0x7F) << 14;
if ((b & 0x80) !== 0) {
b = this.readByte();
value |= (b & 0x7F) << 21;
if ((b & 0x80) !== 0) {
b = this.readByte();
value |= (b & 0x7F) << 28;
}
}
}
}
return decodeZigzagInt(value);
}
writeLong(value: number): void {
if (value === null || value === undefined) {
throw new Error('value must not be null');
}
this.ensureCapacity(9);
Longbits.writeInt64(this, value);
}
readLong(): number {
const buffer = new ArrayBuffer(9);
const bufferView = new DataView(buffer, 0, buffer.byteLength);
let count = 0;
let b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
if ((b & 0x80) !== 0) {
b = this.readByte();
bufferView.setUint8(count++, b);
}
}
}
}
}
}
}
}
return Longbits.readInt64(new Uint8Array(buffer.slice(0, count))).toString();
}
writeFloat(value: number): void {
if (value === null || value === undefined) {
throw new Error('value must not be null');
}
this.ensureCapacity(4);
this.bufferView.setFloat32(this.writeOffset, value);
this.writeOffset += 4;
}
readFloat(): number {
const value = this.bufferView.getFloat32(this.readOffset);
this.readOffset += 4;
return value;
}
writeDouble(value: number): void {
if (value === null || value === undefined) {
throw new Error('value must not be null');
}
this.ensureCapacity(8);
this.bufferView.setFloat64(this.writeOffset, value);
this.writeOffset += 8;
}
readDouble(): number {
const value = this.bufferView.getFloat64(this.readOffset);
this.readOffset += 8;
return value;
}
writeChar(value: string): void {
if (value === null || value === undefined || value.length === 0) {
this.writeString(empty_str);
return;
}
this.writeString(value.charAt(0));
}
readChar(): string {
return this.readString();
}
writeString(value: string): void {
if (value === null || value === undefined || value.trim().length === 0) {
this.writeInt(0);
return;
}
const uint8Array = encoder.encode(value);
this.ensureCapacity(5 + uint8Array.length);
this.writeInt(uint8Array.length);
uint8Array.forEach((value: number) => this.writeByte(value));
}
readString(): string {
const length = this.readInt();
if (length <= 0) {
return empty_str;
}
const uint8Array = new Uint8Array(this.buffer.slice(this.readOffset, this.readOffset + length));
const value = decoder.decode(uint8Array);
this.readOffset += length;
return value;
}
}
export default ByteBuffer;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,189 @@
// from protobuf
const Long = require('./long.js')
module.exports = LongBits;
/**
* Constructs new long bits.
* @classdesc Helper class for working with the low and high bits of a 64 bit value.
* @memberof util
* @constructor
* @param {number} lo Low 32 bits, unsigned
* @param {number} hi High 32 bits, unsigned
*/
function LongBits(lo, hi) {
// note that the casts below are theoretically unnecessary as of today, but older statically
// generated converter code might still call the ctor with signed 32bits. kept for compat.
/**
* Low bits.
* @type {number}
*/
this.lo = lo >>> 0;
/**
* High bits.
* @type {number}
*/
this.hi = hi >>> 0;
}
/**
* Zig-zag encodes this long bits.
* @returns {util.LongBits} `this`
*/
LongBits.prototype.zzEncode = function zzEncode() {
const mask = this.hi >> 31;
this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;
this.lo = (this.lo << 1 ^ mask) >>> 0;
return this;
};
/**
* Zig-zag decodes this long bits.
* @returns {util.LongBits} `this`
*/
LongBits.prototype.zzDecode = function zzDecode() {
const mask = -(this.lo & 1);
this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;
this.hi = (this.hi >>> 1 ^ mask) >>> 0;
return this;
};
/**
* Converts this long bits to a long.
* @param {boolean} [unsigned=false] Whether unsigned or not
* @returns {Long} Long
*/
LongBits.prototype.toLong = function toLong(unsigned) {
return new Long(this.lo | 0, this.hi | 0, Boolean(unsigned));
};
/**
* Zero bits.
* @memberof util.LongBits
* @type {util.LongBits}
*/
const zero = LongBits.zero = new LongBits(0, 0);
function from(value) {
if (typeof value === 'number') {
return fromNumber(value);
}
if (typeof value === 'string' || value instanceof String) {
value = Long.fromString(value);
}
return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;
}
/**
* Constructs new long bits from the specified number.
* @param {number} value Value
* @returns {util.LongBits} Instance
*/
function fromNumber(value) {
if (value === 0) {
return zero;
}
const sign = value < 0;
if (sign) {
value = -value;
}
let lo = value >>> 0;
let hi = (value - lo) / 4294967296 >>> 0;
if (sign) {
hi = ~hi >>> 0;
lo = ~lo >>> 0;
if (++lo > 4294967295) {
lo = 0;
if (++hi > 4294967295) {
hi = 0;
}
}
}
return new LongBits(lo, hi);
}
function writeVarint64(byteBuffer, value) {
let count = 0;
while (value.hi) {
byteBuffer.writeByte(value.lo & 127 | 128);
value.lo = (value.lo >>> 7 | value.hi << 25) >>> 0;
value.hi >>>= 7;
count = count + 7;
}
while (value.lo > 127) {
if (count >= 56) {
byteBuffer.writeByte(value.lo);
return;
}
byteBuffer.writeByte(value.lo & 127 | 128);
value.lo = value.lo >>> 7;
count = count + 7;
}
byteBuffer.writeByte(value.lo);
}
function readLongVarint(buffer) {
// tends to deopt with local vars for octet etc.
const bits = new LongBits(0, 0);
let i = 0;
const len = buffer.length;
let pos = 0;
if (len - pos > 4) { // fast route (lo)
for (; i < 4; ++i) {
// 1st..4th
bits.lo = (bits.lo | (buffer[pos] & 127) << i * 7) >>> 0;
if (buffer[pos++] < 128) {
return bits;
}
}
// 5th
bits.lo = (bits.lo | (buffer[pos] & 127) << 28) >>> 0;
bits.hi = (bits.hi | (buffer[pos] & 127) >> 4) >>> 0;
if (buffer[pos++] < 128) {
return bits;
}
i = 0;
} else {
for (; i < 3; ++i) {
// 1st..3th
bits.lo = (bits.lo | (buffer[pos] & 127) << i * 7) >>> 0;
if (buffer[pos++] < 128) {
return bits;
}
}
// 4th
bits.lo = (bits.lo | (buffer[pos++] & 127) << i * 7) >>> 0;
return bits;
}
// 6th..9th
for (; i < 4; ++i) {
// 最后一位直接写入
if (pos === 8) {
bits.hi = (bits.hi | buffer[pos] << i * 7 + 3) >>> 0;
return bits;
}
bits.hi = (bits.hi | (buffer[pos] & 127) << i * 7 + 3) >>> 0;
if (buffer[pos++] < 128) {
return bits;
}
}
return bits;
}
function writeInt64(byteBuffer, value) {
const bits = from(value).zzEncode();
writeVarint64(byteBuffer, bits);
}
function readInt64(buffer) {
return readLongVarint(buffer).zzDecode().toLong(false);
}
LongBits.writeInt64 = writeInt64;
LongBits.readInt64 = readInt64;
@@ -42,7 +42,7 @@ import java.util.concurrent.Executors;
*/
public class SpeedTest {
private static int benchmark = 10_0000;
private static int benchmark = 1;
/**
* 单线程性能测试
+82
View File
@@ -0,0 +1,82 @@
import ByteBuffer from './zfoojs/buffer/ByteBuffer';
function assert(flag: boolean): void {
if (!flag) {
throw "exception happen";
}
}
// 如果是在idea中运行,需要先安装插件:Run Configuration for TypeScript
console.log("Hello world");
// ByteBuffer test
let buffer = new ByteBuffer();
assert(buffer.getCapacity() == 128)
// boolean
const testBoolean = [false, true];
testBoolean.forEach((value) => {
buffer.writeBoolean(value);
assert(buffer.readBoolean() == value);
});
assert(buffer.writeOffset == testBoolean.length);
assert(buffer.readOffset == testBoolean.length);
// byte
buffer = new ByteBuffer();
const testByte = [-128, -99, 0, 99, 127];
testByte.forEach((value) => {
buffer.writeByte(value);
assert(buffer.readByte() == value);
});
assert(buffer.writeOffset == testByte.length);
assert(buffer.readOffset == testByte.length);
// short
buffer = new ByteBuffer();
const testShort = [-32768, -99, 0, 99, 32767];
testShort.forEach((value) => {
buffer.writeShort(value);
assert(buffer.readShort() == value);
});
assert(buffer.writeOffset == testShort.length * 2);
assert(buffer.readOffset == testShort.length * 2);
// int
buffer = new ByteBuffer();
const testInt = [-2147483648, -99, 0, 99, 2147483647];
testInt.forEach((value) => {
buffer.writeInt(value);
assert(buffer.readInt() == value);
});
// float
buffer = new ByteBuffer();
const testFloat = [-999.5, -99.5, 0, 99.5, 999.5];
testFloat.forEach((value) => {
buffer.writeFloat(value);
assert(buffer.readFloat() == value);
});
// double
buffer = new ByteBuffer();
const testDouble = [-999.5, -99.5, 0, 99.5, 999.5];
testDouble.forEach((value) => {
buffer.writeDouble(value);
assert(buffer.readDouble() == value);
});
// string
buffer = new ByteBuffer();
const testString = 'hello world!';
buffer.writeString(testString);
assert(buffer.readString() == testString);
// char
buffer = new ByteBuffer();
const testChar = 'h';
buffer.writeChar(testString);
assert(buffer.readChar() == testChar);
+11
View File
@@ -0,0 +1,11 @@
{
"name": "zfoo-typescript",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"devDependencies": {
"@types/node": "^17.0.39",
"ts-node": "^10.8.1",
"typescript": "^4.7.3"
}
}