Skip to content

Commit 33f65e3

Browse files
committed
fixed perf on schema building
1 parent a375911 commit 33f65e3

File tree

6 files changed

+91
-136
lines changed

6 files changed

+91
-136
lines changed

__tests__/complexGameState.ts

Lines changed: 49 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -127,121 +127,77 @@ export const customSchemaTypes = makeCustomSchema({
127127
},
128128
});
129129

130-
export const GameStateSchema = makeSchema<GameState, typeof customSchemaTypes>({
131-
gameId: 'string',
132-
factions: 'byteArray',
133-
factionDetails: {
134-
'1': {
135-
flag: 'optional',
136-
element: {
137-
resourceCount: 'uint16',
138-
},
130+
const factionDetailsSchema = makeSchema<OfFaction<FactionDetail>, typeof customSchemaTypes>({
131+
'1': {
132+
flag: 'optional',
133+
element: {
134+
resourceCount: 'uint16',
139135
},
140-
2: {
141-
flag: 'optional',
142-
element: {
143-
resourceCount: 'uint16',
144-
},
136+
},
137+
2: {
138+
flag: 'optional',
139+
element: {
140+
resourceCount: 'uint16',
145141
},
146-
'3': {
147-
flag: 'optional',
148-
element: {
149-
resourceCount: 'uint16',
142+
},
143+
'3': {
144+
flag: 'optional',
145+
element: {
146+
resourceCount: 'uint16',
147+
},
148+
},
149+
});
150+
151+
const entitySchema = makeSchema<GameStateEntity, typeof customSchemaTypes>({
152+
x: 'int16',
153+
y: 'int16',
154+
health: 'uint8',
155+
id: 'uint32',
156+
healthRegenStep: 'uint8',
157+
facingDirection: 'uint8',
158+
entityType: {flag: 'enum', factory: 1, infantry: 2, plane: 3, tank: 4},
159+
busy: {
160+
flag: 'optional',
161+
element: {
162+
action: {
163+
flag: 'enum',
164+
'spawn-infantry': 1,
165+
'spawn-tank': 2,
166+
'spawn-plane': 3,
167+
attack: 4,
168+
mine: 5,
169+
move: 6,
150170
},
171+
hexId: 'hexId',
172+
ticks: 'uint32',
151173
},
152174
},
175+
});
176+
177+
export const GameStateSchema = makeSchema<GameState, typeof customSchemaTypes>({
178+
gameId: 'string',
179+
factions: 'byteArray',
180+
factionDetails: factionDetailsSchema,
153181
entities: {
154182
1: {
155183
flag: 'optional',
156184
element: {
157185
flag: 'array-uint16',
158-
elements: {
159-
x: 'int16',
160-
y: 'int16',
161-
health: 'uint8',
162-
id: 'uint32',
163-
healthRegenStep: 'uint8',
164-
facingDirection: 'uint8',
165-
entityType: {flag: 'enum', factory: 1, infantry: 2, plane: 3, tank: 4},
166-
busy: {
167-
flag: 'optional',
168-
element: {
169-
action: {
170-
flag: 'enum',
171-
'spawn-infantry': 1,
172-
'spawn-tank': 2,
173-
'spawn-plane': 3,
174-
attack: 4,
175-
mine: 5,
176-
move: 6,
177-
},
178-
hexId: 'hexId',
179-
ticks: 'uint32',
180-
},
181-
},
182-
},
186+
elements: entitySchema,
183187
},
184188
},
185189
2: {
186190
flag: 'optional',
187191
element: {
188192
flag: 'array-uint16',
189-
elements: {
190-
x: 'int16',
191-
y: 'int16',
192-
health: 'uint8',
193-
id: 'uint32',
194-
healthRegenStep: 'uint8',
195-
facingDirection: 'uint8',
196-
entityType: {flag: 'enum', factory: 1, infantry: 2, plane: 3, tank: 4},
197-
busy: {
198-
flag: 'optional',
199-
element: {
200-
action: {
201-
flag: 'enum',
202-
'spawn-infantry': 1,
203-
'spawn-tank': 2,
204-
'spawn-plane': 3,
205-
attack: 4,
206-
mine: 5,
207-
move: 6,
208-
},
209-
hexId: 'hexId',
210-
ticks: 'uint32',
211-
},
212-
},
213-
},
193+
elements: entitySchema,
214194
},
215195
},
216196
3: {
217197
flag: 'optional',
218198
element: {
219199
flag: 'array-uint16',
220-
elements: {
221-
x: 'int16',
222-
y: 'int16',
223-
health: 'uint8',
224-
id: 'uint32',
225-
healthRegenStep: 'uint8',
226-
facingDirection: 'uint8',
227-
entityType: {flag: 'enum', factory: 1, infantry: 2, plane: 3, tank: 4},
228-
busy: {
229-
flag: 'optional',
230-
element: {
231-
action: {
232-
flag: 'enum',
233-
'spawn-infantry': 1,
234-
'spawn-tank': 2,
235-
'spawn-plane': 3,
236-
attack: 4,
237-
mine: 5,
238-
move: 6,
239-
},
240-
hexId: 'hexId',
241-
ticks: 'uint32',
242-
},
243-
},
244-
},
200+
elements: entitySchema,
245201
},
246202
},
247203
},

lib/schemaDefiner.d.ts.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/schemaDefiner.js

Lines changed: 17 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/schemaDefiner.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "safe-schema",
3-
"version": "1.1.1",
3+
"version": "1.1.2",
44
"homepage": "https://github.com/dested/safe-schema",
55
"author": "Salvatore <[email protected]>",
66
"main": "./lib/index.js",

src/schemaDefiner.ts

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,18 @@ function buildAdderFunction(
185185
assertType<ABFlags>(schema);
186186
switch (schema.flag) {
187187
case 'enum': {
188-
return `({
189-
${safeKeysExclude(schema, 'flag')
190-
.map((key) => `['${key}']:()=>buff.addUint8(${schema[key]}),`)
191-
.join('\n')}
192-
})[${fieldName}]();`;
188+
return `switch(${fieldName}){
189+
${safeKeysExclude(schema, 'flag')
190+
.map((key) => `case '${key}':buff.addUint8(${schema[key]});break;`)
191+
.join('\n')}
192+
}`;
193193
}
194194
case 'number-enum': {
195-
return `({
196-
${safeKeysExclude(schema, 'flag')
197-
.map((key) => `[${key}]:()=>buff.addUint8(${schema[key]}),`)
198-
.join('\n')}
199-
})[${fieldName}]();`;
195+
return `switch(${fieldName}){
196+
${safeKeysExclude(schema, 'flag')
197+
.map((key) => `case ${key}:buff.addUint8(${schema[key]});break;`)
198+
.join('\n')}
199+
}`;
200200
}
201201
case 'bitmask': {
202202
return `buff.addBits(...[
@@ -223,17 +223,18 @@ ${safeKeysExclude(schema, 'flag')
223223
}`;
224224
}
225225
case 'type-lookup': {
226-
let map = '{\n';
227-
let index = 0;
228-
for (const key of Object.keys(schema.elements)) {
229-
map += `['${key}']:()=>{
230-
buff.addUint8(${index});
231-
${buildAdderFunction(schema.elements[key], fieldName, addMap, customSchema)}
232-
},`;
233-
index++;
234-
}
235-
map += '}\n';
236-
return `(${map})[${fieldName}.type]();`;
226+
return `switch(${fieldName}.type){
227+
${Object.keys(schema.elements)
228+
.map(
229+
(key, index) =>
230+
`case '${key}':{
231+
buff.addUint8(${index});
232+
${buildAdderFunction(schema.elements[key], fieldName, addMap, customSchema)};
233+
break;
234+
}`
235+
)
236+
.join('\n')}
237+
}`;
237238
}
238239
case 'optional': {
239240
return `buff.addBoolean(${fieldName}!==undefined);

0 commit comments

Comments
 (0)