Skip to content

Commit 078c62f

Browse files
authored
fix: remove writing default values (#88)
With correct singular/optional handling it's not necessary to write default values. This was previously implemented to write default values for repeated message fields where all fields were singular but those messages are written as zero-length buffers and their fields are set to the default value during decoding so there's no reason to have their values in the buffer.
1 parent 198e9a7 commit 078c62f

File tree

10 files changed

+148
-151
lines changed

10 files changed

+148
-151
lines changed

packages/protons/src/index.ts

+24-27
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,22 @@ const types: Record<string, string> = {
3838
uint64: 'bigint'
3939
}
4040

41-
const encoderGenerators: Record<string, (val: string, includeDefault: boolean) => string> = {
42-
bool: (val, includeDefault) => `w.bool(${val}${includeDefault ? ' ?? false' : ''})`,
43-
bytes: (val, includeDefault) => `w.bytes(${val}${includeDefault ? ' ?? new Uint8Array(0)' : ''})`,
44-
double: (val, includeDefault) => `w.double(${val}${includeDefault ? ' ?? 0' : ''})`,
45-
fixed32: (val, includeDefault) => `w.fixed32(${val}${includeDefault ? ' ?? 0' : ''})`,
46-
fixed64: (val, includeDefault) => `w.fixed64(${val}${includeDefault ? ' ?? 0n' : ''})`,
47-
float: (val, includeDefault) => `w.float(${val}${includeDefault ? ' ?? 0' : ''})`,
48-
int32: (val, includeDefault) => `w.int32(${val}${includeDefault ? ' ?? 0' : ''})`,
49-
int64: (val, includeDefault) => `w.int64(${val}${includeDefault ? ' ?? 0n' : ''})`,
50-
sfixed32: (val, includeDefault) => `w.sfixed32(${val}${includeDefault ? ' ?? 0' : ''})`,
51-
sfixed64: (val, includeDefault) => `w.sfixed64(${val}${includeDefault ? ' ?? 0n' : ''})`,
52-
sint32: (val, includeDefault) => `w.sint32(${val}${includeDefault ? ' ?? 0' : ''})`,
53-
sint64: (val, includeDefault) => `w.sint64(${val}${includeDefault ? ' ?? 0n' : ''})`,
54-
string: (val, includeDefault) => `w.string(${val}${includeDefault ? ' ?? \'\'' : ''})`,
55-
uint32: (val, includeDefault) => `w.uint32(${val}${includeDefault ? ' ?? 0' : ''})`,
56-
uint64: (val, includeDefault) => `w.uint64(${val}${includeDefault ? ' ?? 0n' : ''})`
41+
const encoderGenerators: Record<string, (val: string) => string> = {
42+
bool: (val) => `w.bool(${val})`,
43+
bytes: (val) => `w.bytes(${val})`,
44+
double: (val) => `w.double(${val})`,
45+
fixed32: (val) => `w.fixed32(${val})`,
46+
fixed64: (val) => `w.fixed64(${val})`,
47+
float: (val) => `w.float(${val})`,
48+
int32: (val) => `w.int32(${val})`,
49+
int64: (val) => `w.int64(${val})`,
50+
sfixed32: (val) => `w.sfixed32(${val})`,
51+
sfixed64: (val) => `w.sfixed64(${val})`,
52+
sint32: (val) => `w.sint32(${val})`,
53+
sint64: (val) => `w.sint64(${val})`,
54+
string: (val) => `w.string(${val})`,
55+
uint32: (val) => `w.uint32(${val})`,
56+
uint64: (val) => `w.uint64(${val})`
5757
}
5858

5959
const decoderGenerators: Record<string, () => string> = {
@@ -395,29 +395,26 @@ export interface ${messageDef.name} {
395395
} else if (!fieldDef.optional && !fieldDef.repeated) {
396396
// proto3 singular fields should only be written out if they are not the default value
397397
if (defaultValueTestGenerators[type] != null) {
398-
valueTest = `opts.writeDefaults === true || ${defaultValueTestGenerators[type](`obj.${name}`)}`
398+
valueTest = `${defaultValueTestGenerators[type](`obj.${name}`)}`
399399
} else if (type === 'enum') {
400400
// handle enums
401-
valueTest = `opts.writeDefaults === true || (obj.${name} != null && __${fieldDef.type}Values[obj.${name}] !== 0)`
401+
valueTest = `obj.${name} != null && __${fieldDef.type}Values[obj.${name}] !== 0`
402402
}
403403
}
404404

405-
function createWriteField (valueVar: string): (includeDefault: boolean) => string {
405+
function createWriteField (valueVar: string): () => string {
406406
const id = (fieldDef.id << 3) | codecTypes[type]
407-
let defaultValue = ''
408407

409408
if (fieldDef.enum) {
410409
const def = findDef(fieldDef.type, messageDef, moduleDef)
411410

412411
if (!isEnumDef(def)) {
413412
throw new Error(`${fieldDef.type} was not enum def`)
414413
}
415-
416-
defaultValue = Object.keys(def.values)[0]
417414
}
418415

419-
let writeField = (includeDefault: boolean): string => `w.uint32(${id})
420-
${encoderGenerators[type] == null ? `${codec}.encode(${valueVar}${includeDefault ? ` ?? ${typeName}.${defaultValue}` : ''}, w)` : encoderGenerators[type](valueVar, includeDefault)}`
416+
let writeField = (): string => `w.uint32(${id})
417+
${encoderGenerators[type] == null ? `${codec}.encode(${valueVar}, w)` : encoderGenerators[type](valueVar)}`
421418

422419
if (type === 'message') {
423420
// message fields are only written if they have values. But if a message
@@ -437,7 +434,7 @@ export interface ${messageDef.name} {
437434
writeField = () => `
438435
for (const [key, value] of obj.${name}.entries()) {
439436
${
440-
createWriteField('{ key, value }')(false)
437+
createWriteField('{ key, value }')()
441438
.split('\n')
442439
.map(s => {
443440
const trimmed = s.trim()
@@ -452,7 +449,7 @@ export interface ${messageDef.name} {
452449
writeField = () => `
453450
for (const value of obj.${name}) {
454451
${
455-
createWriteField('value')(false)
452+
createWriteField('value')()
456453
.split('\n')
457454
.map(s => {
458455
const trimmed = s.trim()
@@ -468,7 +465,7 @@ export interface ${messageDef.name} {
468465

469466
return `
470467
if (${valueTest}) {
471-
${writeField(valueTest.includes('opts.writeDefaults === true'))}
468+
${writeField()}
472469
}`
473470
}).join('\n')
474471

packages/protons/test/fixtures/basic.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export namespace Basic {
2828
w.string(obj.foo)
2929
}
3030

31-
if (opts.writeDefaults === true || (obj.num != null && obj.num !== 0)) {
31+
if ((obj.num != null && obj.num !== 0)) {
3232
w.uint32(16)
33-
w.int32(obj.num ?? 0)
33+
w.int32(obj.num)
3434
}
3535

3636
if (opts.lengthDelimited !== false) {

packages/protons/test/fixtures/bitswap.ts

+20-20
Original file line numberDiff line numberDiff line change
@@ -57,29 +57,29 @@ export namespace Message {
5757
w.fork()
5858
}
5959

60-
if (opts.writeDefaults === true || (obj.block != null && obj.block.byteLength > 0)) {
60+
if ((obj.block != null && obj.block.byteLength > 0)) {
6161
w.uint32(10)
62-
w.bytes(obj.block ?? new Uint8Array(0))
62+
w.bytes(obj.block)
6363
}
6464

65-
if (opts.writeDefaults === true || (obj.priority != null && obj.priority !== 0)) {
65+
if ((obj.priority != null && obj.priority !== 0)) {
6666
w.uint32(16)
67-
w.int32(obj.priority ?? 0)
67+
w.int32(obj.priority)
6868
}
6969

7070
if (obj.cancel != null) {
7171
w.uint32(24)
7272
w.bool(obj.cancel)
7373
}
7474

75-
if (opts.writeDefaults === true || (obj.wantType != null && __WantTypeValues[obj.wantType] !== 0)) {
75+
if (obj.wantType != null && __WantTypeValues[obj.wantType] !== 0) {
7676
w.uint32(32)
77-
Message.Wantlist.WantType.codec().encode(obj.wantType ?? Message.Wantlist.WantType.Block, w)
77+
Message.Wantlist.WantType.codec().encode(obj.wantType, w)
7878
}
7979

80-
if (opts.writeDefaults === true || (obj.sendDontHave != null && obj.sendDontHave !== false)) {
80+
if ((obj.sendDontHave != null && obj.sendDontHave !== false)) {
8181
w.uint32(40)
82-
w.bool(obj.sendDontHave ?? false)
82+
w.bool(obj.sendDontHave)
8383
}
8484

8585
if (opts.lengthDelimited !== false) {
@@ -152,9 +152,9 @@ export namespace Message {
152152
}
153153
}
154154

155-
if (opts.writeDefaults === true || (obj.full != null && obj.full !== false)) {
155+
if ((obj.full != null && obj.full !== false)) {
156156
w.uint32(16)
157-
w.bool(obj.full ?? false)
157+
w.bool(obj.full)
158158
}
159159

160160
if (opts.lengthDelimited !== false) {
@@ -215,14 +215,14 @@ export namespace Message {
215215
w.fork()
216216
}
217217

218-
if (opts.writeDefaults === true || (obj.prefix != null && obj.prefix.byteLength > 0)) {
218+
if ((obj.prefix != null && obj.prefix.byteLength > 0)) {
219219
w.uint32(10)
220-
w.bytes(obj.prefix ?? new Uint8Array(0))
220+
w.bytes(obj.prefix)
221221
}
222222

223-
if (opts.writeDefaults === true || (obj.data != null && obj.data.byteLength > 0)) {
223+
if ((obj.data != null && obj.data.byteLength > 0)) {
224224
w.uint32(18)
225-
w.bytes(obj.data ?? new Uint8Array(0))
225+
w.bytes(obj.data)
226226
}
227227

228228
if (opts.lengthDelimited !== false) {
@@ -299,14 +299,14 @@ export namespace Message {
299299
w.fork()
300300
}
301301

302-
if (opts.writeDefaults === true || (obj.cid != null && obj.cid.byteLength > 0)) {
302+
if ((obj.cid != null && obj.cid.byteLength > 0)) {
303303
w.uint32(10)
304-
w.bytes(obj.cid ?? new Uint8Array(0))
304+
w.bytes(obj.cid)
305305
}
306306

307-
if (opts.writeDefaults === true || (obj.type != null && __BlockPresenceTypeValues[obj.type] !== 0)) {
307+
if (obj.type != null && __BlockPresenceTypeValues[obj.type] !== 0) {
308308
w.uint32(16)
309-
Message.BlockPresenceType.codec().encode(obj.type ?? Message.BlockPresenceType.Have, w)
309+
Message.BlockPresenceType.codec().encode(obj.type, w)
310310
}
311311

312312
if (opts.lengthDelimited !== false) {
@@ -387,9 +387,9 @@ export namespace Message {
387387
}
388388
}
389389

390-
if (opts.writeDefaults === true || (obj.pendingBytes != null && obj.pendingBytes !== 0)) {
390+
if ((obj.pendingBytes != null && obj.pendingBytes !== 0)) {
391391
w.uint32(40)
392-
w.int32(obj.pendingBytes ?? 0)
392+
w.int32(obj.pendingBytes)
393393
}
394394

395395
if (opts.lengthDelimited !== false) {

packages/protons/test/fixtures/circuit.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ export namespace CircuitRelay {
9595
w.fork()
9696
}
9797

98-
if (opts.writeDefaults === true || (obj.id != null && obj.id.byteLength > 0)) {
98+
if ((obj.id != null && obj.id.byteLength > 0)) {
9999
w.uint32(10)
100-
w.bytes(obj.id ?? new Uint8Array(0))
100+
w.bytes(obj.id)
101101
}
102102

103103
if (obj.addrs != null) {

0 commit comments

Comments
 (0)