@vishalsharma7nov/react-native-proto 0.2.2
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/android/src/main/java/com/vishalsharma7nov/reactnativeproto/ReactNativeProtoNativeGrpcModule.java +142 -0
- package/app.plugin.js +63 -0
- package/bin/react-native-proto.js +956 -0
- package/ios/ReactNativeProtoNativeGrpc.m +129 -0
- package/lib/commonjs/auth.js +72 -0
- package/lib/commonjs/auth.js.map +1 -0
- package/lib/commonjs/client-factory.js +81 -0
- package/lib/commonjs/client-factory.js.map +1 -0
- package/lib/commonjs/codecs.js +41 -0
- package/lib/commonjs/codecs.js.map +1 -0
- package/lib/commonjs/connect/envelope.js +100 -0
- package/lib/commonjs/connect/envelope.js.map +1 -0
- package/lib/commonjs/connect/errors.js +71 -0
- package/lib/commonjs/connect/errors.js.map +1 -0
- package/lib/commonjs/errors.js +54 -0
- package/lib/commonjs/errors.js.map +1 -0
- package/lib/commonjs/generated/create-api.js +29 -0
- package/lib/commonjs/generated/create-api.js.map +1 -0
- package/lib/commonjs/generated/message-types.js +2 -0
- package/lib/commonjs/generated/message-types.js.map +1 -0
- package/lib/commonjs/generated/messages.js +47 -0
- package/lib/commonjs/generated/messages.js.map +1 -0
- package/lib/commonjs/generated/messages.pb.js +2787 -0
- package/lib/commonjs/generated/messages.pb.js.map +1 -0
- package/lib/commonjs/generated/method-map.js +68 -0
- package/lib/commonjs/generated/method-map.js.map +1 -0
- package/lib/commonjs/index.js +283 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/interceptors.js +19 -0
- package/lib/commonjs/interceptors.js.map +1 -0
- package/lib/commonjs/logging.js +54 -0
- package/lib/commonjs/logging.js.map +1 -0
- package/lib/commonjs/metro/index.js +35 -0
- package/lib/commonjs/metro/index.js.map +1 -0
- package/lib/commonjs/metro/transformer.js +33 -0
- package/lib/commonjs/metro/transformer.js.map +1 -0
- package/lib/commonjs/mock-server/index.js +125 -0
- package/lib/commonjs/mock-server/index.js.map +1 -0
- package/lib/commonjs/native-grpc/index.js +242 -0
- package/lib/commonjs/native-grpc/index.js.map +1 -0
- package/lib/commonjs/offline-queue.js +137 -0
- package/lib/commonjs/offline-queue.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/path-templates.js +44 -0
- package/lib/commonjs/path-templates.js.map +1 -0
- package/lib/commonjs/react-query/index.js +30 -0
- package/lib/commonjs/react-query/index.js.map +1 -0
- package/lib/commonjs/streaming.js +251 -0
- package/lib/commonjs/streaming.js.map +1 -0
- package/lib/commonjs/transport.js +323 -0
- package/lib/commonjs/transport.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/validation/zod.js +48 -0
- package/lib/commonjs/validation/zod.js.map +1 -0
- package/lib/commonjs/version-check.js +102 -0
- package/lib/commonjs/version-check.js.map +1 -0
- package/lib/module/auth.js +67 -0
- package/lib/module/auth.js.map +1 -0
- package/lib/module/client-factory.js +77 -0
- package/lib/module/client-factory.js.map +1 -0
- package/lib/module/codecs.js +36 -0
- package/lib/module/codecs.js.map +1 -0
- package/lib/module/connect/envelope.js +93 -0
- package/lib/module/connect/envelope.js.map +1 -0
- package/lib/module/connect/errors.js +65 -0
- package/lib/module/connect/errors.js.map +1 -0
- package/lib/module/errors.js +46 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/generated/create-api.js +13 -0
- package/lib/module/generated/create-api.js.map +1 -0
- package/lib/module/generated/message-types.js +2 -0
- package/lib/module/generated/message-types.js.map +1 -0
- package/lib/module/generated/messages.js +43 -0
- package/lib/module/generated/messages.js.map +1 -0
- package/lib/module/generated/messages.pb.js +2787 -0
- package/lib/module/generated/messages.pb.js.map +1 -0
- package/lib/module/generated/method-map.js +64 -0
- package/lib/module/generated/method-map.js.map +1 -0
- package/lib/module/index.js +53 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/interceptors.js +15 -0
- package/lib/module/interceptors.js.map +1 -0
- package/lib/module/logging.js +50 -0
- package/lib/module/logging.js.map +1 -0
- package/lib/module/metro/index.js +25 -0
- package/lib/module/metro/index.js.map +1 -0
- package/lib/module/metro/transformer.js +29 -0
- package/lib/module/metro/transformer.js.map +1 -0
- package/lib/module/mock-server/index.js +120 -0
- package/lib/module/mock-server/index.js.map +1 -0
- package/lib/module/native-grpc/index.js +233 -0
- package/lib/module/native-grpc/index.js.map +1 -0
- package/lib/module/offline-queue.js +132 -0
- package/lib/module/offline-queue.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/path-templates.js +39 -0
- package/lib/module/path-templates.js.map +1 -0
- package/lib/module/react-query/index.js +25 -0
- package/lib/module/react-query/index.js.map +1 -0
- package/lib/module/streaming.js +246 -0
- package/lib/module/streaming.js.map +1 -0
- package/lib/module/transport.js +316 -0
- package/lib/module/transport.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/validation/zod.js +43 -0
- package/lib/module/validation/zod.js.map +1 -0
- package/lib/module/version-check.js +93 -0
- package/lib/module/version-check.js.map +1 -0
- package/lib/typescript/src/auth.d.ts +26 -0
- package/lib/typescript/src/auth.d.ts.map +1 -0
- package/lib/typescript/src/client-factory.d.ts +7 -0
- package/lib/typescript/src/client-factory.d.ts.map +1 -0
- package/lib/typescript/src/codecs.d.ts +5 -0
- package/lib/typescript/src/codecs.d.ts.map +1 -0
- package/lib/typescript/src/connect/envelope.d.ts +18 -0
- package/lib/typescript/src/connect/envelope.d.ts.map +1 -0
- package/lib/typescript/src/connect/errors.d.ts +11 -0
- package/lib/typescript/src/connect/errors.d.ts.map +1 -0
- package/lib/typescript/src/errors.d.ts +21 -0
- package/lib/typescript/src/errors.d.ts.map +1 -0
- package/lib/typescript/src/generated/create-api.d.ts +34 -0
- package/lib/typescript/src/generated/create-api.d.ts.map +1 -0
- package/lib/typescript/src/generated/message-types.d.ts +54 -0
- package/lib/typescript/src/generated/message-types.d.ts.map +1 -0
- package/lib/typescript/src/generated/messages.d.ts +17 -0
- package/lib/typescript/src/generated/messages.d.ts.map +1 -0
- package/lib/typescript/src/generated/method-map.d.ts +7 -0
- package/lib/typescript/src/generated/method-map.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +53 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/interceptors.d.ts +17 -0
- package/lib/typescript/src/interceptors.d.ts.map +1 -0
- package/lib/typescript/src/logging.d.ts +16 -0
- package/lib/typescript/src/logging.d.ts.map +1 -0
- package/lib/typescript/src/metro/index.d.ts +15 -0
- package/lib/typescript/src/metro/index.d.ts.map +1 -0
- package/lib/typescript/src/metro/transformer.d.ts +16 -0
- package/lib/typescript/src/metro/transformer.d.ts.map +1 -0
- package/lib/typescript/src/mock-server/index.d.ts +27 -0
- package/lib/typescript/src/mock-server/index.d.ts.map +1 -0
- package/lib/typescript/src/native-grpc/index.d.ts +36 -0
- package/lib/typescript/src/native-grpc/index.d.ts.map +1 -0
- package/lib/typescript/src/offline-queue.d.ts +47 -0
- package/lib/typescript/src/offline-queue.d.ts.map +1 -0
- package/lib/typescript/src/path-templates.d.ts +17 -0
- package/lib/typescript/src/path-templates.d.ts.map +1 -0
- package/lib/typescript/src/react-query/index.d.ts +14 -0
- package/lib/typescript/src/react-query/index.d.ts.map +1 -0
- package/lib/typescript/src/streaming.d.ts +10 -0
- package/lib/typescript/src/streaming.d.ts.map +1 -0
- package/lib/typescript/src/transport.d.ts +19 -0
- package/lib/typescript/src/transport.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +78 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/validation/zod.d.ts +33 -0
- package/lib/typescript/src/validation/zod.d.ts.map +1 -0
- package/lib/typescript/src/version-check.d.ts +40 -0
- package/lib/typescript/src/version-check.d.ts.map +1 -0
- package/metro/index.js +23 -0
- package/metro/transformer.js +21 -0
- package/package.json +144 -0
- package/react-native-proto.podspec +15 -0
- package/src/auth.ts +97 -0
- package/src/client-factory.ts +109 -0
- package/src/codecs.ts +42 -0
- package/src/connect/envelope.ts +112 -0
- package/src/connect/errors.ts +86 -0
- package/src/errors.ts +81 -0
- package/src/generated/create-api.ts +40 -0
- package/src/generated/message-types.ts +63 -0
- package/src/generated/messages.pb.js +3207 -0
- package/src/generated/messages.ts +45 -0
- package/src/generated/method-map.ts +71 -0
- package/src/index.ts +113 -0
- package/src/interceptors.ts +32 -0
- package/src/logging.ts +67 -0
- package/src/metro/index.ts +27 -0
- package/src/metro/transformer.ts +38 -0
- package/src/mock-server/index.ts +164 -0
- package/src/native-grpc/index.ts +302 -0
- package/src/offline-queue.ts +160 -0
- package/src/path-templates.ts +65 -0
- package/src/react-query/index.ts +40 -0
- package/src/streaming.ts +326 -0
- package/src/transport.ts +427 -0
- package/src/types.ts +94 -0
- package/src/validation/zod.ts +75 -0
- package/src/version-check.ts +121 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { CONNECT_FLAG_END_STREAM, decodeConnectEnvelopes, encodeConnectEnvelope, readConnectEnvelopeStream } from './connect/envelope';
|
|
4
|
+
import { bytesToUtf8, connectErrorFromJson, tryParseConnectError } from './connect/errors';
|
|
5
|
+
import { ProtoClientError } from './errors';
|
|
6
|
+
import { buildHeaders, unaryCall } from './transport';
|
|
7
|
+
async function collectRequests(input) {
|
|
8
|
+
if (input.requests) {
|
|
9
|
+
const list = [];
|
|
10
|
+
for await (const item of input.requests) {
|
|
11
|
+
list.push(item);
|
|
12
|
+
}
|
|
13
|
+
return list;
|
|
14
|
+
}
|
|
15
|
+
return [input.request ?? {}];
|
|
16
|
+
}
|
|
17
|
+
function buildConnectRequestBody(entryKind, requests, requestCodec) {
|
|
18
|
+
const useEnvelopedRequest = entryKind === 'clientStreaming' || entryKind === 'bidi' || requests.length > 1;
|
|
19
|
+
if (!useEnvelopedRequest) {
|
|
20
|
+
return requestCodec.encode(requests[0] ?? {});
|
|
21
|
+
}
|
|
22
|
+
const frames = [];
|
|
23
|
+
for (let i = 0; i < requests.length; i += 1) {
|
|
24
|
+
frames.push(encodeConnectEnvelope(requestCodec.encode(requests[i] ?? {}), 0));
|
|
25
|
+
}
|
|
26
|
+
if (entryKind === 'clientStreaming' || entryKind === 'bidi') {
|
|
27
|
+
frames.push(encodeConnectEnvelope(new Uint8Array(0), CONNECT_FLAG_END_STREAM));
|
|
28
|
+
}
|
|
29
|
+
let bodyLength = 0;
|
|
30
|
+
for (let i = 0; i < frames.length; i += 1) {
|
|
31
|
+
bodyLength += frames[i].byteLength;
|
|
32
|
+
}
|
|
33
|
+
const body = new Uint8Array(bodyLength);
|
|
34
|
+
let offset = 0;
|
|
35
|
+
for (let i = 0; i < frames.length; i += 1) {
|
|
36
|
+
body.set(frames[i], offset);
|
|
37
|
+
offset += frames[i].byteLength;
|
|
38
|
+
}
|
|
39
|
+
return body;
|
|
40
|
+
}
|
|
41
|
+
function throwIfEndStreamError(data, rpcPath, status) {
|
|
42
|
+
if (data.byteLength === 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const json = JSON.parse(bytesToUtf8(data));
|
|
46
|
+
const errBody = json.error ?? json;
|
|
47
|
+
if (errBody.code || errBody.message) {
|
|
48
|
+
throw connectErrorFromJson(errBody, rpcPath, status);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function* yieldConnectEnvelopes(envelopes, responseCodec, input, status) {
|
|
52
|
+
for (let i = 0; i < envelopes.length; i += 1) {
|
|
53
|
+
const envelope = envelopes[i];
|
|
54
|
+
if (envelope.flags & CONNECT_FLAG_END_STREAM) {
|
|
55
|
+
throwIfEndStreamError(envelope.data, input.entry.rpcPath, status);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const message = responseCodec.decode(envelope.data);
|
|
59
|
+
if (input.onMessage) {
|
|
60
|
+
input.onMessage(message);
|
|
61
|
+
}
|
|
62
|
+
yield message;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function fetchConnectStreamResponse(config, input, requestBody) {
|
|
66
|
+
const path = config.pathForMethod(input.entry);
|
|
67
|
+
const url = `${config.baseUrl}${path.startsWith('/') ? path : `/${path}`}`;
|
|
68
|
+
const headers = await buildHeaders(config, 'application/connect+proto', input.entry.rpcPath, input.headers);
|
|
69
|
+
headers['Connect-Protocol-Version'] = '1';
|
|
70
|
+
headers.Accept = 'application/connect+proto';
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);
|
|
73
|
+
const onAbort = () => controller.abort();
|
|
74
|
+
if (input.signal) {
|
|
75
|
+
if (input.signal.aborted) {
|
|
76
|
+
clearTimeout(timeoutId);
|
|
77
|
+
throw new ProtoClientError({
|
|
78
|
+
code: 'ABORTED',
|
|
79
|
+
message: 'Request was aborted before send',
|
|
80
|
+
rpcPath: input.entry.rpcPath
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
input.signal.addEventListener('abort', onAbort, {
|
|
84
|
+
once: true
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
try {
|
|
89
|
+
return await config.fetchImpl(url, {
|
|
90
|
+
method: 'POST',
|
|
91
|
+
headers,
|
|
92
|
+
body: requestBody,
|
|
93
|
+
signal: controller.signal
|
|
94
|
+
});
|
|
95
|
+
} catch (cause) {
|
|
96
|
+
if (controller.signal.aborted) {
|
|
97
|
+
throw new ProtoClientError({
|
|
98
|
+
code: input.signal?.aborted ? 'ABORTED' : 'TIMEOUT',
|
|
99
|
+
message: input.signal?.aborted ? 'Request was aborted' : `Stream timed out after ${config.timeoutMs}ms`,
|
|
100
|
+
rpcPath: input.entry.rpcPath,
|
|
101
|
+
cause,
|
|
102
|
+
retryable: !input.signal?.aborted
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
throw new ProtoClientError({
|
|
106
|
+
code: 'NETWORK',
|
|
107
|
+
message: `Network error streaming ${input.entry.rpcPath}`,
|
|
108
|
+
rpcPath: input.entry.rpcPath,
|
|
109
|
+
cause,
|
|
110
|
+
retryable: true
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
} finally {
|
|
114
|
+
clearTimeout(timeoutId);
|
|
115
|
+
if (input.signal) {
|
|
116
|
+
input.signal.removeEventListener('abort', onAbort);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function assertOkConnectResponse(response, rpcPath) {
|
|
121
|
+
if (response.ok) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Body already consumed by caller via text() if needed — here we only throw generic.
|
|
125
|
+
throw new ProtoClientError({
|
|
126
|
+
code: 'HTTP',
|
|
127
|
+
message: `HTTP ${response.status} for ${rpcPath}`,
|
|
128
|
+
status: response.status,
|
|
129
|
+
rpcPath,
|
|
130
|
+
retryable: response.status >= 500
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async function* streamConnect(config, codecs, input) {
|
|
134
|
+
const {
|
|
135
|
+
entry
|
|
136
|
+
} = input;
|
|
137
|
+
const requestCodec = codecs.get(entry.requestType);
|
|
138
|
+
const responseCodec = codecs.get(entry.responseType);
|
|
139
|
+
if (!requestCodec || !responseCodec) {
|
|
140
|
+
throw new ProtoClientError({
|
|
141
|
+
code: 'INVALID_ARGUMENT',
|
|
142
|
+
message: `Missing codec for ${entry.requestType} or ${entry.responseType}`,
|
|
143
|
+
rpcPath: entry.rpcPath
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const requests = await collectRequests(input);
|
|
147
|
+
if ((entry.kind === 'clientStreaming' || entry.kind === 'bidi') && requests.length === 0) {
|
|
148
|
+
throw new ProtoClientError({
|
|
149
|
+
code: 'INVALID_ARGUMENT',
|
|
150
|
+
message: 'Client streaming requires at least one request message',
|
|
151
|
+
rpcPath: entry.rpcPath
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const requestBody = buildConnectRequestBody(entry.kind, requests, requestCodec);
|
|
155
|
+
const response = await fetchConnectStreamResponse(config, input, requestBody);
|
|
156
|
+
if (!response.ok) {
|
|
157
|
+
let text = '';
|
|
158
|
+
try {
|
|
159
|
+
text = await response.text();
|
|
160
|
+
} catch {
|
|
161
|
+
text = '';
|
|
162
|
+
}
|
|
163
|
+
const connectErr = tryParseConnectError(text, entry.rpcPath, response.status);
|
|
164
|
+
if (connectErr) {
|
|
165
|
+
throw connectErr;
|
|
166
|
+
}
|
|
167
|
+
assertOkConnectResponse(response, entry.rpcPath);
|
|
168
|
+
}
|
|
169
|
+
const contentType = response.headers.get('content-type') || '';
|
|
170
|
+
if (response.body && typeof response.body.getReader === 'function') {
|
|
171
|
+
for await (const envelope of readConnectEnvelopeStream(response.body, config.maxResponseBytes)) {
|
|
172
|
+
if (envelope.flags & CONNECT_FLAG_END_STREAM) {
|
|
173
|
+
throwIfEndStreamError(envelope.data, entry.rpcPath, response.status);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const message = responseCodec.decode(envelope.data);
|
|
177
|
+
if (input.onMessage) {
|
|
178
|
+
input.onMessage(message);
|
|
179
|
+
}
|
|
180
|
+
yield message;
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
185
|
+
if (buffer.byteLength > config.maxResponseBytes) {
|
|
186
|
+
throw new ProtoClientError({
|
|
187
|
+
code: 'PAYLOAD_TOO_LARGE',
|
|
188
|
+
message: 'Stream response exceeds maxResponseBytes',
|
|
189
|
+
rpcPath: entry.rpcPath
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const looksLikeRawProto = contentType.includes('proto') && !contentType.includes('connect') && buffer.byteLength > 0 && buffer[0] > 2;
|
|
193
|
+
if (looksLikeRawProto) {
|
|
194
|
+
const message = await unaryCall(config, codecs, input);
|
|
195
|
+
if (input.onMessage) {
|
|
196
|
+
input.onMessage(message);
|
|
197
|
+
}
|
|
198
|
+
yield message;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const envelopes = decodeConnectEnvelopes(buffer);
|
|
202
|
+
if (envelopes.length === 0 && buffer.byteLength > 0) {
|
|
203
|
+
const message = responseCodec.decode(buffer);
|
|
204
|
+
if (input.onMessage) {
|
|
205
|
+
input.onMessage(message);
|
|
206
|
+
}
|
|
207
|
+
yield message;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
yield* yieldConnectEnvelopes(envelopes, responseCodec, input, response.status);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Streaming helpers.
|
|
215
|
+
* - HTTP+protobuf: unary only
|
|
216
|
+
* - Connect: server-streaming via envelope frames; client/bidi send enveloped requests
|
|
217
|
+
* - native-grpc: bridge streaming when available
|
|
218
|
+
*/
|
|
219
|
+
export async function* streamCall(config, codecs, input) {
|
|
220
|
+
const {
|
|
221
|
+
entry
|
|
222
|
+
} = input;
|
|
223
|
+
if (entry.kind === 'unary') {
|
|
224
|
+
throw new ProtoClientError({
|
|
225
|
+
code: 'UNSUPPORTED',
|
|
226
|
+
message: `Method ${entry.rpcPath} is unary; use the promise API`,
|
|
227
|
+
rpcPath: entry.rpcPath
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (config.transport === 'http') {
|
|
231
|
+
throw new ProtoClientError({
|
|
232
|
+
code: 'UNSUPPORTED',
|
|
233
|
+
message: 'Streaming requires transport "connect" or "native-grpc". HTTP+protobuf is unary-only.',
|
|
234
|
+
rpcPath: entry.rpcPath
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (config.transport === 'native-grpc') {
|
|
238
|
+
const {
|
|
239
|
+
nativeGrpcStream
|
|
240
|
+
} = await import('./native-grpc');
|
|
241
|
+
yield* nativeGrpcStream(config, codecs, input);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
yield* streamConnect(config, codecs, input);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CONNECT_FLAG_END_STREAM","decodeConnectEnvelopes","encodeConnectEnvelope","readConnectEnvelopeStream","bytesToUtf8","connectErrorFromJson","tryParseConnectError","ProtoClientError","buildHeaders","unaryCall","collectRequests","input","requests","list","item","push","request","buildConnectRequestBody","entryKind","requestCodec","useEnvelopedRequest","length","encode","frames","i","Uint8Array","bodyLength","byteLength","body","offset","set","throwIfEndStreamError","data","rpcPath","status","json","JSON","parse","errBody","error","code","message","yieldConnectEnvelopes","envelopes","responseCodec","envelope","flags","entry","decode","onMessage","fetchConnectStreamResponse","config","requestBody","path","pathForMethod","url","baseUrl","startsWith","headers","Accept","controller","AbortController","timeoutId","setTimeout","abort","timeoutMs","onAbort","signal","aborted","clearTimeout","addEventListener","once","fetchImpl","method","cause","retryable","removeEventListener","assertOkConnectResponse","response","ok","streamConnect","codecs","get","requestType","responseType","kind","text","connectErr","contentType","getReader","maxResponseBytes","buffer","arrayBuffer","looksLikeRawProto","includes","streamCall","transport","nativeGrpcStream"],"sourceRoot":"../../src","sources":["streaming.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { ProtoClientError, wrapUnknownError } from "./errors";
|
|
4
|
+
import { tryParseConnectError } from "./connect/errors";
|
|
5
|
+
import { composeInterceptors } from "./interceptors";
|
|
6
|
+
import { createPathForMethod } from "./path-templates";
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
8
|
+
const DEFAULT_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
|
|
9
|
+
const MAX_HEADER_ENTRIES = 64;
|
|
10
|
+
export function resolveConfig(config) {
|
|
11
|
+
if (!config || typeof config !== "object") {
|
|
12
|
+
throw new ProtoClientError({
|
|
13
|
+
code: "INVALID_CONFIG",
|
|
14
|
+
message: "createClient requires a config object"
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const baseUrl = typeof config.baseUrl === "string" ? config.baseUrl.trim() : "";
|
|
18
|
+
if (!baseUrl) {
|
|
19
|
+
throw new ProtoClientError({
|
|
20
|
+
code: "INVALID_CONFIG",
|
|
21
|
+
message: "baseUrl is required and must be a non-empty string"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
// Throws if baseUrl is not absolute
|
|
26
|
+
// eslint-disable-next-line no-new
|
|
27
|
+
new URL(baseUrl);
|
|
28
|
+
} catch (cause) {
|
|
29
|
+
throw new ProtoClientError({
|
|
30
|
+
code: "INVALID_CONFIG",
|
|
31
|
+
message: `baseUrl must be an absolute URL, received: ${baseUrl}`,
|
|
32
|
+
cause
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const timeoutMs = typeof config.timeoutMs === "number" && config.timeoutMs > 0 ? Math.min(config.timeoutMs, 600_000) : DEFAULT_TIMEOUT_MS;
|
|
36
|
+
const maxResponseBytes = typeof config.maxResponseBytes === "number" && config.maxResponseBytes > 0 ? Math.min(config.maxResponseBytes, 50 * 1024 * 1024) : DEFAULT_MAX_RESPONSE_BYTES;
|
|
37
|
+
const transport = config.transport ?? "http";
|
|
38
|
+
if (transport !== "http" && transport !== "connect" && transport !== "native-grpc") {
|
|
39
|
+
throw new ProtoClientError({
|
|
40
|
+
code: "INVALID_CONFIG",
|
|
41
|
+
message: `Unsupported transport: ${String(transport)}`
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const fetchImpl = config.fetch ?? globalThis.fetch;
|
|
45
|
+
if (typeof fetchImpl !== "function") {
|
|
46
|
+
throw new ProtoClientError({
|
|
47
|
+
code: "INVALID_CONFIG",
|
|
48
|
+
message: "fetch is not available; pass config.fetch"
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const pathForMethod = config.pathForMethod ?? createPathForMethod(config.pathPreset ?? "connect");
|
|
52
|
+
return {
|
|
53
|
+
baseUrl: baseUrl.replace(/\/$/, ""),
|
|
54
|
+
timeoutMs,
|
|
55
|
+
maxResponseBytes,
|
|
56
|
+
transport,
|
|
57
|
+
getHeaders: config.getHeaders,
|
|
58
|
+
fetchImpl,
|
|
59
|
+
onError: config.onError,
|
|
60
|
+
pathForMethod,
|
|
61
|
+
interceptors: config.interceptors ?? [],
|
|
62
|
+
retryOnUnauthorized: config.retryOnUnauthorized !== false
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function buildHeaders(config, contentType, rpcPath, extra) {
|
|
66
|
+
const headers = {
|
|
67
|
+
"Content-Type": contentType,
|
|
68
|
+
Accept: contentType
|
|
69
|
+
};
|
|
70
|
+
const merge = source => {
|
|
71
|
+
if (!source || typeof source !== "object") return;
|
|
72
|
+
const keys = Object.keys(source);
|
|
73
|
+
if (keys.length > MAX_HEADER_ENTRIES) {
|
|
74
|
+
throw new ProtoClientError({
|
|
75
|
+
code: "INVALID_ARGUMENT",
|
|
76
|
+
message: `Too many headers (max ${MAX_HEADER_ENTRIES})`,
|
|
77
|
+
rpcPath
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
for (let i = 0; i < keys.length; i += 1) {
|
|
81
|
+
const key = keys[i];
|
|
82
|
+
if (!key) continue;
|
|
83
|
+
const value = source[key];
|
|
84
|
+
if (typeof value === "string") {
|
|
85
|
+
headers[key] = value;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
if (config.getHeaders) {
|
|
90
|
+
let fromConfig;
|
|
91
|
+
try {
|
|
92
|
+
fromConfig = await config.getHeaders();
|
|
93
|
+
} catch (cause) {
|
|
94
|
+
throw new ProtoClientError({
|
|
95
|
+
code: "INVALID_ARGUMENT",
|
|
96
|
+
message: "getHeaders() failed",
|
|
97
|
+
rpcPath,
|
|
98
|
+
cause
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
merge(fromConfig);
|
|
102
|
+
}
|
|
103
|
+
merge(extra);
|
|
104
|
+
return headers;
|
|
105
|
+
}
|
|
106
|
+
function mapHttpStatus(status, rpcPath, bodyText) {
|
|
107
|
+
if (bodyText) {
|
|
108
|
+
const connectErr = tryParseConnectError(bodyText, rpcPath, status);
|
|
109
|
+
if (connectErr) {
|
|
110
|
+
return connectErr;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const retryable = status === 408 || status === 429 || status >= 500;
|
|
114
|
+
return new ProtoClientError({
|
|
115
|
+
code: "HTTP",
|
|
116
|
+
message: `HTTP ${status} for ${rpcPath}${bodyText ? `: ${bodyText.slice(0, 200)}` : ""}`,
|
|
117
|
+
status,
|
|
118
|
+
rpcPath,
|
|
119
|
+
retryable
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async function readBodyBytes(response, maxResponseBytes, rpcPath) {
|
|
123
|
+
const lengthHeader = response.headers.get("content-length");
|
|
124
|
+
if (lengthHeader) {
|
|
125
|
+
const declared = Number(lengthHeader);
|
|
126
|
+
if (Number.isFinite(declared) && declared > maxResponseBytes) {
|
|
127
|
+
throw new ProtoClientError({
|
|
128
|
+
code: "PAYLOAD_TOO_LARGE",
|
|
129
|
+
message: `Response Content-Length ${declared} exceeds maxResponseBytes ${maxResponseBytes}`,
|
|
130
|
+
rpcPath,
|
|
131
|
+
status: response.status
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const buffer = await response.arrayBuffer();
|
|
136
|
+
if (buffer.byteLength > maxResponseBytes) {
|
|
137
|
+
throw new ProtoClientError({
|
|
138
|
+
code: "PAYLOAD_TOO_LARGE",
|
|
139
|
+
message: `Response size ${buffer.byteLength} exceeds maxResponseBytes ${maxResponseBytes}`,
|
|
140
|
+
rpcPath,
|
|
141
|
+
status: response.status
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return new Uint8Array(buffer);
|
|
145
|
+
}
|
|
146
|
+
async function unaryCallCore(config, codecs, input) {
|
|
147
|
+
const {
|
|
148
|
+
entry,
|
|
149
|
+
request,
|
|
150
|
+
signal
|
|
151
|
+
} = input;
|
|
152
|
+
const rpcPath = entry.rpcPath;
|
|
153
|
+
if (config.transport === "native-grpc") {
|
|
154
|
+
const {
|
|
155
|
+
nativeGrpcUnary
|
|
156
|
+
} = await import("./native-grpc");
|
|
157
|
+
return nativeGrpcUnary(config, codecs, input);
|
|
158
|
+
}
|
|
159
|
+
const requestCodec = codecs.get(entry.requestType);
|
|
160
|
+
const responseCodec = codecs.get(entry.responseType);
|
|
161
|
+
if (!requestCodec || !responseCodec) {
|
|
162
|
+
throw new ProtoClientError({
|
|
163
|
+
code: "INVALID_ARGUMENT",
|
|
164
|
+
message: `Missing codec for ${entry.requestType} or ${entry.responseType}`,
|
|
165
|
+
rpcPath
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
let body;
|
|
169
|
+
try {
|
|
170
|
+
body = requestCodec.encode(request ?? {});
|
|
171
|
+
} catch (cause) {
|
|
172
|
+
throw new ProtoClientError({
|
|
173
|
+
code: "INVALID_ARGUMENT",
|
|
174
|
+
message: `Failed to encode request for ${rpcPath}`,
|
|
175
|
+
rpcPath,
|
|
176
|
+
cause
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
const path = config.pathForMethod(entry);
|
|
180
|
+
const url = `${config.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
181
|
+
const contentType = config.transport === "connect" ? "application/proto" : "application/x-protobuf";
|
|
182
|
+
const controller = new AbortController();
|
|
183
|
+
const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);
|
|
184
|
+
const onAbort = () => controller.abort();
|
|
185
|
+
if (signal) {
|
|
186
|
+
if (signal.aborted) {
|
|
187
|
+
clearTimeout(timeoutId);
|
|
188
|
+
throw new ProtoClientError({
|
|
189
|
+
code: "ABORTED",
|
|
190
|
+
message: "Request was aborted before send",
|
|
191
|
+
rpcPath
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
signal.addEventListener("abort", onAbort, {
|
|
195
|
+
once: true
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const headers = await buildHeaders(config, contentType, rpcPath, input.headers);
|
|
200
|
+
if (config.transport === "connect") {
|
|
201
|
+
headers["Connect-Protocol-Version"] = "1";
|
|
202
|
+
}
|
|
203
|
+
let response;
|
|
204
|
+
try {
|
|
205
|
+
response = await config.fetchImpl(url, {
|
|
206
|
+
method: "POST",
|
|
207
|
+
headers,
|
|
208
|
+
body: body,
|
|
209
|
+
signal: controller.signal
|
|
210
|
+
});
|
|
211
|
+
} catch (cause) {
|
|
212
|
+
if (controller.signal.aborted) {
|
|
213
|
+
const abortedByCaller = Boolean(signal?.aborted);
|
|
214
|
+
throw new ProtoClientError({
|
|
215
|
+
code: abortedByCaller ? "ABORTED" : "TIMEOUT",
|
|
216
|
+
message: abortedByCaller ? "Request was aborted" : `Request timed out after ${config.timeoutMs}ms`,
|
|
217
|
+
rpcPath,
|
|
218
|
+
cause,
|
|
219
|
+
retryable: !abortedByCaller
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
throw new ProtoClientError({
|
|
223
|
+
code: "NETWORK",
|
|
224
|
+
message: `Network error calling ${rpcPath}`,
|
|
225
|
+
rpcPath,
|
|
226
|
+
cause,
|
|
227
|
+
retryable: true
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (!response.ok) {
|
|
231
|
+
let text = "";
|
|
232
|
+
try {
|
|
233
|
+
text = await response.text();
|
|
234
|
+
} catch {
|
|
235
|
+
text = "";
|
|
236
|
+
}
|
|
237
|
+
throw mapHttpStatus(response.status, rpcPath, text);
|
|
238
|
+
}
|
|
239
|
+
const bytes = await readBodyBytes(response, config.maxResponseBytes, rpcPath);
|
|
240
|
+
|
|
241
|
+
// Connect unary may still return raw proto; if JSON end-stream sneaks in, map it.
|
|
242
|
+
const contentTypeHeader = response.headers.get("content-type") || "";
|
|
243
|
+
if (config.transport === "connect" && contentTypeHeader.includes("json") && bytes.byteLength > 0) {
|
|
244
|
+
const text = new TextDecoder().decode(bytes);
|
|
245
|
+
const connectErr = tryParseConnectError(text, rpcPath, response.status);
|
|
246
|
+
if (connectErr) {
|
|
247
|
+
throw connectErr;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
return responseCodec.decode(bytes);
|
|
252
|
+
} catch (cause) {
|
|
253
|
+
throw new ProtoClientError({
|
|
254
|
+
code: "DECODE",
|
|
255
|
+
message: `Failed to decode response for ${rpcPath}`,
|
|
256
|
+
rpcPath,
|
|
257
|
+
cause,
|
|
258
|
+
status: response.status
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
} finally {
|
|
262
|
+
clearTimeout(timeoutId);
|
|
263
|
+
if (signal) {
|
|
264
|
+
signal.removeEventListener("abort", onAbort);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function notifyOnError(config, error) {
|
|
269
|
+
if (!config.onError) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
config.onError(error);
|
|
274
|
+
} catch {
|
|
275
|
+
// Logging hooks must not replace throw behavior
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
export async function unaryCall(config, codecs, input) {
|
|
279
|
+
const {
|
|
280
|
+
entry,
|
|
281
|
+
request,
|
|
282
|
+
signal
|
|
283
|
+
} = input;
|
|
284
|
+
const rpcPath = entry.rpcPath;
|
|
285
|
+
const core = async ctx => unaryCallCore(config, codecs, {
|
|
286
|
+
entry: ctx.entry,
|
|
287
|
+
request: ctx.request,
|
|
288
|
+
signal: ctx.signal,
|
|
289
|
+
headers: ctx.headers
|
|
290
|
+
});
|
|
291
|
+
const pipeline = config.interceptors.length > 0 ? composeInterceptors(config.interceptors, core) : core;
|
|
292
|
+
try {
|
|
293
|
+
return await pipeline({
|
|
294
|
+
entry,
|
|
295
|
+
request: request ?? {},
|
|
296
|
+
headers: input.headers ?? {},
|
|
297
|
+
signal
|
|
298
|
+
});
|
|
299
|
+
} catch (error) {
|
|
300
|
+
const wrapped = wrapUnknownError(error, rpcPath);
|
|
301
|
+
|
|
302
|
+
// Optional transport-level single retry on 401 when no auth interceptor handled it
|
|
303
|
+
if (config.retryOnUnauthorized && config.interceptors.length === 0 && wrapped.status === 401 && config.getHeaders) {
|
|
304
|
+
try {
|
|
305
|
+
return await unaryCallCore(config, codecs, input);
|
|
306
|
+
} catch (retryError) {
|
|
307
|
+
const retryWrapped = wrapUnknownError(retryError, rpcPath);
|
|
308
|
+
notifyOnError(config, retryWrapped);
|
|
309
|
+
throw retryWrapped;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
notifyOnError(config, wrapped);
|
|
313
|
+
throw wrapped;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ProtoClientError","wrapUnknownError","tryParseConnectError","composeInterceptors","createPathForMethod","DEFAULT_TIMEOUT_MS","DEFAULT_MAX_RESPONSE_BYTES","MAX_HEADER_ENTRIES","resolveConfig","config","code","message","baseUrl","trim","URL","cause","timeoutMs","Math","min","maxResponseBytes","transport","String","fetchImpl","fetch","globalThis","pathForMethod","pathPreset","replace","getHeaders","onError","interceptors","retryOnUnauthorized","buildHeaders","contentType","rpcPath","extra","headers","Accept","merge","source","keys","Object","length","i","key","value","fromConfig","mapHttpStatus","status","bodyText","connectErr","retryable","slice","readBodyBytes","response","lengthHeader","get","declared","Number","isFinite","buffer","arrayBuffer","byteLength","Uint8Array","unaryCallCore","codecs","input","entry","request","signal","nativeGrpcUnary","requestCodec","requestType","responseCodec","responseType","body","encode","path","url","startsWith","controller","AbortController","timeoutId","setTimeout","abort","onAbort","aborted","clearTimeout","addEventListener","once","method","abortedByCaller","Boolean","ok","text","bytes","contentTypeHeader","includes","TextDecoder","decode","removeEventListener","notifyOnError","error","unaryCall","core","ctx","pipeline","wrapped","retryError","retryWrapped"],"sourceRoot":"../../src","sources":["transport.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wrap a protobuf codec with optional Zod (or Zod-compatible) request/response
|
|
5
|
+
* validation. Peer dependency: install `zod` in your app.
|
|
6
|
+
*/
|
|
7
|
+
export function withZodValidation(codec, options) {
|
|
8
|
+
return {
|
|
9
|
+
encode(message) {
|
|
10
|
+
const value = options.request ? options.request.parse(message) : message;
|
|
11
|
+
return codec.encode(value);
|
|
12
|
+
},
|
|
13
|
+
decode(bytes) {
|
|
14
|
+
const decoded = codec.decode(bytes);
|
|
15
|
+
return options.response ? options.response.parse(decoded) : decoded;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Apply Zod schemas to selected type names in a codec registry.
|
|
22
|
+
*/
|
|
23
|
+
export function wrapCodecRegistryWithZod(registry, schemas) {
|
|
24
|
+
return {
|
|
25
|
+
has(typeName) {
|
|
26
|
+
return registry.has(typeName);
|
|
27
|
+
},
|
|
28
|
+
get(typeName) {
|
|
29
|
+
const base = registry.get(typeName);
|
|
30
|
+
if (!base) return undefined;
|
|
31
|
+
const entry = schemas[typeName];
|
|
32
|
+
if (!entry) return base;
|
|
33
|
+
if ("parse" in entry && typeof entry.parse === "function") {
|
|
34
|
+
return withZodValidation(base, {
|
|
35
|
+
request: entry,
|
|
36
|
+
response: entry
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return withZodValidation(base, entry);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=zod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["withZodValidation","codec","options","encode","message","value","request","parse","decode","bytes","decoded","response","wrapCodecRegistryWithZod","registry","schemas","has","typeName","get","base","undefined","entry"],"sourceRoot":"../../../src","sources":["validation/zod.ts"],"mappings":";;AASA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAC/BC,KAAmB,EACnBC,OAGC,EACa;EACd,OAAO;IACLC,MAAMA,CAACC,OAAO,EAAE;MACd,MAAMC,KAAK,GAAGH,OAAO,CAACI,OAAO,GAAGJ,OAAO,CAACI,OAAO,CAACC,KAAK,CAACH,OAAO,CAAC,GAAGA,OAAO;MACxE,OAAOH,KAAK,CAACE,MAAM,CAACE,KAAgC,CAAC;IACvD,CAAC;IACDG,MAAMA,CAACC,KAAK,EAAE;MACZ,MAAMC,OAAO,GAAGT,KAAK,CAACO,MAAM,CAACC,KAAK,CAAC;MACnC,OAAOP,OAAO,CAACS,QAAQ,GAClBT,OAAO,CAACS,QAAQ,CAACJ,KAAK,CAACG,OAAO,CAAC,GAChCA,OAAO;IACb;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA,OAAO,SAASE,wBAAwBA,CACtCC,QAGC,EACDC,OAGC,EAID;EACA,OAAO;IACLC,GAAGA,CAACC,QAAQ,EAAE;MACZ,OAAOH,QAAQ,CAACE,GAAG,CAACC,QAAQ,CAAC;IAC/B,CAAC;IACDC,GAAGA,CAACD,QAAQ,EAAE;MACZ,MAAME,IAAI,GAAGL,QAAQ,CAACI,GAAG,CAACD,QAAQ,CAAC;MACnC,IAAI,CAACE,IAAI,EAAE,OAAOC,SAAS;MAC3B,MAAMC,KAAK,GAAGN,OAAO,CAACE,QAAQ,CAAC;MAC/B,IAAI,CAACI,KAAK,EAAE,OAAOF,IAAI;MACvB,IAAI,OAAO,IAAIE,KAAK,IAAI,OAAOA,KAAK,CAACb,KAAK,KAAK,UAAU,EAAE;QACzD,OAAOP,iBAAiB,CAACkB,IAAI,EAAE;UAC7BZ,OAAO,EAAEc,KAA+C;UACxDT,QAAQ,EAAES;QACZ,CAAC,CAAC;MACJ;MACA,OAAOpB,iBAAiB,CACtBkB,IAAI,EACJE,KAIF,CAAC;IACH;EACF,CAAC;AACH","ignoreList":[]}
|