@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.
Files changed (190) hide show
  1. package/android/src/main/java/com/vishalsharma7nov/reactnativeproto/ReactNativeProtoNativeGrpcModule.java +142 -0
  2. package/app.plugin.js +63 -0
  3. package/bin/react-native-proto.js +956 -0
  4. package/ios/ReactNativeProtoNativeGrpc.m +129 -0
  5. package/lib/commonjs/auth.js +72 -0
  6. package/lib/commonjs/auth.js.map +1 -0
  7. package/lib/commonjs/client-factory.js +81 -0
  8. package/lib/commonjs/client-factory.js.map +1 -0
  9. package/lib/commonjs/codecs.js +41 -0
  10. package/lib/commonjs/codecs.js.map +1 -0
  11. package/lib/commonjs/connect/envelope.js +100 -0
  12. package/lib/commonjs/connect/envelope.js.map +1 -0
  13. package/lib/commonjs/connect/errors.js +71 -0
  14. package/lib/commonjs/connect/errors.js.map +1 -0
  15. package/lib/commonjs/errors.js +54 -0
  16. package/lib/commonjs/errors.js.map +1 -0
  17. package/lib/commonjs/generated/create-api.js +29 -0
  18. package/lib/commonjs/generated/create-api.js.map +1 -0
  19. package/lib/commonjs/generated/message-types.js +2 -0
  20. package/lib/commonjs/generated/message-types.js.map +1 -0
  21. package/lib/commonjs/generated/messages.js +47 -0
  22. package/lib/commonjs/generated/messages.js.map +1 -0
  23. package/lib/commonjs/generated/messages.pb.js +2787 -0
  24. package/lib/commonjs/generated/messages.pb.js.map +1 -0
  25. package/lib/commonjs/generated/method-map.js +68 -0
  26. package/lib/commonjs/generated/method-map.js.map +1 -0
  27. package/lib/commonjs/index.js +283 -0
  28. package/lib/commonjs/index.js.map +1 -0
  29. package/lib/commonjs/interceptors.js +19 -0
  30. package/lib/commonjs/interceptors.js.map +1 -0
  31. package/lib/commonjs/logging.js +54 -0
  32. package/lib/commonjs/logging.js.map +1 -0
  33. package/lib/commonjs/metro/index.js +35 -0
  34. package/lib/commonjs/metro/index.js.map +1 -0
  35. package/lib/commonjs/metro/transformer.js +33 -0
  36. package/lib/commonjs/metro/transformer.js.map +1 -0
  37. package/lib/commonjs/mock-server/index.js +125 -0
  38. package/lib/commonjs/mock-server/index.js.map +1 -0
  39. package/lib/commonjs/native-grpc/index.js +242 -0
  40. package/lib/commonjs/native-grpc/index.js.map +1 -0
  41. package/lib/commonjs/offline-queue.js +137 -0
  42. package/lib/commonjs/offline-queue.js.map +1 -0
  43. package/lib/commonjs/package.json +1 -0
  44. package/lib/commonjs/path-templates.js +44 -0
  45. package/lib/commonjs/path-templates.js.map +1 -0
  46. package/lib/commonjs/react-query/index.js +30 -0
  47. package/lib/commonjs/react-query/index.js.map +1 -0
  48. package/lib/commonjs/streaming.js +251 -0
  49. package/lib/commonjs/streaming.js.map +1 -0
  50. package/lib/commonjs/transport.js +323 -0
  51. package/lib/commonjs/transport.js.map +1 -0
  52. package/lib/commonjs/types.js +6 -0
  53. package/lib/commonjs/types.js.map +1 -0
  54. package/lib/commonjs/validation/zod.js +48 -0
  55. package/lib/commonjs/validation/zod.js.map +1 -0
  56. package/lib/commonjs/version-check.js +102 -0
  57. package/lib/commonjs/version-check.js.map +1 -0
  58. package/lib/module/auth.js +67 -0
  59. package/lib/module/auth.js.map +1 -0
  60. package/lib/module/client-factory.js +77 -0
  61. package/lib/module/client-factory.js.map +1 -0
  62. package/lib/module/codecs.js +36 -0
  63. package/lib/module/codecs.js.map +1 -0
  64. package/lib/module/connect/envelope.js +93 -0
  65. package/lib/module/connect/envelope.js.map +1 -0
  66. package/lib/module/connect/errors.js +65 -0
  67. package/lib/module/connect/errors.js.map +1 -0
  68. package/lib/module/errors.js +46 -0
  69. package/lib/module/errors.js.map +1 -0
  70. package/lib/module/generated/create-api.js +13 -0
  71. package/lib/module/generated/create-api.js.map +1 -0
  72. package/lib/module/generated/message-types.js +2 -0
  73. package/lib/module/generated/message-types.js.map +1 -0
  74. package/lib/module/generated/messages.js +43 -0
  75. package/lib/module/generated/messages.js.map +1 -0
  76. package/lib/module/generated/messages.pb.js +2787 -0
  77. package/lib/module/generated/messages.pb.js.map +1 -0
  78. package/lib/module/generated/method-map.js +64 -0
  79. package/lib/module/generated/method-map.js.map +1 -0
  80. package/lib/module/index.js +53 -0
  81. package/lib/module/index.js.map +1 -0
  82. package/lib/module/interceptors.js +15 -0
  83. package/lib/module/interceptors.js.map +1 -0
  84. package/lib/module/logging.js +50 -0
  85. package/lib/module/logging.js.map +1 -0
  86. package/lib/module/metro/index.js +25 -0
  87. package/lib/module/metro/index.js.map +1 -0
  88. package/lib/module/metro/transformer.js +29 -0
  89. package/lib/module/metro/transformer.js.map +1 -0
  90. package/lib/module/mock-server/index.js +120 -0
  91. package/lib/module/mock-server/index.js.map +1 -0
  92. package/lib/module/native-grpc/index.js +233 -0
  93. package/lib/module/native-grpc/index.js.map +1 -0
  94. package/lib/module/offline-queue.js +132 -0
  95. package/lib/module/offline-queue.js.map +1 -0
  96. package/lib/module/package.json +1 -0
  97. package/lib/module/path-templates.js +39 -0
  98. package/lib/module/path-templates.js.map +1 -0
  99. package/lib/module/react-query/index.js +25 -0
  100. package/lib/module/react-query/index.js.map +1 -0
  101. package/lib/module/streaming.js +246 -0
  102. package/lib/module/streaming.js.map +1 -0
  103. package/lib/module/transport.js +316 -0
  104. package/lib/module/transport.js.map +1 -0
  105. package/lib/module/types.js +4 -0
  106. package/lib/module/types.js.map +1 -0
  107. package/lib/module/validation/zod.js +43 -0
  108. package/lib/module/validation/zod.js.map +1 -0
  109. package/lib/module/version-check.js +93 -0
  110. package/lib/module/version-check.js.map +1 -0
  111. package/lib/typescript/src/auth.d.ts +26 -0
  112. package/lib/typescript/src/auth.d.ts.map +1 -0
  113. package/lib/typescript/src/client-factory.d.ts +7 -0
  114. package/lib/typescript/src/client-factory.d.ts.map +1 -0
  115. package/lib/typescript/src/codecs.d.ts +5 -0
  116. package/lib/typescript/src/codecs.d.ts.map +1 -0
  117. package/lib/typescript/src/connect/envelope.d.ts +18 -0
  118. package/lib/typescript/src/connect/envelope.d.ts.map +1 -0
  119. package/lib/typescript/src/connect/errors.d.ts +11 -0
  120. package/lib/typescript/src/connect/errors.d.ts.map +1 -0
  121. package/lib/typescript/src/errors.d.ts +21 -0
  122. package/lib/typescript/src/errors.d.ts.map +1 -0
  123. package/lib/typescript/src/generated/create-api.d.ts +34 -0
  124. package/lib/typescript/src/generated/create-api.d.ts.map +1 -0
  125. package/lib/typescript/src/generated/message-types.d.ts +54 -0
  126. package/lib/typescript/src/generated/message-types.d.ts.map +1 -0
  127. package/lib/typescript/src/generated/messages.d.ts +17 -0
  128. package/lib/typescript/src/generated/messages.d.ts.map +1 -0
  129. package/lib/typescript/src/generated/method-map.d.ts +7 -0
  130. package/lib/typescript/src/generated/method-map.d.ts.map +1 -0
  131. package/lib/typescript/src/index.d.ts +53 -0
  132. package/lib/typescript/src/index.d.ts.map +1 -0
  133. package/lib/typescript/src/interceptors.d.ts +17 -0
  134. package/lib/typescript/src/interceptors.d.ts.map +1 -0
  135. package/lib/typescript/src/logging.d.ts +16 -0
  136. package/lib/typescript/src/logging.d.ts.map +1 -0
  137. package/lib/typescript/src/metro/index.d.ts +15 -0
  138. package/lib/typescript/src/metro/index.d.ts.map +1 -0
  139. package/lib/typescript/src/metro/transformer.d.ts +16 -0
  140. package/lib/typescript/src/metro/transformer.d.ts.map +1 -0
  141. package/lib/typescript/src/mock-server/index.d.ts +27 -0
  142. package/lib/typescript/src/mock-server/index.d.ts.map +1 -0
  143. package/lib/typescript/src/native-grpc/index.d.ts +36 -0
  144. package/lib/typescript/src/native-grpc/index.d.ts.map +1 -0
  145. package/lib/typescript/src/offline-queue.d.ts +47 -0
  146. package/lib/typescript/src/offline-queue.d.ts.map +1 -0
  147. package/lib/typescript/src/path-templates.d.ts +17 -0
  148. package/lib/typescript/src/path-templates.d.ts.map +1 -0
  149. package/lib/typescript/src/react-query/index.d.ts +14 -0
  150. package/lib/typescript/src/react-query/index.d.ts.map +1 -0
  151. package/lib/typescript/src/streaming.d.ts +10 -0
  152. package/lib/typescript/src/streaming.d.ts.map +1 -0
  153. package/lib/typescript/src/transport.d.ts +19 -0
  154. package/lib/typescript/src/transport.d.ts.map +1 -0
  155. package/lib/typescript/src/types.d.ts +78 -0
  156. package/lib/typescript/src/types.d.ts.map +1 -0
  157. package/lib/typescript/src/validation/zod.d.ts +33 -0
  158. package/lib/typescript/src/validation/zod.d.ts.map +1 -0
  159. package/lib/typescript/src/version-check.d.ts +40 -0
  160. package/lib/typescript/src/version-check.d.ts.map +1 -0
  161. package/metro/index.js +23 -0
  162. package/metro/transformer.js +21 -0
  163. package/package.json +144 -0
  164. package/react-native-proto.podspec +15 -0
  165. package/src/auth.ts +97 -0
  166. package/src/client-factory.ts +109 -0
  167. package/src/codecs.ts +42 -0
  168. package/src/connect/envelope.ts +112 -0
  169. package/src/connect/errors.ts +86 -0
  170. package/src/errors.ts +81 -0
  171. package/src/generated/create-api.ts +40 -0
  172. package/src/generated/message-types.ts +63 -0
  173. package/src/generated/messages.pb.js +3207 -0
  174. package/src/generated/messages.ts +45 -0
  175. package/src/generated/method-map.ts +71 -0
  176. package/src/index.ts +113 -0
  177. package/src/interceptors.ts +32 -0
  178. package/src/logging.ts +67 -0
  179. package/src/metro/index.ts +27 -0
  180. package/src/metro/transformer.ts +38 -0
  181. package/src/mock-server/index.ts +164 -0
  182. package/src/native-grpc/index.ts +302 -0
  183. package/src/offline-queue.ts +160 -0
  184. package/src/path-templates.ts +65 -0
  185. package/src/react-query/index.ts +40 -0
  186. package/src/streaming.ts +326 -0
  187. package/src/transport.ts +427 -0
  188. package/src/types.ts +94 -0
  189. package/src/validation/zod.ts +75 -0
  190. 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,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -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":[]}