@bufbuild/protobuf 0.0.1-alpha.1 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/cjs/binary-encoding.js +402 -410
- package/dist/cjs/descriptor-registry.js +407 -449
- package/dist/cjs/descriptor-set.js +416 -513
- package/dist/cjs/field.js +30 -30
- package/dist/cjs/google/protobuf/any_pb.js +122 -140
- package/dist/cjs/google/protobuf/api_pb.js +177 -224
- package/dist/cjs/google/protobuf/compiler/plugin_pb.js +125 -227
- package/dist/cjs/google/protobuf/descriptor_pb.js +1029 -1888
- package/dist/cjs/google/protobuf/duration_pb.js +72 -88
- package/dist/cjs/google/protobuf/empty_pb.js +17 -17
- package/dist/cjs/google/protobuf/field_mask_pb.js +77 -94
- package/dist/cjs/google/protobuf/source_context_pb.js +25 -25
- package/dist/cjs/google/protobuf/struct_pb.js +144 -181
- package/dist/cjs/google/protobuf/timestamp_pb.js +86 -123
- package/dist/cjs/google/protobuf/type_pb.js +406 -462
- package/dist/cjs/google/protobuf/wrappers_pb.js +407 -470
- package/dist/cjs/index.js +24 -122
- package/dist/cjs/message.js +81 -89
- package/dist/cjs/private/assert.js +20 -26
- package/dist/cjs/private/base64.js +79 -78
- package/dist/cjs/private/binary-format-common.js +195 -208
- package/dist/cjs/private/binary-format-proto2.js +75 -109
- package/dist/cjs/private/binary-format-proto3.js +57 -90
- package/dist/cjs/private/enum.js +38 -43
- package/dist/cjs/private/field-list.js +51 -50
- package/dist/cjs/private/field-wrapper.js +8 -10
- package/dist/cjs/private/field.js +22 -25
- package/dist/cjs/private/goog-varint.js +275 -0
- package/dist/cjs/private/json-format-common.js +414 -440
- package/dist/cjs/private/json-format-proto2.js +78 -89
- package/dist/cjs/private/json-format-proto3.js +69 -93
- package/dist/cjs/private/message-type.js +26 -27
- package/dist/cjs/private/names.js +58 -62
- package/dist/cjs/private/proto-runtime.js +11 -16
- package/dist/cjs/private/scalars.js +100 -103
- package/dist/cjs/private/util-common.js +180 -210
- package/dist/cjs/proto-int64.js +111 -112
- package/dist/cjs/proto2.js +50 -63
- package/dist/cjs/proto3.js +61 -74
- package/dist/cjs/service-type.js +14 -17
- package/dist/cjs/type-registry.js +33 -31
- package/dist/esm/binary-encoding.js +401 -414
- package/dist/esm/descriptor-registry.js +409 -458
- package/dist/esm/descriptor-set.js +417 -478
- package/dist/esm/field.js +29 -29
- package/dist/esm/google/protobuf/any_pb.js +122 -140
- package/dist/esm/google/protobuf/api_pb.js +177 -197
- package/dist/esm/google/protobuf/compiler/plugin_pb.js +123 -216
- package/dist/esm/google/protobuf/descriptor_pb.js +1013 -1804
- package/dist/esm/google/protobuf/duration_pb.js +72 -88
- package/dist/esm/google/protobuf/empty_pb.js +17 -17
- package/dist/esm/google/protobuf/field_mask_pb.js +77 -94
- package/dist/esm/google/protobuf/source_context_pb.js +25 -25
- package/dist/esm/google/protobuf/struct_pb.js +143 -180
- package/dist/esm/google/protobuf/timestamp_pb.js +86 -123
- package/dist/esm/google/protobuf/type_pb.js +401 -421
- package/dist/esm/google/protobuf/wrappers_pb.js +406 -397
- package/dist/esm/index.js +1 -1
- package/dist/esm/message.js +81 -89
- package/dist/esm/private/assert.js +19 -21
- package/dist/esm/private/base64.js +79 -78
- package/dist/esm/private/binary-format-common.js +196 -207
- package/dist/esm/private/binary-format-proto2.js +76 -81
- package/dist/esm/private/binary-format-proto3.js +58 -67
- package/dist/esm/private/enum.js +38 -43
- package/dist/esm/private/field-list.js +51 -50
- package/dist/esm/private/field-wrapper.js +8 -10
- package/dist/esm/private/field.js +22 -22
- package/dist/esm/private/goog-varint.js +266 -0
- package/dist/esm/private/json-format-common.js +414 -435
- package/dist/esm/private/json-format-proto2.js +76 -81
- package/dist/esm/private/json-format-proto3.js +66 -80
- package/dist/esm/private/message-type.js +27 -28
- package/dist/esm/private/names.js +57 -57
- package/dist/esm/private/proto-runtime.js +11 -11
- package/dist/esm/private/scalars.js +99 -99
- package/dist/esm/private/util-common.js +180 -192
- package/dist/esm/proto-int64.js +111 -112
- package/dist/esm/proto2.js +50 -57
- package/dist/esm/proto3.js +61 -68
- package/dist/esm/service-type.js +12 -12
- package/dist/esm/type-registry.js +33 -31
- package/dist/types/binary-encoding.d.ts +398 -398
- package/dist/types/binary-format.d.ts +69 -91
- package/dist/types/descriptor-registry.d.ts +23 -29
- package/dist/types/descriptor-set.d.ts +107 -128
- package/dist/types/enum.d.ts +21 -21
- package/dist/types/field-list.d.ts +21 -21
- package/dist/types/field.d.ts +191 -231
- package/dist/types/google/protobuf/any_pb.d.ts +56 -77
- package/dist/types/google/protobuf/api_pb.d.ts +144 -187
- package/dist/types/google/protobuf/compiler/plugin_pb.d.ts +195 -257
- package/dist/types/google/protobuf/descriptor_pb.d.ts +1360 -1737
- package/dist/types/google/protobuf/duration_pb.d.ts +30 -50
- package/dist/types/google/protobuf/empty_pb.d.ts +9 -28
- package/dist/types/google/protobuf/field_mask_pb.d.ts +17 -37
- package/dist/types/google/protobuf/source_context_pb.d.ts +16 -35
- package/dist/types/google/protobuf/struct_pb.d.ts +64 -115
- package/dist/types/google/protobuf/timestamp_pb.d.ts +31 -51
- package/dist/types/google/protobuf/type_pb.d.ts +355 -422
- package/dist/types/google/protobuf/wrappers_pb.d.ts +181 -297
- package/dist/types/index.d.ts +4 -27
- package/dist/types/json-format.d.ts +70 -89
- package/dist/types/message-type.d.ts +38 -46
- package/dist/types/message.d.ts +73 -99
- package/dist/types/private/assert.d.ts +1 -4
- package/dist/types/private/binary-format-common.d.ts +6 -32
- package/dist/types/private/enum.d.ts +4 -11
- package/dist/types/private/field-list.d.ts +14 -21
- package/dist/types/private/field-wrapper.d.ts +5 -11
- package/dist/types/private/field.d.ts +12 -12
- package/dist/types/{google/varint.d.ts → private/goog-varint.d.ts} +6 -13
- package/dist/types/private/json-format-common.d.ts +5 -27
- package/dist/types/private/message-type.d.ts +3 -8
- package/dist/types/private/names.d.ts +1 -4
- package/dist/types/private/options-map.d.ts +1 -1
- package/dist/types/private/proto-runtime.d.ts +29 -42
- package/dist/types/private/scalars.d.ts +5 -12
- package/dist/types/private/util-common.d.ts +1 -4
- package/dist/types/private/util.d.ts +29 -41
- package/dist/types/proto-int64.d.ts +42 -42
- package/dist/types/service-type.d.ts +37 -57
- package/dist/types/type-registry.d.ts +13 -15
- package/package.json +2 -2
- package/dist/cjs/google/varint.js +0 -280
- package/dist/esm/google/varint.js +0 -265
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryReader, BinaryWriter, WireType } from "../binary-encoding.js";
|
|
1
|
+
import { BinaryReader, BinaryWriter, WireType, } from "../binary-encoding.js";
|
|
2
2
|
import { ScalarType } from "../field.js";
|
|
3
3
|
import { unwrapField, wrapField } from "./field-wrapper.js";
|
|
4
4
|
import { scalarDefaultValue, scalarTypeInfo } from "./scalars.js";
|
|
@@ -7,237 +7,226 @@ import { assert } from "./assert.js";
|
|
|
7
7
|
const unknownFieldsSymbol = Symbol("@bufbuild/protobuf/unknown-fields");
|
|
8
8
|
// Default options for parsing binary data.
|
|
9
9
|
const readDefaults = {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
readUnknownFields: true,
|
|
11
|
+
readerFactory: (bytes) => new BinaryReader(bytes),
|
|
12
12
|
};
|
|
13
13
|
// Default options for serializing binary data.
|
|
14
14
|
const writeDefaults = {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
writeUnknownFields: true,
|
|
16
|
+
writerFactory: () => new BinaryWriter(),
|
|
17
17
|
};
|
|
18
18
|
function makeReadOptions(options) {
|
|
19
|
-
|
|
19
|
+
return options ? { ...readDefaults, ...options } : readDefaults;
|
|
20
20
|
}
|
|
21
21
|
function makeWriteOptions(options) {
|
|
22
|
-
|
|
22
|
+
return options ? { ...writeDefaults, ...options } : writeDefaults;
|
|
23
23
|
}
|
|
24
24
|
export function makeBinaryFormatCommon() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
onUnknownField(message, no, wireType, data) {
|
|
44
|
-
const m = message;
|
|
45
|
-
if (!Array.isArray(m[unknownFieldsSymbol])) {
|
|
46
|
-
m[unknownFieldsSymbol] = [];
|
|
47
|
-
}
|
|
48
|
-
m[unknownFieldsSymbol].push({ no, wireType, data });
|
|
49
|
-
},
|
|
50
|
-
readMessage(message, reader, length, options) {
|
|
51
|
-
const type = message.getType();
|
|
52
|
-
const end = length === undefined ? reader.len : reader.pos + length;
|
|
53
|
-
while (reader.pos < end) {
|
|
54
|
-
const [fieldNo, wireType] = reader.tag(),
|
|
55
|
-
field = type.fields.find(fieldNo);
|
|
56
|
-
if (!field) {
|
|
57
|
-
const data = reader.skip(wireType);
|
|
58
|
-
if (options.readUnknownFields) {
|
|
59
|
-
this.onUnknownField(message, fieldNo, wireType, data);
|
|
60
|
-
}
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
let target = message,
|
|
64
|
-
repeated = field.repeated,
|
|
65
|
-
localName = field.localName;
|
|
66
|
-
if (field.oneof) {
|
|
67
|
-
target = target[field.oneof.localName];
|
|
68
|
-
if (target.case != localName) {
|
|
69
|
-
delete target.value;
|
|
70
|
-
}
|
|
71
|
-
target.case = localName;
|
|
72
|
-
localName = "value";
|
|
73
|
-
}
|
|
74
|
-
switch (field.kind) {
|
|
75
|
-
case "scalar":
|
|
76
|
-
case "enum":
|
|
77
|
-
const scalarType =
|
|
78
|
-
field.kind == "enum" ? ScalarType.INT32 : field.T;
|
|
79
|
-
if (repeated) {
|
|
80
|
-
let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
|
|
81
|
-
if (
|
|
82
|
-
wireType == WireType.LengthDelimited &&
|
|
83
|
-
scalarType != ScalarType.STRING &&
|
|
84
|
-
scalarType != ScalarType.BYTES
|
|
85
|
-
) {
|
|
86
|
-
let e = reader.uint32() + reader.pos;
|
|
87
|
-
while (reader.pos < e) {
|
|
88
|
-
arr.push(readScalar(reader, scalarType));
|
|
25
|
+
return {
|
|
26
|
+
makeReadOptions,
|
|
27
|
+
makeWriteOptions,
|
|
28
|
+
listUnknownFields(message) {
|
|
29
|
+
return message[unknownFieldsSymbol] ?? [];
|
|
30
|
+
},
|
|
31
|
+
discardUnknownFields(message) {
|
|
32
|
+
delete message[unknownFieldsSymbol];
|
|
33
|
+
},
|
|
34
|
+
writeUnknownFields(message, writer) {
|
|
35
|
+
const m = message;
|
|
36
|
+
const c = m[unknownFieldsSymbol];
|
|
37
|
+
if (c) {
|
|
38
|
+
for (const f of c) {
|
|
39
|
+
writer.tag(f.no, f.wireType).raw(f.data);
|
|
89
40
|
}
|
|
90
|
-
} else {
|
|
91
|
-
arr.push(readScalar(reader, scalarType));
|
|
92
|
-
}
|
|
93
|
-
} else {
|
|
94
|
-
target[localName] = readScalar(reader, scalarType);
|
|
95
41
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
if (
|
|
100
|
-
|
|
101
|
-
target[localName].push(
|
|
102
|
-
messageType.fromBinary(reader.bytes(), options)
|
|
103
|
-
);
|
|
104
|
-
} else {
|
|
105
|
-
if (target[localName] instanceof messageType) {
|
|
106
|
-
target[localName].fromBinary(reader.bytes(), options);
|
|
107
|
-
} else {
|
|
108
|
-
target[localName] = unwrapField(
|
|
109
|
-
messageType,
|
|
110
|
-
messageType.fromBinary(reader.bytes(), options)
|
|
111
|
-
);
|
|
112
|
-
}
|
|
42
|
+
},
|
|
43
|
+
onUnknownField(message, no, wireType, data) {
|
|
44
|
+
const m = message;
|
|
45
|
+
if (!Array.isArray(m[unknownFieldsSymbol])) {
|
|
46
|
+
m[unknownFieldsSymbol] = [];
|
|
113
47
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
48
|
+
m[unknownFieldsSymbol].push({ no, wireType, data });
|
|
49
|
+
},
|
|
50
|
+
readMessage(message, reader, length, options) {
|
|
51
|
+
const type = message.getType();
|
|
52
|
+
const end = length === undefined ? reader.len : reader.pos + length;
|
|
53
|
+
while (reader.pos < end) {
|
|
54
|
+
const [fieldNo, wireType] = reader.tag(), field = type.fields.find(fieldNo);
|
|
55
|
+
if (!field) {
|
|
56
|
+
const data = reader.skip(wireType);
|
|
57
|
+
if (options.readUnknownFields) {
|
|
58
|
+
this.onUnknownField(message, fieldNo, wireType, data);
|
|
59
|
+
}
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
let target = message, repeated = field.repeated, localName = field.localName;
|
|
63
|
+
if (field.oneof) {
|
|
64
|
+
target = target[field.oneof.localName];
|
|
65
|
+
if (target.case != localName) {
|
|
66
|
+
delete target.value;
|
|
67
|
+
}
|
|
68
|
+
target.case = localName;
|
|
69
|
+
localName = "value";
|
|
70
|
+
}
|
|
71
|
+
switch (field.kind) {
|
|
72
|
+
case "scalar":
|
|
73
|
+
case "enum":
|
|
74
|
+
const scalarType = field.kind == "enum" ? ScalarType.INT32 : field.T;
|
|
75
|
+
if (repeated) {
|
|
76
|
+
let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values
|
|
77
|
+
if (wireType == WireType.LengthDelimited &&
|
|
78
|
+
scalarType != ScalarType.STRING &&
|
|
79
|
+
scalarType != ScalarType.BYTES) {
|
|
80
|
+
let e = reader.uint32() + reader.pos;
|
|
81
|
+
while (reader.pos < e) {
|
|
82
|
+
arr.push(readScalar(reader, scalarType));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
arr.push(readScalar(reader, scalarType));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
target[localName] = readScalar(reader, scalarType);
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
case "message":
|
|
94
|
+
const messageType = field.T;
|
|
95
|
+
if (repeated) {
|
|
96
|
+
// safe to assume presence of array, oneof cannot contain repeated values
|
|
97
|
+
target[localName].push(messageType.fromBinary(reader.bytes(), options));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
if (target[localName] instanceof messageType) {
|
|
101
|
+
target[localName].fromBinary(reader.bytes(), options);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
target[localName] = unwrapField(messageType, messageType.fromBinary(reader.bytes(), options));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case "map":
|
|
109
|
+
let [mapKey, mapVal] = readMapEntry(field, reader, options);
|
|
110
|
+
// safe to assume presence of map object, oneof cannot contain repeated values
|
|
111
|
+
target[localName][mapKey] = mapVal;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
};
|
|
124
117
|
}
|
|
125
118
|
// Read a map field, expecting key field = 1, value field = 2
|
|
126
119
|
function readMapEntry(field, reader, options) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
120
|
+
const length = reader.uint32(), end = reader.pos + length;
|
|
121
|
+
let key, val;
|
|
122
|
+
while (reader.pos < end) {
|
|
123
|
+
let [fieldNo] = reader.tag();
|
|
124
|
+
switch (fieldNo) {
|
|
125
|
+
case 1:
|
|
126
|
+
key = readScalar(reader, field.K);
|
|
127
|
+
break;
|
|
128
|
+
case 2:
|
|
129
|
+
switch (field.V.kind) {
|
|
130
|
+
case "scalar":
|
|
131
|
+
val = readScalar(reader, field.V.T);
|
|
132
|
+
break;
|
|
133
|
+
case "enum":
|
|
134
|
+
val = reader.int32();
|
|
135
|
+
break;
|
|
136
|
+
case "message":
|
|
137
|
+
val = field.V.T.fromBinary(reader.bytes(), options);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
147
141
|
}
|
|
148
|
-
break;
|
|
149
142
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
key = key.toString();
|
|
157
|
-
}
|
|
158
|
-
if (val === undefined) {
|
|
159
|
-
switch (field.V.kind) {
|
|
160
|
-
case "scalar":
|
|
161
|
-
val = scalarDefaultValue(field.V.T);
|
|
162
|
-
break;
|
|
163
|
-
case "enum":
|
|
164
|
-
val = 0;
|
|
165
|
-
break;
|
|
166
|
-
case "message":
|
|
167
|
-
val = new field.V.T();
|
|
168
|
-
break;
|
|
143
|
+
if (key === undefined) {
|
|
144
|
+
let keyRaw = scalarDefaultValue(field.K);
|
|
145
|
+
key =
|
|
146
|
+
field.K == ScalarType.BOOL
|
|
147
|
+
? keyRaw.toString()
|
|
148
|
+
: keyRaw;
|
|
169
149
|
}
|
|
170
|
-
|
|
171
|
-
|
|
150
|
+
if (typeof key != "string" && typeof key != "number") {
|
|
151
|
+
key = key.toString();
|
|
152
|
+
}
|
|
153
|
+
if (val === undefined) {
|
|
154
|
+
switch (field.V.kind) {
|
|
155
|
+
case "scalar":
|
|
156
|
+
val = scalarDefaultValue(field.V.T);
|
|
157
|
+
break;
|
|
158
|
+
case "enum":
|
|
159
|
+
val = 0;
|
|
160
|
+
break;
|
|
161
|
+
case "message":
|
|
162
|
+
val = new field.V.T();
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return [key, val];
|
|
172
167
|
}
|
|
173
168
|
function readScalar(reader, type) {
|
|
174
|
-
|
|
175
|
-
|
|
169
|
+
let [, method] = scalarTypeInfo(type);
|
|
170
|
+
return reader[method]();
|
|
176
171
|
}
|
|
177
172
|
export function writeMapEntry(writer, options, field, key, value) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
173
|
+
writer.tag(field.no, WireType.LengthDelimited);
|
|
174
|
+
writer.fork();
|
|
175
|
+
// javascript only allows number or string for object properties
|
|
176
|
+
// we convert from our representation to the protobuf type
|
|
177
|
+
let keyValue = key;
|
|
178
|
+
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- we deliberately handle just the special cases for map keys
|
|
179
|
+
switch (field.K) {
|
|
180
|
+
case ScalarType.INT32:
|
|
181
|
+
case ScalarType.FIXED32:
|
|
182
|
+
case ScalarType.UINT32:
|
|
183
|
+
case ScalarType.SFIXED32:
|
|
184
|
+
case ScalarType.SINT32:
|
|
185
|
+
keyValue = Number.parseInt(key);
|
|
186
|
+
break;
|
|
187
|
+
case ScalarType.BOOL:
|
|
188
|
+
assert(key == "true" || key == "false");
|
|
189
|
+
keyValue = key == "true";
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
// write key, expecting key field number = 1
|
|
193
|
+
writeScalar(writer, field.K, 1, keyValue, true);
|
|
194
|
+
// write value, expecting value field number = 2
|
|
195
|
+
switch (field.V.kind) {
|
|
196
|
+
case "scalar":
|
|
197
|
+
writeScalar(writer, field.V.T, 2, value, true);
|
|
198
|
+
break;
|
|
199
|
+
case "enum":
|
|
200
|
+
writeScalar(writer, ScalarType.INT32, 2, value, true);
|
|
201
|
+
break;
|
|
202
|
+
case "message":
|
|
203
|
+
writeMessageField(writer, options, field.V.T, 2, value);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
writer.join();
|
|
212
207
|
}
|
|
213
208
|
export function writeMessageField(writer, options, type, fieldNo, value) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
209
|
+
if (value !== undefined) {
|
|
210
|
+
const message = wrapField(type, value);
|
|
211
|
+
writer
|
|
212
|
+
.tag(fieldNo, WireType.LengthDelimited)
|
|
213
|
+
.bytes(message.toBinary(options));
|
|
214
|
+
}
|
|
220
215
|
}
|
|
221
|
-
export function writeScalar(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
emitIntrinsicDefault
|
|
227
|
-
) {
|
|
228
|
-
let [wireType, method, isIntrinsicDefault] = scalarTypeInfo(type, value);
|
|
229
|
-
if (!isIntrinsicDefault || emitIntrinsicDefault) {
|
|
230
|
-
writer.tag(fieldNo, wireType)[method](value);
|
|
231
|
-
}
|
|
216
|
+
export function writeScalar(writer, type, fieldNo, value, emitIntrinsicDefault) {
|
|
217
|
+
let [wireType, method, isIntrinsicDefault] = scalarTypeInfo(type, value);
|
|
218
|
+
if (!isIntrinsicDefault || emitIntrinsicDefault) {
|
|
219
|
+
writer.tag(fieldNo, wireType)[method](value);
|
|
220
|
+
}
|
|
232
221
|
}
|
|
233
222
|
export function writePacked(writer, type, fieldNo, value) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
223
|
+
if (!value.length) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
writer.tag(fieldNo, WireType.LengthDelimited).fork();
|
|
227
|
+
let [, method] = scalarTypeInfo(type);
|
|
228
|
+
for (let i = 0; i < value.length; i++) {
|
|
229
|
+
writer[method](value[i]);
|
|
230
|
+
}
|
|
231
|
+
writer.join();
|
|
243
232
|
}
|
|
@@ -1,87 +1,82 @@
|
|
|
1
1
|
import { ScalarType } from "../field.js";
|
|
2
|
-
import {
|
|
3
|
-
makeBinaryFormatCommon,
|
|
4
|
-
writeMapEntry,
|
|
5
|
-
writeMessageField,
|
|
6
|
-
writePacked,
|
|
7
|
-
writeScalar,
|
|
8
|
-
} from "./binary-format-common.js";
|
|
2
|
+
import { makeBinaryFormatCommon, writeMapEntry, writeMessageField, writePacked, writeScalar, } from "./binary-format-common.js";
|
|
9
3
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions, no-case-declarations, prefer-const */
|
|
10
4
|
export function makeBinaryFormatProto2() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
5
|
+
return {
|
|
6
|
+
...makeBinaryFormatCommon(),
|
|
7
|
+
writeMessage(message, writer, options) {
|
|
8
|
+
const type = message.getType();
|
|
9
|
+
let field;
|
|
10
|
+
try {
|
|
11
|
+
for (field of type.fields.byNumber()) {
|
|
12
|
+
let value, // this will be our field value, whether it is member of a oneof or not
|
|
13
|
+
repeated = field.repeated, localName = field.localName;
|
|
14
|
+
if (field.oneof) {
|
|
15
|
+
const oneof = message[field.oneof.localName];
|
|
16
|
+
if (oneof.case !== localName) {
|
|
17
|
+
continue; // field is not selected, skip
|
|
18
|
+
}
|
|
19
|
+
value = oneof.value;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
value = message[localName];
|
|
23
|
+
// In contrast to proto3, we raise an error if a non-optional (proto2 required)
|
|
24
|
+
// field is missing a value.
|
|
25
|
+
if (value === undefined && !field.oneof && !field.opt) {
|
|
26
|
+
throw new Error(`cannot encode field ${type.typeName}.${field.name} to JSON: required field not set`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
switch (field.kind) {
|
|
30
|
+
case "scalar":
|
|
31
|
+
case "enum":
|
|
32
|
+
let scalarType = field.kind == "enum" ? ScalarType.INT32 : field.T;
|
|
33
|
+
if (repeated) {
|
|
34
|
+
if (field.packed) {
|
|
35
|
+
writePacked(writer, scalarType, field.no, value);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
for (const item of value) {
|
|
39
|
+
writeScalar(writer, scalarType, field.no, item, true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (value !== undefined) {
|
|
45
|
+
// In contrast to proto3, we do not skip intrinsic default values.
|
|
46
|
+
// Explicit default values are not special cased either.
|
|
47
|
+
writeScalar(writer, scalarType, field.no, value, true);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case "message":
|
|
52
|
+
if (repeated) {
|
|
53
|
+
for (const item of value) {
|
|
54
|
+
writeMessageField(writer, options, field.T, field.no, item);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
writeMessageField(writer, options, field.T, field.no, value);
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
case "map":
|
|
62
|
+
for (const [key, val] of Object.entries(value)) {
|
|
63
|
+
writeMapEntry(writer, options, field, key, val);
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
25
68
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
throw new Error(
|
|
33
|
-
`cannot encode field ${type.typeName}.${field.name} to JSON: required field not set`
|
|
34
|
-
);
|
|
69
|
+
catch (e) {
|
|
70
|
+
let m = field
|
|
71
|
+
? `cannot encode field ${type.typeName}.${field?.name} to binary`
|
|
72
|
+
: `cannot encode message ${type.typeName} to binary`;
|
|
73
|
+
let r = e instanceof Error ? e.message : String(e);
|
|
74
|
+
throw new Error(m + (r.length > 0 ? `: ${r}` : ""));
|
|
35
75
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (repeated) {
|
|
43
|
-
if (field.packed) {
|
|
44
|
-
writePacked(writer, scalarType, field.no, value);
|
|
45
|
-
} else {
|
|
46
|
-
for (const item of value) {
|
|
47
|
-
writeScalar(writer, scalarType, field.no, item, true);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
if (value !== undefined) {
|
|
52
|
-
// In contrast to proto3, we do not skip intrinsic default values.
|
|
53
|
-
// Explicit default values are not special cased either.
|
|
54
|
-
writeScalar(writer, scalarType, field.no, value, true);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
break;
|
|
58
|
-
case "message":
|
|
59
|
-
if (repeated) {
|
|
60
|
-
for (const item of value) {
|
|
61
|
-
writeMessageField(writer, options, field.T, field.no, item);
|
|
62
|
-
}
|
|
63
|
-
} else {
|
|
64
|
-
writeMessageField(writer, options, field.T, field.no, value);
|
|
65
|
-
}
|
|
66
|
-
break;
|
|
67
|
-
case "map":
|
|
68
|
-
for (const [key, val] of Object.entries(value)) {
|
|
69
|
-
writeMapEntry(writer, options, field, key, val);
|
|
70
|
-
}
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
} catch (e) {
|
|
75
|
-
let m = field
|
|
76
|
-
? `cannot encode field ${type.typeName}.${field?.name} to binary`
|
|
77
|
-
: `cannot encode message ${type.typeName} to binary`;
|
|
78
|
-
let r = e instanceof Error ? e.message : String(e);
|
|
79
|
-
throw new Error(m + (r.length > 0 ? `: ${r}` : ""));
|
|
80
|
-
}
|
|
81
|
-
if (options.writeUnknownFields) {
|
|
82
|
-
this.writeUnknownFields(message, writer);
|
|
83
|
-
}
|
|
84
|
-
return writer;
|
|
85
|
-
},
|
|
86
|
-
};
|
|
76
|
+
if (options.writeUnknownFields) {
|
|
77
|
+
this.writeUnknownFields(message, writer);
|
|
78
|
+
}
|
|
79
|
+
return writer;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
87
82
|
}
|