@trpc-proto/runtime 0.1.0
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/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/batch/grpcweb/direct_dispatcher.d.ts +10 -0
- package/dist/batch/grpcweb/direct_dispatcher.d.ts.map +1 -0
- package/dist/batch/grpcweb/direct_dispatcher.js +71 -0
- package/dist/batch/grpcweb/direct_dispatcher.js.map +1 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.d.ts +5 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.d.ts.map +1 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.js +62 -0
- package/dist/batch/grpcweb/forwarding_dispatcher.js.map +1 -0
- package/dist/batch/index.d.ts +5 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +4 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/batch/link/web_link.d.ts +18 -0
- package/dist/batch/link/web_link.d.ts.map +1 -0
- package/dist/batch/link/web_link.js +216 -0
- package/dist/batch/link/web_link.js.map +1 -0
- package/dist/batch/proto/batch_router.d.ts +41 -0
- package/dist/batch/proto/batch_router.d.ts.map +1 -0
- package/dist/batch/proto/batch_router.js +59 -0
- package/dist/batch/proto/batch_router.js.map +1 -0
- package/dist/batch/proto/generated/schema.d.ts +262 -0
- package/dist/batch/proto/generated/schema.d.ts.map +1 -0
- package/dist/batch/proto/generated/schema.js +327 -0
- package/dist/batch/proto/generated/schema.js.map +1 -0
- package/dist/batch/proto/wire.d.ts +42 -0
- package/dist/batch/proto/wire.d.ts.map +1 -0
- package/dist/batch/proto/wire.js +52 -0
- package/dist/batch/proto/wire.js.map +1 -0
- package/dist/grpc/client.d.ts +10 -0
- package/dist/grpc/client.d.ts.map +1 -0
- package/dist/grpc/client.js +62 -0
- package/dist/grpc/client.js.map +1 -0
- package/dist/grpc/link.d.ts +11 -0
- package/dist/grpc/link.d.ts.map +1 -0
- package/dist/grpc/link.js +10 -0
- package/dist/grpc/link.js.map +1 -0
- package/dist/grpc/proto_link.d.ts +56 -0
- package/dist/grpc/proto_link.d.ts.map +1 -0
- package/dist/grpc/proto_link.js +112 -0
- package/dist/grpc/proto_link.js.map +1 -0
- package/dist/grpc/server.d.ts +28 -0
- package/dist/grpc/server.d.ts.map +1 -0
- package/dist/grpc/server.js +113 -0
- package/dist/grpc/server.js.map +1 -0
- package/dist/grpc/status.d.ts +5 -0
- package/dist/grpc/status.d.ts.map +1 -0
- package/dist/grpc/status.js +42 -0
- package/dist/grpc/status.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/noop.d.ts +10 -0
- package/dist/noop.d.ts.map +1 -0
- package/dist/noop.js +12 -0
- package/dist/noop.js.map +1 -0
- package/dist/proto_codec/index.d.ts +3 -0
- package/dist/proto_codec/index.d.ts.map +1 -0
- package/dist/proto_codec/index.js +2 -0
- package/dist/proto_codec/index.js.map +1 -0
- package/dist/proto_codec/proto_codec.d.ts +24 -0
- package/dist/proto_codec/proto_codec.d.ts.map +1 -0
- package/dist/proto_codec/proto_codec.js +327 -0
- package/dist/proto_codec/proto_codec.js.map +1 -0
- package/dist/router_invoker.d.ts +12 -0
- package/dist/router_invoker.d.ts.map +1 -0
- package/dist/router_invoker.js +79 -0
- package/dist/router_invoker.js.map +1 -0
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web/codec/base64_codec.d.ts +7 -0
- package/dist/web/codec/base64_codec.d.ts.map +1 -0
- package/dist/web/codec/base64_codec.js +57 -0
- package/dist/web/codec/base64_codec.js.map +1 -0
- package/dist/web/codec/codec.d.ts +33 -0
- package/dist/web/codec/codec.d.ts.map +1 -0
- package/dist/web/codec/codec.js +11 -0
- package/dist/web/codec/codec.js.map +1 -0
- package/dist/web/codec/compression.d.ts +15 -0
- package/dist/web/codec/compression.d.ts.map +1 -0
- package/dist/web/codec/compression.js +32 -0
- package/dist/web/codec/compression.js.map +1 -0
- package/dist/web/codec/frame_codec.d.ts +20 -0
- package/dist/web/codec/frame_codec.d.ts.map +1 -0
- package/dist/web/codec/frame_codec.js +109 -0
- package/dist/web/codec/frame_codec.js.map +1 -0
- package/dist/web/codec/protocol_codec.d.ts +40 -0
- package/dist/web/codec/protocol_codec.d.ts.map +1 -0
- package/dist/web/codec/protocol_codec.js +162 -0
- package/dist/web/codec/protocol_codec.js.map +1 -0
- package/dist/web/content_type.d.ts +19 -0
- package/dist/web/content_type.d.ts.map +1 -0
- package/dist/web/content_type.js +42 -0
- package/dist/web/content_type.js.map +1 -0
- package/dist/web/dispatchers/direct.d.ts +10 -0
- package/dist/web/dispatchers/direct.d.ts.map +1 -0
- package/dist/web/dispatchers/direct.js +72 -0
- package/dist/web/dispatchers/direct.js.map +1 -0
- package/dist/web/dispatchers/forward.d.ts +5 -0
- package/dist/web/dispatchers/forward.d.ts.map +1 -0
- package/dist/web/dispatchers/forward.js +99 -0
- package/dist/web/dispatchers/forward.js.map +1 -0
- package/dist/web/dispatchers/types.d.ts +21 -0
- package/dist/web/dispatchers/types.d.ts.map +1 -0
- package/dist/web/dispatchers/types.js +2 -0
- package/dist/web/dispatchers/types.js.map +1 -0
- package/dist/web/fetch_call.d.ts +13 -0
- package/dist/web/fetch_call.d.ts.map +1 -0
- package/dist/web/fetch_call.js +126 -0
- package/dist/web/fetch_call.js.map +1 -0
- package/dist/web/http_handler.d.ts +65 -0
- package/dist/web/http_handler.d.ts.map +1 -0
- package/dist/web/http_handler.js +295 -0
- package/dist/web/http_handler.js.map +1 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +4 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/link.d.ts +26 -0
- package/dist/web/link.d.ts.map +1 -0
- package/dist/web/link.js +24 -0
- package/dist/web/link.js.map +1 -0
- package/dist/web/server.d.ts +33 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +77 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +90 -0
- package/src/batch/proto/generated/trpc_batch_v1.proto +40 -0
package/dist/noop.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Empty procedure body. tRPC requires a resolver; `.input()` / `.output()`
|
|
3
|
+
* are the contract. A non-TS service that implements the generated proto
|
|
4
|
+
* is the real backend.
|
|
5
|
+
*
|
|
6
|
+
* The generic return type lets schema-only procedures state their resolver
|
|
7
|
+
* output explicitly. At runtime the function returns `undefined`.
|
|
8
|
+
*/
|
|
9
|
+
export function noopForNonTsBackend(_opts) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=noop.js.map
|
package/dist/noop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop.js","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAI,KAAe;IACpD,OAAO,SAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proto_codec/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proto_codec/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ProtoSchema } from '@trpc-proto/schema_ir';
|
|
2
|
+
/** Reflected protobuf RPC used by transports. */
|
|
3
|
+
export interface RuntimeProtoRpc {
|
|
4
|
+
readonly service: string;
|
|
5
|
+
readonly method: RuntimeProtoMethod;
|
|
6
|
+
}
|
|
7
|
+
/** Reflected protobuf method metadata used by transports. */
|
|
8
|
+
export interface RuntimeProtoMethod {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly requestType: string;
|
|
11
|
+
readonly responseType: string;
|
|
12
|
+
readonly responseStream?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Runtime protobuf encoder, decoder, and RPC registry. */
|
|
15
|
+
export declare class ProtoCodec {
|
|
16
|
+
#private;
|
|
17
|
+
readonly schema: ProtoSchema;
|
|
18
|
+
constructor(schema: ProtoSchema);
|
|
19
|
+
lookupRpc(path: string): RuntimeProtoRpc | undefined;
|
|
20
|
+
lookupMethod(serviceName: string, methodName: string): RuntimeProtoMethod | undefined;
|
|
21
|
+
encode(messageName: string, value: unknown): Uint8Array;
|
|
22
|
+
decode(messageName: string, bytes: Uint8Array): unknown;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=proto_codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proto_codec.d.ts","sourceRoot":"","sources":["../../src/proto_codec/proto_codec.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,uBAAuB,CAAC;AAI/B,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAyWD,2DAA2D;AAC3D,qBAAa,UAAU;;IAGT,QAAQ,CAAC,MAAM,EAAE,WAAW;gBAAnB,MAAM,EAAE,WAAW;IAIxC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,YAAY,CACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,kBAAkB,GAAG,SAAS;IAIjC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU;IAMvD,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO;CAUxD"}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import protobuf from 'protobufjs';
|
|
2
|
+
import { toCamel, toPascalCase } from '@trpc-proto/utility';
|
|
3
|
+
import { protoServiceName, } from '@trpc-proto/schema_ir';
|
|
4
|
+
const DEFAULT_SERVICE_NAME = 'AppService';
|
|
5
|
+
function fieldTypeName(type) {
|
|
6
|
+
if (type.kind === 'scalar')
|
|
7
|
+
return type.type;
|
|
8
|
+
if (type.kind === 'map') {
|
|
9
|
+
throw new Error('map types use MapField');
|
|
10
|
+
}
|
|
11
|
+
return type.name;
|
|
12
|
+
}
|
|
13
|
+
function definePath(root, pkg) {
|
|
14
|
+
let ns = root;
|
|
15
|
+
for (const part of pkg.split('.').filter(Boolean)) {
|
|
16
|
+
ns = ns.define(part);
|
|
17
|
+
}
|
|
18
|
+
return ns;
|
|
19
|
+
}
|
|
20
|
+
function addWellKnown(root) {
|
|
21
|
+
const google = root.define('google').define('protobuf');
|
|
22
|
+
function add(name, fields) {
|
|
23
|
+
if (google.get(name))
|
|
24
|
+
return;
|
|
25
|
+
const type = new protobuf.Type(name);
|
|
26
|
+
for (const field of fields)
|
|
27
|
+
type.add(field);
|
|
28
|
+
google.add(type);
|
|
29
|
+
}
|
|
30
|
+
add('Empty', []);
|
|
31
|
+
add('Timestamp', [
|
|
32
|
+
new protobuf.Field('seconds', 1, 'int64'),
|
|
33
|
+
new protobuf.Field('nanos', 2, 'int32'),
|
|
34
|
+
]);
|
|
35
|
+
add('Duration', [
|
|
36
|
+
new protobuf.Field('seconds', 1, 'int64'),
|
|
37
|
+
new protobuf.Field('nanos', 2, 'int32'),
|
|
38
|
+
]);
|
|
39
|
+
add('FieldMask', [new protobuf.Field('paths', 1, 'string', 'repeated')]);
|
|
40
|
+
const wrappers = [
|
|
41
|
+
['DoubleValue', 'double'],
|
|
42
|
+
['FloatValue', 'float'],
|
|
43
|
+
['Int32Value', 'int32'],
|
|
44
|
+
['Int64Value', 'int64'],
|
|
45
|
+
['UInt32Value', 'uint32'],
|
|
46
|
+
['UInt64Value', 'uint64'],
|
|
47
|
+
['BoolValue', 'bool'],
|
|
48
|
+
['StringValue', 'string'],
|
|
49
|
+
['BytesValue', 'bytes'],
|
|
50
|
+
];
|
|
51
|
+
for (const [name, type] of wrappers) {
|
|
52
|
+
add(name, [new protobuf.Field('value', 1, type)]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function addMessageType(ns, message) {
|
|
56
|
+
const type = new protobuf.Type(message.name);
|
|
57
|
+
for (const nested of message.subMessages ?? []) {
|
|
58
|
+
addMessageType(type, nested);
|
|
59
|
+
}
|
|
60
|
+
const oneofs = new Map();
|
|
61
|
+
for (const field of message.fields) {
|
|
62
|
+
if (field.type.kind === 'map') {
|
|
63
|
+
type.add(new protobuf.MapField(field.name, field.number, field.type.key, fieldTypeName(field.type.value)));
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const rule = field.repeated ? 'repeated' : 'optional';
|
|
67
|
+
const pbField = new protobuf.Field(field.name, field.number, fieldTypeName(field.type), rule);
|
|
68
|
+
type.add(pbField);
|
|
69
|
+
if (field.oneof) {
|
|
70
|
+
let oneof = oneofs.get(field.oneof);
|
|
71
|
+
if (!oneof) {
|
|
72
|
+
oneof = new protobuf.OneOf(field.oneof);
|
|
73
|
+
type.add(oneof);
|
|
74
|
+
oneofs.set(field.oneof, oneof);
|
|
75
|
+
}
|
|
76
|
+
oneof.add(pbField);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
ns.add(type);
|
|
80
|
+
return type;
|
|
81
|
+
}
|
|
82
|
+
function buildRoot(schema) {
|
|
83
|
+
const root = new protobuf.Root();
|
|
84
|
+
addWellKnown(root);
|
|
85
|
+
const ns = definePath(root, schema.package);
|
|
86
|
+
for (const en of schema.enums) {
|
|
87
|
+
const created = new protobuf.Enum(en.name);
|
|
88
|
+
for (const value of en.values)
|
|
89
|
+
created.add(value.name, value.number);
|
|
90
|
+
ns.add(created);
|
|
91
|
+
}
|
|
92
|
+
for (const message of schema.messages) {
|
|
93
|
+
addMessageType(ns, message);
|
|
94
|
+
}
|
|
95
|
+
for (const service of schema.services) {
|
|
96
|
+
const created = new protobuf.Service(service.name);
|
|
97
|
+
for (const method of service.methods) {
|
|
98
|
+
const reflected = new protobuf.Method(method.name, 'rpc', method.requestType, method.responseType, false, method.isResponseStreaming);
|
|
99
|
+
created.add(reflected);
|
|
100
|
+
}
|
|
101
|
+
ns.add(created);
|
|
102
|
+
}
|
|
103
|
+
root.resolveAll();
|
|
104
|
+
return root;
|
|
105
|
+
}
|
|
106
|
+
function lookupType(root, schema, name) {
|
|
107
|
+
if (name.startsWith('google.protobuf.'))
|
|
108
|
+
return root.lookupType(name);
|
|
109
|
+
return root.lookupType(`${schema.package}.${name}`) ?? root.lookupType(name);
|
|
110
|
+
}
|
|
111
|
+
function lookupRootMethod(root, schema, serviceName, methodName) {
|
|
112
|
+
const service = root.lookup(`${schema.package}.${serviceName}`, protobuf.Service);
|
|
113
|
+
return service?.methods[methodName];
|
|
114
|
+
}
|
|
115
|
+
function lookupRootRpc(root, schema, path) {
|
|
116
|
+
const parts = path.split('.');
|
|
117
|
+
const methodName = toPascalCase(parts.pop() ?? path);
|
|
118
|
+
const service = parts.length === 0
|
|
119
|
+
? DEFAULT_SERVICE_NAME
|
|
120
|
+
: protoServiceName(parts.map(toPascalCase).join(''));
|
|
121
|
+
const method = lookupRootMethod(root, schema, service, methodName);
|
|
122
|
+
return method ? { service, method } : undefined;
|
|
123
|
+
}
|
|
124
|
+
function isWrapper(message) {
|
|
125
|
+
return message.fields.length === 1 && message.fields[0]?.name === 'value';
|
|
126
|
+
}
|
|
127
|
+
function findMessage(messages, name) {
|
|
128
|
+
if (!messages)
|
|
129
|
+
return undefined;
|
|
130
|
+
for (const message of messages) {
|
|
131
|
+
if (message.name === name)
|
|
132
|
+
return message;
|
|
133
|
+
const nested = findMessage(message.subMessages, name);
|
|
134
|
+
if (nested)
|
|
135
|
+
return nested;
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
function resolveMessage(schema, name, scope) {
|
|
140
|
+
if (scope) {
|
|
141
|
+
if (scope.name === name)
|
|
142
|
+
return scope;
|
|
143
|
+
const nested = findMessage(scope.subMessages, name);
|
|
144
|
+
if (nested)
|
|
145
|
+
return nested;
|
|
146
|
+
}
|
|
147
|
+
return findMessage(schema.messages, name);
|
|
148
|
+
}
|
|
149
|
+
function dateToTimestamp(value) {
|
|
150
|
+
const ms = value.getTime();
|
|
151
|
+
return {
|
|
152
|
+
seconds: Math.floor(ms / 1000),
|
|
153
|
+
nanos: (ms % 1000) * 1e6,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function timestampToDate(value) {
|
|
157
|
+
if (value instanceof Date)
|
|
158
|
+
return value;
|
|
159
|
+
if (!value || typeof value !== 'object')
|
|
160
|
+
return new Date(NaN);
|
|
161
|
+
const rec = value;
|
|
162
|
+
return new Date(Number(rec.seconds ?? 0) * 1000 + Number(rec.nanos ?? 0) / 1e6);
|
|
163
|
+
}
|
|
164
|
+
function toProtoValue(schema, type, value, scope) {
|
|
165
|
+
if (value == null)
|
|
166
|
+
return value;
|
|
167
|
+
if (type.kind === 'scalar' &&
|
|
168
|
+
(type.type === 'int64' || type.type === 'uint64' || type.type === 'sint64')) {
|
|
169
|
+
return typeof value === 'bigint' ? value.toString() : value;
|
|
170
|
+
}
|
|
171
|
+
if (type.kind === 'message' && type.name === 'google.protobuf.Timestamp') {
|
|
172
|
+
return value instanceof Date ? dateToTimestamp(value) : value;
|
|
173
|
+
}
|
|
174
|
+
if (type.kind === 'message') {
|
|
175
|
+
return toProtoObject(schema, type.name, value, scope);
|
|
176
|
+
}
|
|
177
|
+
if (type.kind === 'map' && value && typeof value === 'object') {
|
|
178
|
+
const out = {};
|
|
179
|
+
for (const [key, item] of Object.entries(value)) {
|
|
180
|
+
out[key] = toProtoValue(schema, type.value, item, scope);
|
|
181
|
+
}
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
function fromProtoValue(schema, type, value, scope) {
|
|
187
|
+
if (value == null)
|
|
188
|
+
return value;
|
|
189
|
+
if (type.kind === 'scalar' &&
|
|
190
|
+
(type.type === 'int64' || type.type === 'sint64')) {
|
|
191
|
+
return typeof value === 'bigint' ? value : BigInt(String(value));
|
|
192
|
+
}
|
|
193
|
+
if (type.kind === 'message' && type.name === 'google.protobuf.Timestamp') {
|
|
194
|
+
return timestampToDate(value);
|
|
195
|
+
}
|
|
196
|
+
if (type.kind === 'message') {
|
|
197
|
+
return fromProtoObject(schema, type.name, value, scope);
|
|
198
|
+
}
|
|
199
|
+
if (type.kind === 'map' && value && typeof value === 'object') {
|
|
200
|
+
const out = {};
|
|
201
|
+
for (const [key, item] of Object.entries(value)) {
|
|
202
|
+
out[key] = fromProtoValue(schema, type.value, item, scope);
|
|
203
|
+
}
|
|
204
|
+
return out;
|
|
205
|
+
}
|
|
206
|
+
return value;
|
|
207
|
+
}
|
|
208
|
+
function toProtoObject(schema, name, value, scope) {
|
|
209
|
+
if (name === 'google.protobuf.Empty')
|
|
210
|
+
return {};
|
|
211
|
+
if (name === 'google.protobuf.Timestamp') {
|
|
212
|
+
return value instanceof Date ? dateToTimestamp(value) : value;
|
|
213
|
+
}
|
|
214
|
+
const message = resolveMessage(schema, name, scope);
|
|
215
|
+
if (!message)
|
|
216
|
+
return value;
|
|
217
|
+
let payload = value;
|
|
218
|
+
if (isWrapper(message) &&
|
|
219
|
+
(payload == null ||
|
|
220
|
+
typeof payload !== 'object' ||
|
|
221
|
+
Array.isArray(payload) ||
|
|
222
|
+
payload instanceof Date)) {
|
|
223
|
+
payload = { value: payload };
|
|
224
|
+
}
|
|
225
|
+
if (!payload || typeof payload !== 'object')
|
|
226
|
+
return payload;
|
|
227
|
+
const src = payload;
|
|
228
|
+
if (message.discriminator) {
|
|
229
|
+
const tag = src[message.discriminator];
|
|
230
|
+
const arm = message.fields.find((field) => field.discriminatorValue === tag ||
|
|
231
|
+
field.name === tag ||
|
|
232
|
+
toCamel(field.name) === tag);
|
|
233
|
+
if (!arm || arm.type.kind !== 'message')
|
|
234
|
+
return {};
|
|
235
|
+
const rest = { ...src };
|
|
236
|
+
delete rest[message.discriminator];
|
|
237
|
+
return {
|
|
238
|
+
[arm.name]: toProtoObject(schema, arm.type.name, rest, message),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
const out = {};
|
|
242
|
+
for (const field of message.fields) {
|
|
243
|
+
const raw = src[field.name] ?? src[toCamel(field.name)];
|
|
244
|
+
if (raw === undefined)
|
|
245
|
+
continue;
|
|
246
|
+
if (field.repeated && Array.isArray(raw)) {
|
|
247
|
+
out[field.name] = raw.map((item) => toProtoValue(schema, field.type, item, message));
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
out[field.name] = toProtoValue(schema, field.type, raw, message);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
function fromProtoObject(schema, name, value, scope) {
|
|
256
|
+
if (name === 'google.protobuf.Empty')
|
|
257
|
+
return {};
|
|
258
|
+
if (name === 'google.protobuf.Timestamp')
|
|
259
|
+
return timestampToDate(value);
|
|
260
|
+
const message = resolveMessage(schema, name, scope);
|
|
261
|
+
if (!message || !value || typeof value !== 'object')
|
|
262
|
+
return value;
|
|
263
|
+
const src = value;
|
|
264
|
+
if (message.discriminator) {
|
|
265
|
+
for (const field of message.fields) {
|
|
266
|
+
const raw = src[field.name] ?? src[toCamel(field.name)];
|
|
267
|
+
if (raw === undefined || raw === null)
|
|
268
|
+
continue;
|
|
269
|
+
const decoded = fromProtoValue(schema, field.type, raw, message);
|
|
270
|
+
const rest = decoded && typeof decoded === 'object' && !Array.isArray(decoded)
|
|
271
|
+
? decoded
|
|
272
|
+
: {};
|
|
273
|
+
return {
|
|
274
|
+
[message.discriminator]: field.discriminatorValue ?? field.name,
|
|
275
|
+
...rest,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {};
|
|
279
|
+
}
|
|
280
|
+
const out = {};
|
|
281
|
+
for (const field of message.fields) {
|
|
282
|
+
const raw = src[field.name] ?? src[toCamel(field.name)];
|
|
283
|
+
if (raw === undefined)
|
|
284
|
+
continue;
|
|
285
|
+
const key = toCamel(field.name);
|
|
286
|
+
if (field.repeated && Array.isArray(raw)) {
|
|
287
|
+
out[key] = raw.map((item) => fromProtoValue(schema, field.type, item, message));
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
out[key] = fromProtoValue(schema, field.type, raw, message);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (isWrapper(message))
|
|
294
|
+
return out.value;
|
|
295
|
+
return out;
|
|
296
|
+
}
|
|
297
|
+
/** Runtime protobuf encoder, decoder, and RPC registry. */
|
|
298
|
+
export class ProtoCodec {
|
|
299
|
+
schema;
|
|
300
|
+
#root;
|
|
301
|
+
constructor(schema) {
|
|
302
|
+
this.schema = schema;
|
|
303
|
+
this.#root = buildRoot(schema);
|
|
304
|
+
}
|
|
305
|
+
lookupRpc(path) {
|
|
306
|
+
return lookupRootRpc(this.#root, this.schema, path);
|
|
307
|
+
}
|
|
308
|
+
lookupMethod(serviceName, methodName) {
|
|
309
|
+
return lookupRootMethod(this.#root, this.schema, serviceName, methodName);
|
|
310
|
+
}
|
|
311
|
+
encode(messageName, value) {
|
|
312
|
+
const type = lookupType(this.#root, this.schema, messageName);
|
|
313
|
+
const prepared = toProtoObject(this.schema, messageName, value);
|
|
314
|
+
return type.encode(type.fromObject(prepared ?? {})).finish();
|
|
315
|
+
}
|
|
316
|
+
decode(messageName, bytes) {
|
|
317
|
+
const type = lookupType(this.#root, this.schema, messageName);
|
|
318
|
+
const raw = type.toObject(type.decode(bytes), {
|
|
319
|
+
defaults: false,
|
|
320
|
+
enums: String,
|
|
321
|
+
longs: String,
|
|
322
|
+
bytes: Uint8Array,
|
|
323
|
+
});
|
|
324
|
+
return fromProtoObject(this.schema, messageName, raw);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=proto_codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proto_codec.js","sourceRoot":"","sources":["../../src/proto_codec/proto_codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type AnyRouter } from '@trpc/server';
|
|
2
|
+
export type RouterInvoker = (request: {
|
|
3
|
+
path: string;
|
|
4
|
+
input?: unknown;
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
context?: unknown;
|
|
7
|
+
}) => Promise<unknown>;
|
|
8
|
+
export declare function createRouterInvoker(router: AnyRouter, opts?: {
|
|
9
|
+
createContext?: () => unknown | Promise<unknown>;
|
|
10
|
+
}): RouterInvoker;
|
|
11
|
+
export declare function toAsyncIterable(result: unknown): AsyncIterable<unknown>;
|
|
12
|
+
//# sourceMappingURL=router_invoker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router_invoker.d.ts","sourceRoot":"","sources":["../src/router_invoker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAgBvB,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,GAC1D,aAAa,CA0Bf;AAiBD,wBAAuB,eAAe,CACpC,MAAM,EAAE,OAAO,GACd,aAAa,CAAC,OAAO,CAAC,CA2CxB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { TRPCError } from '@trpc/server';
|
|
2
|
+
import { isAsyncIterable } from '@trpc-proto/utility';
|
|
3
|
+
export function createRouterInvoker(router, opts) {
|
|
4
|
+
return async (request) => {
|
|
5
|
+
const procedure = router._def.procedures[request.path];
|
|
6
|
+
if (!procedure) {
|
|
7
|
+
throw new TRPCError({
|
|
8
|
+
code: 'NOT_FOUND',
|
|
9
|
+
message: `No procedure on path "${request.path}"`,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
const ctx = 'context' in request
|
|
13
|
+
? request.context
|
|
14
|
+
: opts?.createContext
|
|
15
|
+
? await opts.createContext()
|
|
16
|
+
: {};
|
|
17
|
+
return procedure({
|
|
18
|
+
path: request.path,
|
|
19
|
+
getRawInput: async () => request.input,
|
|
20
|
+
ctx,
|
|
21
|
+
type: procedure._def.type,
|
|
22
|
+
signal: request.signal,
|
|
23
|
+
batchIndex: 0,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function isObservable(value) {
|
|
28
|
+
return (value !== null &&
|
|
29
|
+
typeof value === 'object' &&
|
|
30
|
+
'subscribe' in value &&
|
|
31
|
+
typeof value.subscribe === 'function');
|
|
32
|
+
}
|
|
33
|
+
export async function* toAsyncIterable(result) {
|
|
34
|
+
const value = await result;
|
|
35
|
+
if (isAsyncIterable(value)) {
|
|
36
|
+
yield* value;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (isObservable(value)) {
|
|
40
|
+
const pending = [];
|
|
41
|
+
let done = false;
|
|
42
|
+
let failure;
|
|
43
|
+
let notify;
|
|
44
|
+
const subscription = value.subscribe({
|
|
45
|
+
next: (item) => {
|
|
46
|
+
pending.push(item);
|
|
47
|
+
notify?.();
|
|
48
|
+
},
|
|
49
|
+
error: (error) => {
|
|
50
|
+
failure = error;
|
|
51
|
+
done = true;
|
|
52
|
+
notify?.();
|
|
53
|
+
},
|
|
54
|
+
complete: () => {
|
|
55
|
+
done = true;
|
|
56
|
+
notify?.();
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
try {
|
|
60
|
+
while (!done || pending.length > 0) {
|
|
61
|
+
if (pending.length > 0) {
|
|
62
|
+
yield pending.shift();
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
await new Promise((resolve) => {
|
|
66
|
+
notify = resolve;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (failure)
|
|
70
|
+
throw failure;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
subscription.unsubscribe?.();
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
yield value;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=router_invoker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router_invoker.js","sourceRoot":"","sources":["../src/router_invoker.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Codec, type CodecInput } from './codec.js';
|
|
2
|
+
/** Base64 gRPC-Web body codec. */
|
|
3
|
+
export declare class GrpcWebBase64Codec implements Codec<Uint8Array, string> {
|
|
4
|
+
encode(body: Uint8Array): string;
|
|
5
|
+
decode(encoded: CodecInput<string>): AsyncIterable<Uint8Array>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=base64_codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64_codec.d.ts","sourceRoot":"","sources":["../../../src/web/codec/base64_codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;AA8CpB,kCAAkC;AAClC,qBAAa,kBAAmB,YAAW,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC;IAClE,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAgBzB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC;CAOtE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { codecChunks, } from './codec.js';
|
|
2
|
+
const BINARY_STRING_CHUNK_SIZE = 0x4000;
|
|
3
|
+
const NO_BINARY_CHUNKS = [];
|
|
4
|
+
function decodeBase64Segment(encoded) {
|
|
5
|
+
const binary = atob(encoded);
|
|
6
|
+
const out = new Uint8Array(binary.length);
|
|
7
|
+
for (let index = 0; index < binary.length; index++) {
|
|
8
|
+
out[index] = binary.charCodeAt(index);
|
|
9
|
+
}
|
|
10
|
+
return out;
|
|
11
|
+
}
|
|
12
|
+
class TextDecoder {
|
|
13
|
+
#pending = '';
|
|
14
|
+
push(chunk) {
|
|
15
|
+
this.#pending += chunk.replace(/\s/g, '');
|
|
16
|
+
return this.#decodeCompleteSegments();
|
|
17
|
+
}
|
|
18
|
+
finish() {
|
|
19
|
+
const decoded = this.#decodeCompleteSegments();
|
|
20
|
+
if (this.#pending.length > 0) {
|
|
21
|
+
throw new Error('truncated gRPC-Web text body');
|
|
22
|
+
}
|
|
23
|
+
return decoded.length > 0 ? decoded : NO_BINARY_CHUNKS;
|
|
24
|
+
}
|
|
25
|
+
#decodeCompleteSegments() {
|
|
26
|
+
const decoded = [];
|
|
27
|
+
while (this.#pending.length >= 4) {
|
|
28
|
+
const paddingIndex = this.#pending.indexOf('=');
|
|
29
|
+
const encodedLength = paddingIndex < 0
|
|
30
|
+
? this.#pending.length - (this.#pending.length % 4)
|
|
31
|
+
: Math.ceil((paddingIndex + 1) / 4) * 4;
|
|
32
|
+
if (encodedLength === 0 || this.#pending.length < encodedLength)
|
|
33
|
+
break;
|
|
34
|
+
decoded.push(decodeBase64Segment(this.#pending.slice(0, encodedLength)));
|
|
35
|
+
this.#pending = this.#pending.slice(encodedLength);
|
|
36
|
+
}
|
|
37
|
+
return decoded;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Base64 gRPC-Web body codec. */
|
|
41
|
+
export class GrpcWebBase64Codec {
|
|
42
|
+
encode(body) {
|
|
43
|
+
const chunks = [];
|
|
44
|
+
for (let offset = 0; offset < body.length; offset += BINARY_STRING_CHUNK_SIZE) {
|
|
45
|
+
chunks.push(String.fromCharCode(...body.subarray(offset, offset + BINARY_STRING_CHUNK_SIZE)));
|
|
46
|
+
}
|
|
47
|
+
return btoa(chunks.join(''));
|
|
48
|
+
}
|
|
49
|
+
async *decode(encoded) {
|
|
50
|
+
const decoder = new TextDecoder();
|
|
51
|
+
for await (const chunk of codecChunks(encoded)) {
|
|
52
|
+
yield* decoder.push(chunk);
|
|
53
|
+
}
|
|
54
|
+
yield* decoder.finish();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=base64_codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64_codec.js","sourceRoot":"","sources":["../../../src/web/codec/base64_codec.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAIZ,MAAM,YAAY,CAAC;AAEpB,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,gBAAgB,GAA0B,EAAE,CAAC;AAEnD,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,WAAW;IACf,QAAQ,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACxC,CAAC;IAED,MAAM;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACzD,CAAC;IAED,uBAAuB;QACrB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,aAAa,GACjB,YAAY,GAAG,CAAC;gBACd,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,aAAa,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa;gBAAE,MAAM;YACvE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,kCAAkC;AAClC,MAAM,OAAO,kBAAkB;IAC7B,MAAM,CAAC,IAAgB;QACrB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KACE,IAAI,MAAM,GAAG,CAAC,EACd,MAAM,GAAG,IAAI,CAAC,MAAM,EACpB,MAAM,IAAI,wBAAwB,EAClC,CAAC;YACD,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,YAAY,CACjB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAAC,CAC5D,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,OAA2B;QACvC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { MaybePromise } from '../../types.js';
|
|
2
|
+
/** One encoded chunk or an asynchronous stream of encoded chunks. */
|
|
3
|
+
export type CodecInput<Encoded> = Encoded | AsyncIterable<Encoded>;
|
|
4
|
+
/** Minimal codec contract for complete values and streamed input. */
|
|
5
|
+
export interface Codec<Value, Encoded, Options = undefined> {
|
|
6
|
+
/** Encodes one complete value. */
|
|
7
|
+
encode(value: Value, options?: Options): MaybePromise<Encoded>;
|
|
8
|
+
/** Decodes values incrementally from one chunk or a chunk stream. */
|
|
9
|
+
decode(encoded: CodecInput<Encoded>, options?: Options): AsyncIterable<Value>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Stateful, synchronous parser behind a streaming {@link Codec}.
|
|
13
|
+
*
|
|
14
|
+
* One instance belongs to exactly one input stream. `push` consumes the next
|
|
15
|
+
* transport chunk and returns every complete value now available while
|
|
16
|
+
* retaining incomplete input internally. `finish` must be called once after
|
|
17
|
+
* the final chunk; it returns any remaining complete values and rejects
|
|
18
|
+
* truncated or otherwise incomplete input.
|
|
19
|
+
*
|
|
20
|
+
* Keeping this contract synchronous separates byte parsing from the
|
|
21
|
+
* asynchronous traversal performed by `Codec.decode`.
|
|
22
|
+
*
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export interface IncrementalDecoder<Chunk, Value> {
|
|
26
|
+
/** Consume one chunk and return zero or more newly completed values. */
|
|
27
|
+
push(chunk: Chunk): readonly Value[];
|
|
28
|
+
/** Finalize the stream and validate all buffered input was consumed. */
|
|
29
|
+
finish(): readonly Value[];
|
|
30
|
+
}
|
|
31
|
+
/** Iterates uniformly over one encoded chunk or an asynchronous chunk stream. */
|
|
32
|
+
export declare function codecChunks<Chunk>(encoded: CodecInput<Chunk>): AsyncIterable<Chunk>;
|
|
33
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../src/web/codec/codec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,qEAAqE;AACrE,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;AAEnE,qEAAqE;AACrE,MAAM,WAAW,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS;IACxD,kCAAkC;IAClC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAE/D,qEAAqE;IACrE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;CAC/E;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,KAAK;IAC9C,wEAAwE;IACxE,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IAErC,wEAAwE;IACxE,MAAM,IAAI,SAAS,KAAK,EAAE,CAAC;CAC5B;AAED,iFAAiF;AACjF,wBAAuB,WAAW,CAAC,KAAK,EACtC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,GACzB,aAAa,CAAC,KAAK,CAAC,CAMtB"}
|