ref[typescript]: refactor typescript protocol

This commit is contained in:
godotg committed 2024-07-08 16:06:53 +08:00
1 parent e96120dd07
commit 231f010270
7 files changed
+104 -97

No files matched your search

@@ -86,11 +86,12 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocolManagerTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolManagerTemplate.ts");
var protocol_imports_manager = new StringBuilder();
var protocol_manager_registrations = new StringBuilder();
protocol_imports_manager.append("import Protocols from './Protocols';").append(LS);
protocol_imports_manager.append("import * as Protocols from './Protocols';").append(LS);
for (var registration : registrations) {
var protocol_id = registration.protocolId();
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, Protocols.{});", protocol_id, protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, new Protocols.{}Registration());", protocol_id, protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocolIdMap.set(Protocols.{}, {});", protocol_name, protocol_id)).append(LS);
}
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports_manager.toString()
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
@@ -102,28 +103,18 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocol_imports_protocols = new StringBuilder();
protocol_imports_protocols.append("import IByteBuffer from './IByteBuffer';").append(LS);
protocol_imports_protocols.append("import IProtocolRegistration from './IProtocolRegistration';").append(LS);
var protocol_class = new StringBuilder();
var protocol_registration = new StringBuilder();
for (var registration : registrations) {
var protocol_id = registration.protocolId();
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolClassTemplate.ts");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_name, protocol_name
, CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
));
protocol_class.append(formatProtocolTemplate).append(LS);
protocol_registration.append(StringUtils.format("static {} = {}", protocol_name, protocol_name)).append(LS);
protocol_class.append(protocol_class(registration).replace("class ", "export class ")).append(LS);
protocol_registration.append(protocol_registration(registration)).append(LS);
}
var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolsTemplate.ts");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_imports, protocol_imports_protocols.toString()
,CodeTemplatePlaceholder.protocol_class, protocol_class.toString()
, CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString()
, CodeTemplatePlaceholder.protocol_class, protocol_class.toString()
, CodeTemplatePlaceholder.protocol_registration, protocol_registration.toString()
));
var outputPath = StringUtils.format("{}/Protocols.ts", protocolOutputPath);
var file = new File(outputPath);
@@ -144,7 +135,9 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocol_id = registration.protocolId();
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
protocol_imports.append(StringUtils.format("import {} from './{}/{}';", protocol_name, GenerateProtocolPath.protocolPathSlash(protocol_id), protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS);
protocol_imports.append(StringUtils.format("import { {}Registration } from './{}/{}';", protocol_name, GenerateProtocolPath.protocolPathSlash(protocol_id), protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, new {}Registration());", protocol_id, protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocolIdMap.set({}, {});", protocol_name, protocol_id)).append(LS);
}
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
@@ -161,11 +154,9 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_name, protocol_name
, CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript)
, CodeTemplatePlaceholder.protocol_imports, protocol_imports_fold(registration)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
, CodeTemplatePlaceholder.protocol_class, protocol_class(registration)
, CodeTemplatePlaceholder.protocol_registration, protocol_registration(registration)
));
var outputPath = StringUtils.format("{}/{}/{}.ts", protocolOutputPath, GenerateProtocolPath.protocolPathSlash(protocol_id), protocol_name);
var file = new File(outputPath);
@@ -187,7 +178,9 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocol_id = registration.protocolId();
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
protocol_imports.append(StringUtils.format("import {} from './{}';", protocol_name, protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, {});", protocol_id, protocol_name)).append(LS);
protocol_imports.append(StringUtils.format("import { {}Registration } from './{}';", protocol_name, protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocols.set({}, new {}Registration());", protocol_id, protocol_name)).append(LS);
protocol_manager_registrations.append(StringUtils.format("protocolIdMap.set({}, {});", protocol_name, protocol_id)).append(LS);
}
var placeholderMap = Map.of(CodeTemplatePlaceholder.protocol_imports, protocol_imports.toString()
, CodeTemplatePlaceholder.protocol_manager_registrations, protocol_manager_registrations.toString());
@@ -202,13 +195,10 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolTemplate.ts");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_name, protocol_name
, CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript)
CodeTemplatePlaceholder.protocol_name, protocol_name
, CodeTemplatePlaceholder.protocol_imports, protocol_imports_default(registration)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
, CodeTemplatePlaceholder.protocol_class, protocol_class(registration)
, CodeTemplatePlaceholder.protocol_registration, protocol_registration(registration)
));
var outputPath = StringUtils.format("{}/{}.ts", protocolOutputPath, protocol_name);
var file = new File(outputPath);
@@ -218,7 +208,8 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
}
private void createTemplateFile() throws IOException {
var list = List.of("typescript/IByteBuffer.ts", "typescript/buffer/ByteBuffer.ts", "typescript/buffer/Long.ts", "typescript/buffer/Longbits.ts");
var list = List.of("typescript/IProtocolRegistration.ts", "typescript/IByteBuffer.ts", "typescript/buffer/ByteBuffer.ts"
, "typescript/buffer/Long.ts", "typescript/buffer/Longbits.ts");
for (var fileName : list) {
var fileInputStream = ClassUtils.getFileFromClassPath(fileName);
var createFile = new File(StringUtils.format("{}/{}", protocolOutputPath, StringUtils.substringAfterFirst(fileName, "typescript/")));
@@ -226,6 +217,32 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
}
}
private String protocol_class(ProtocolRegistration registration) {
var protocol_id = registration.protocolId();
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolClassTemplate.ts");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_note, GenerateProtocolNote.protocol_note(protocol_id, CodeLanguage.TypeScript)
, CodeTemplatePlaceholder.protocol_name, protocol_name
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_field_definition, protocol_field_definition(registration)
));
return formatProtocolTemplate;
}
private String protocol_registration(ProtocolRegistration registration) {
var protocol_id = registration.protocolId();
var protocol_name = registration.protocolConstructor().getDeclaringClass().getSimpleName();
var protocolTemplate = ClassUtils.getFileFromClassPathToString("typescript/ProtocolRegistrationTemplate.ts");
var formatProtocolTemplate = CodeTemplatePlaceholder.formatTemplate(protocolTemplate, Map.of(
CodeTemplatePlaceholder.protocol_name, protocol_name
, CodeTemplatePlaceholder.protocol_id, String.valueOf(protocol_id)
, CodeTemplatePlaceholder.protocol_write_serialization, protocol_write_serialization(registration)
, CodeTemplatePlaceholder.protocol_read_deserialization, protocol_read_deserialization(registration)
));
return formatProtocolTemplate;
}
private String protocol_imports_fold(ProtocolRegistration registration) {
// import IByteBuffer first
var protocolId = registration.getId();
@@ -233,6 +250,7 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocolPath = GenerateProtocolPath.protocolPathPeriod(protocolId);
var splits = protocolPath.split(StringUtils.PERIOD_REGEX);
importBuilder.append(StringUtils.format("import IByteBuffer from '{}IByteBuffer';", "../".repeat(splits.length))).append(LS);
importBuilder.append(StringUtils.format("import IProtocolRegistration from '{}IProtocolRegistration';", "../".repeat(splits.length))).append(LS);
var subProtocols = ProtocolAnalysis.getFirstSubProtocolIds(protocolId);
// import other sub protocols
@@ -249,6 +267,7 @@ public class CodeGenerateTypeScript implements ICodeGenerate {
var protocolId = registration.getId();
var importBuilder = new StringBuilder();
importBuilder.append(StringUtils.format("import IByteBuffer from './IByteBuffer';")).append(LS);
importBuilder.append(StringUtils.format("import IProtocolRegistration from './IProtocolRegistration';")).append(LS);
// import other sub protocols
var subProtocols = ProtocolAnalysis.getFirstSubProtocolIds(protocolId);
@@ -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,32 +1,4 @@
${protocol_note}
class ${protocol_name} {
${protocol_field_definition}
static PROTOCOL_ID: number = ${protocol_id};
protocolId(): number {
return ${protocol_name}.PROTOCOL_ID;
}
static write(buffer: IByteBuffer, packet: ${protocol_name} | null) {
if (packet === null) {
buffer.writeInt(0);
return;
}
${protocol_write_serialization}
}
static read(buffer: IByteBuffer): ${protocol_name} | null {
const length = buffer.readInt();
if (length === 0) {
return null;
}
const beforeReadIndex = buffer.getReadOffset();
const packet = new ${protocol_name}();
${protocol_read_deserialization}
if (length > 0) {
buffer.setReadOffset(beforeReadIndex + length);
}
return packet;
}
}
@@ -1,22 +1,32 @@
${protocol_imports}
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
${protocol_manager_registrations}
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);
if (protocol === null) {
if (protocol === null || protocol === undefined) {
throw '[protocolId:' + protocolId + '] not exist';
}
return protocol;
}
static write(buffer: IByteBuffer, packet: any): void {
const protocolId = packet.protocolId();
const protocolId = ProtocolManager.getProtocolId(packet.constructor);
buffer.writeShort(protocolId);
const protocol = ProtocolManager.getProtocol(protocolId);
protocol.write(buffer, packet);
@@ -0,0 +1,27 @@
export class ${protocol_name}Registration implements IProtocolRegistration<${protocol_name}> {
protocolId(): number {
return ${protocol_id};
}
write(buffer: IByteBuffer, packet: ${protocol_name} | null) {
if (packet === null) {
buffer.writeInt(0);
return;
}
${protocol_write_serialization}
}
read(buffer: IByteBuffer): ${protocol_name} | null {
const length = buffer.readInt();
if (length === 0) {
return null;
}
const beforeReadIndex = buffer.getReadOffset();
const packet = new ${protocol_name}();
${protocol_read_deserialization}
if (length > 0) {
buffer.setReadOffset(beforeReadIndex + length);
}
return packet;
}
}
@@ -1,35 +1,7 @@
${protocol_imports}
${protocol_note}
class ${protocol_name} {
${protocol_field_definition}
static PROTOCOL_ID: number = ${protocol_id};
${protocol_class}
protocolId(): number {
return ${protocol_name}.PROTOCOL_ID;
}
static write(buffer: IByteBuffer, packet: ${protocol_name} | null) {
if (packet === null) {
buffer.writeInt(0);
return;
}
${protocol_write_serialization}
}
static read(buffer: IByteBuffer): ${protocol_name} | null {
const length = buffer.readInt();
if (length === 0) {
return null;
}
const beforeReadIndex = buffer.getReadOffset();
const packet = new ${protocol_name}();
${protocol_read_deserialization}
if (length > 0) {
buffer.setReadOffset(beforeReadIndex + length);
}
return packet;
}
}
${protocol_registration}
export default ${protocol_name};
@@ -2,8 +2,4 @@ ${protocol_imports}
${protocol_class}
class Protocols {
${protocol_registration}
}
export default Protocols;
${protocol_registration}