@scrawn/core 0.0.2 → 0.0.6

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 (126) hide show
  1. package/README.md +40 -0
  2. package/dist/config.d.ts +17 -2
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +9 -2
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/auth/apiKeyAuth.d.ts +4 -13
  7. package/dist/core/auth/apiKeyAuth.d.ts.map +1 -1
  8. package/dist/core/auth/apiKeyAuth.js +12 -17
  9. package/dist/core/auth/apiKeyAuth.js.map +1 -1
  10. package/dist/core/auth/baseAuth.d.ts +14 -36
  11. package/dist/core/auth/baseAuth.d.ts.map +1 -1
  12. package/dist/core/auth/baseAuth.js +0 -6
  13. package/dist/core/auth/baseAuth.js.map +1 -1
  14. package/dist/core/errors/index.d.ts +192 -0
  15. package/dist/core/errors/index.d.ts.map +1 -0
  16. package/dist/core/errors/index.js +280 -0
  17. package/dist/core/errors/index.js.map +1 -0
  18. package/dist/core/grpc/callContext.d.ts +18 -0
  19. package/dist/core/grpc/callContext.d.ts.map +1 -0
  20. package/dist/core/grpc/callContext.js +35 -0
  21. package/dist/core/grpc/callContext.js.map +1 -0
  22. package/dist/core/grpc/client.d.ts +13 -123
  23. package/dist/core/grpc/client.d.ts.map +1 -1
  24. package/dist/core/grpc/client.js +23 -131
  25. package/dist/core/grpc/client.js.map +1 -1
  26. package/dist/core/grpc/index.d.ts +5 -3
  27. package/dist/core/grpc/index.d.ts.map +1 -1
  28. package/dist/core/grpc/index.js +4 -2
  29. package/dist/core/grpc/index.js.map +1 -1
  30. package/dist/core/grpc/requestBuilder.d.ts +12 -113
  31. package/dist/core/grpc/requestBuilder.d.ts.map +1 -1
  32. package/dist/core/grpc/requestBuilder.js +36 -126
  33. package/dist/core/grpc/requestBuilder.js.map +1 -1
  34. package/dist/core/grpc/streamRequestBuilder.d.ts +13 -0
  35. package/dist/core/grpc/streamRequestBuilder.d.ts.map +1 -0
  36. package/dist/core/grpc/streamRequestBuilder.js +60 -0
  37. package/dist/core/grpc/streamRequestBuilder.js.map +1 -0
  38. package/dist/core/grpc/types.d.ts +5 -52
  39. package/dist/core/grpc/types.d.ts.map +1 -1
  40. package/dist/core/grpc/types.js +0 -7
  41. package/dist/core/grpc/types.js.map +1 -1
  42. package/dist/core/pricing/builders.d.ts +157 -0
  43. package/dist/core/pricing/builders.d.ts.map +1 -0
  44. package/dist/core/pricing/builders.js +218 -0
  45. package/dist/core/pricing/builders.js.map +1 -0
  46. package/dist/core/pricing/index.d.ts +30 -0
  47. package/dist/core/pricing/index.d.ts.map +1 -0
  48. package/dist/core/pricing/index.js +32 -0
  49. package/dist/core/pricing/index.js.map +1 -0
  50. package/dist/core/pricing/resolve.d.ts +39 -0
  51. package/dist/core/pricing/resolve.d.ts.map +1 -0
  52. package/dist/core/pricing/resolve.js +50 -0
  53. package/dist/core/pricing/resolve.js.map +1 -0
  54. package/dist/core/pricing/serialize.d.ts +55 -0
  55. package/dist/core/pricing/serialize.d.ts.map +1 -0
  56. package/dist/core/pricing/serialize.js +127 -0
  57. package/dist/core/pricing/serialize.js.map +1 -0
  58. package/dist/core/pricing/types.d.ts +122 -0
  59. package/dist/core/pricing/types.d.ts.map +1 -0
  60. package/dist/core/pricing/types.js +17 -0
  61. package/dist/core/pricing/types.js.map +1 -0
  62. package/dist/core/pricing/validate.d.ts +56 -0
  63. package/dist/core/pricing/validate.d.ts.map +1 -0
  64. package/dist/core/pricing/validate.js +162 -0
  65. package/dist/core/pricing/validate.js.map +1 -0
  66. package/dist/core/scrawn.d.ts +218 -17
  67. package/dist/core/scrawn.d.ts.map +1 -1
  68. package/dist/core/scrawn.js +469 -71
  69. package/dist/core/scrawn.js.map +1 -1
  70. package/dist/core/types/auth.d.ts +1 -1
  71. package/dist/core/types/event.d.ts +182 -18
  72. package/dist/core/types/event.d.ts.map +1 -1
  73. package/dist/core/types/event.js +133 -5
  74. package/dist/core/types/event.js.map +1 -1
  75. package/dist/gen/auth/v1/auth_grpc_pb.d.ts +3 -0
  76. package/dist/gen/auth/v1/auth_grpc_pb.js +45 -0
  77. package/dist/gen/auth/v1/auth_pb.d.ts +63 -57
  78. package/dist/gen/auth/v1/auth_pb.js +471 -86
  79. package/dist/gen/data/v1/data_grpc_pb.d.ts +5 -0
  80. package/dist/gen/data/v1/data_grpc_pb.js +44 -0
  81. package/dist/gen/data/v1/data_pb.d.ts +254 -0
  82. package/dist/gen/data/v1/data_pb.js +1530 -0
  83. package/dist/gen/event/v1/event_grpc_pb.d.ts +3 -0
  84. package/dist/gen/event/v1/event_grpc_pb.js +79 -0
  85. package/dist/gen/event/v1/event_pb.d.ts +273 -100
  86. package/dist/gen/event/v1/event_pb.js +1862 -138
  87. package/dist/gen/package.json +3 -0
  88. package/dist/gen/payment/v1/payment_grpc_pb.d.ts +3 -0
  89. package/dist/gen/payment/v1/payment_grpc_pb.js +45 -0
  90. package/dist/gen/payment/v1/payment_pb.d.ts +43 -35
  91. package/dist/gen/payment/v1/payment_pb.js +321 -59
  92. package/dist/gen/query/v1/query_grpc_pb.d.ts +5 -0
  93. package/dist/gen/query/v1/query_grpc_pb.js +44 -0
  94. package/dist/gen/query/v1/query_pb.d.ts +359 -0
  95. package/dist/gen/query/v1/query_pb.js +2327 -0
  96. package/dist/index.d.ts +19 -10
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +20 -10
  99. package/dist/index.js.map +1 -1
  100. package/dist/utils/forkAsyncIterable.d.ts +13 -0
  101. package/dist/utils/forkAsyncIterable.d.ts.map +1 -0
  102. package/dist/utils/forkAsyncIterable.js +78 -0
  103. package/dist/utils/forkAsyncIterable.js.map +1 -0
  104. package/dist/utils/logger.d.ts.map +1 -1
  105. package/dist/utils/logger.js +19 -19
  106. package/dist/utils/logger.js.map +1 -1
  107. package/dist/utils/pathMatcher.js +5 -5
  108. package/package.json +19 -15
  109. package/dist/gen/auth/v1/auth_connect.d.ts +0 -22
  110. package/dist/gen/auth/v1/auth_connect.d.ts.map +0 -1
  111. package/dist/gen/auth/v1/auth_connect.js +0 -26
  112. package/dist/gen/auth/v1/auth_connect.js.map +0 -1
  113. package/dist/gen/auth/v1/auth_pb.d.ts.map +0 -1
  114. package/dist/gen/auth/v1/auth_pb.js.map +0 -1
  115. package/dist/gen/event/v1/event_connect.d.ts +0 -22
  116. package/dist/gen/event/v1/event_connect.d.ts.map +0 -1
  117. package/dist/gen/event/v1/event_connect.js +0 -26
  118. package/dist/gen/event/v1/event_connect.js.map +0 -1
  119. package/dist/gen/event/v1/event_pb.d.ts.map +0 -1
  120. package/dist/gen/event/v1/event_pb.js.map +0 -1
  121. package/dist/gen/payment/v1/payment_connect.d.ts +0 -22
  122. package/dist/gen/payment/v1/payment_connect.d.ts.map +0 -1
  123. package/dist/gen/payment/v1/payment_connect.js +0 -26
  124. package/dist/gen/payment/v1/payment_connect.js.map +0 -1
  125. package/dist/gen/payment/v1/payment_pb.d.ts.map +0 -1
  126. package/dist/gen/payment/v1/payment_pb.js.map +0 -1
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Comprehensive error handling system for the Scrawn SDK.
3
+ *
4
+ * Provides structured error classes with rich metadata for better debugging
5
+ * and error handling by SDK consumers.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * try {
10
+ * await scrawn.sdkCallEventConsumer({ ... });
11
+ * } catch (error) {
12
+ * if (error instanceof ScrawnAuthenticationError) {
13
+ * console.error('Auth failed:', error.message);
14
+ * // Refresh API key
15
+ * } else if (error instanceof ScrawnNetworkError && error.retryable) {
16
+ * // Retry the request
17
+ * }
18
+ * }
19
+ * ```
20
+ */
21
+ /**
22
+ * Base error class for all Scrawn SDK errors.
23
+ * Extends native Error with additional metadata fields.
24
+ */
25
+ export class ScrawnError extends Error {
26
+ constructor(message, options) {
27
+ super(message);
28
+ this.name = "ScrawnError";
29
+ this.code = options.code;
30
+ this.retryable = options.retryable ?? false;
31
+ this.statusCode = options.statusCode;
32
+ this.requestId = options.requestId;
33
+ this.details = options.details;
34
+ this.cause = options.cause;
35
+ // Maintains proper stack trace for where our error was thrown
36
+ if (Error.captureStackTrace) {
37
+ Error.captureStackTrace(this, this.constructor);
38
+ }
39
+ }
40
+ /**
41
+ * Convert error to a plain object for logging/serialization.
42
+ */
43
+ // fallow-ignore-next-line unused-class-member
44
+ toJSON() {
45
+ return {
46
+ name: this.name,
47
+ code: this.code,
48
+ message: this.message,
49
+ retryable: this.retryable,
50
+ statusCode: this.statusCode,
51
+ requestId: this.requestId,
52
+ details: this.details,
53
+ stack: this.stack,
54
+ };
55
+ }
56
+ }
57
+ /**
58
+ * Authentication or authorization error (401, 403).
59
+ * Thrown when API key is invalid, expired, or lacks permissions.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * throw new ScrawnAuthenticationError('Invalid API key', {
64
+ * statusCode: 401,
65
+ * requestId: 'req_123'
66
+ * });
67
+ * ```
68
+ */
69
+ export class ScrawnAuthenticationError extends ScrawnError {
70
+ constructor(message, options) {
71
+ super(message, {
72
+ code: "AUTHENTICATION_ERROR",
73
+ retryable: false,
74
+ statusCode: options?.statusCode ?? 401,
75
+ requestId: options?.requestId,
76
+ details: options?.details,
77
+ cause: options?.cause,
78
+ });
79
+ this.name = "ScrawnAuthenticationError";
80
+ }
81
+ }
82
+ /**
83
+ * Validation error (400).
84
+ * Thrown when request payload fails validation.
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * throw new ScrawnValidationError('Invalid userId', {
89
+ * details: { field: 'userId', constraint: 'non-empty' }
90
+ * });
91
+ * ```
92
+ */
93
+ export class ScrawnValidationError extends ScrawnError {
94
+ constructor(message, options) {
95
+ super(message, {
96
+ code: "VALIDATION_ERROR",
97
+ retryable: false,
98
+ statusCode: 400,
99
+ requestId: options?.requestId,
100
+ details: options?.details,
101
+ cause: options?.cause,
102
+ });
103
+ this.name = "ScrawnValidationError";
104
+ }
105
+ }
106
+ /**
107
+ * Rate limit error (429).
108
+ * Thrown when API rate limits are exceeded.
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * throw new ScrawnRateLimitError('Rate limit exceeded', {
113
+ * details: { retryAfter: 60 }
114
+ * });
115
+ * ```
116
+ */
117
+ export class ScrawnRateLimitError extends ScrawnError {
118
+ constructor(message, options) {
119
+ super(message, {
120
+ code: "RATE_LIMIT_ERROR",
121
+ retryable: true,
122
+ statusCode: 429,
123
+ requestId: options?.requestId,
124
+ details: options?.details,
125
+ cause: options?.cause,
126
+ });
127
+ this.name = "ScrawnRateLimitError";
128
+ this.retryAfter = options?.retryAfter;
129
+ }
130
+ }
131
+ /**
132
+ * Network-related error (timeout, connection failure, DNS issues).
133
+ * These are typically retryable.
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * throw new ScrawnNetworkError('Connection timeout', {
138
+ * cause: originalError,
139
+ * details: { timeout: 30000 }
140
+ * });
141
+ * ```
142
+ */
143
+ export class ScrawnNetworkError extends ScrawnError {
144
+ constructor(message, options) {
145
+ super(message, {
146
+ code: "NETWORK_ERROR",
147
+ retryable: true,
148
+ requestId: options?.requestId,
149
+ details: options?.details,
150
+ cause: options?.cause,
151
+ });
152
+ this.name = "ScrawnNetworkError";
153
+ }
154
+ }
155
+ /**
156
+ * API error from the Scrawn backend (5xx or other server errors).
157
+ * May be retryable depending on status code.
158
+ *
159
+ * @example
160
+ * ```typescript
161
+ * throw new ScrawnAPIError('Internal server error', {
162
+ * statusCode: 500,
163
+ * retryable: true,
164
+ * requestId: 'req_123'
165
+ * });
166
+ * ```
167
+ */
168
+ export class ScrawnAPIError extends ScrawnError {
169
+ constructor(message, options) {
170
+ super(message, {
171
+ code: "API_ERROR",
172
+ retryable: options.retryable ?? options.statusCode >= 500,
173
+ statusCode: options.statusCode,
174
+ requestId: options.requestId,
175
+ details: options.details,
176
+ cause: options.cause,
177
+ });
178
+ this.name = "ScrawnAPIError";
179
+ }
180
+ }
181
+ /**
182
+ * Configuration error (invalid SDK initialization or settings).
183
+ * Not retryable - requires code changes.
184
+ *
185
+ * @example
186
+ * ```typescript
187
+ * throw new ScrawnConfigError('Invalid baseURL format', {
188
+ * details: { baseURL: 'invalid-url' }
189
+ * });
190
+ * ```
191
+ */
192
+ export class ScrawnConfigError extends ScrawnError {
193
+ constructor(message, options) {
194
+ super(message, {
195
+ code: "CONFIG_ERROR",
196
+ retryable: false,
197
+ details: options?.details,
198
+ cause: options?.cause,
199
+ });
200
+ this.name = "ScrawnConfigError";
201
+ }
202
+ }
203
+ /**
204
+ * Helper function to convert gRPC errors to Scrawn errors.
205
+ * Maps gRPC status codes to appropriate Scrawn error types.
206
+ *
207
+ * @internal
208
+ */
209
+ export function convertGrpcError(error, requestId) {
210
+ const message = error instanceof Error ? error.message : "Unknown error occurred";
211
+ // Handle @grpc/grpc-js ServiceError
212
+ if (error && typeof error === "object" && "code" in error) {
213
+ const code = error.code;
214
+ const details = "details" in error ? error.details : undefined;
215
+ const fullMessage = details ? `${message}: ${details}` : message;
216
+ // @grpc/grpc-js status codes: https://grpc.github.io/grpc/core/md_status_codes.html
217
+ switch (code) {
218
+ case 16: // UNAUTHENTICATED
219
+ case 7: // PERMISSION_DENIED
220
+ return new ScrawnAuthenticationError(fullMessage, {
221
+ statusCode: code === 16 ? 401 : 403,
222
+ requestId,
223
+ cause: error,
224
+ });
225
+ case 3: // INVALID_ARGUMENT
226
+ return new ScrawnValidationError(fullMessage, {
227
+ requestId,
228
+ cause: error,
229
+ });
230
+ case 8: // RESOURCE_EXHAUSTED (rate limit)
231
+ return new ScrawnRateLimitError(fullMessage, {
232
+ requestId,
233
+ cause: error,
234
+ });
235
+ case 14: // UNAVAILABLE
236
+ case 4: // DEADLINE_EXCEEDED
237
+ return new ScrawnNetworkError(fullMessage, {
238
+ requestId,
239
+ details: { grpcCode: code },
240
+ cause: error,
241
+ });
242
+ case 13: // INTERNAL
243
+ case 2: // UNKNOWN
244
+ case 12: // UNIMPLEMENTED
245
+ return new ScrawnAPIError(fullMessage, {
246
+ statusCode: 500,
247
+ retryable: code !== 12,
248
+ requestId,
249
+ details: { grpcCode: code },
250
+ cause: error,
251
+ });
252
+ default:
253
+ return new ScrawnAPIError(fullMessage, {
254
+ statusCode: 500,
255
+ retryable: false,
256
+ requestId,
257
+ details: { grpcCode: code },
258
+ cause: error,
259
+ });
260
+ }
261
+ }
262
+ // Fallback for unknown error types
263
+ return new ScrawnNetworkError(message, {
264
+ requestId,
265
+ cause: error instanceof Error ? error : undefined,
266
+ });
267
+ }
268
+ /**
269
+ * Helper to check if an error is a Scrawn error.
270
+ */
271
+ export function isScrawnError(error) {
272
+ return error instanceof ScrawnError;
273
+ }
274
+ /**
275
+ * Helper to check if an error is retryable.
276
+ */
277
+ export function isRetryableError(error) {
278
+ return isScrawnError(error) && error.retryable;
279
+ }
280
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/errors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import * as grpc from "@grpc/grpc-js";
2
+ import { ScrawnLogger } from "../../utils/logger.js";
3
+ export declare class GrpcCallContext<C extends grpc.ServiceClientConstructor> {
4
+ readonly ClientConstructor: C;
5
+ readonly methodName: string;
6
+ readonly target: string;
7
+ readonly credentials: grpc.ChannelCredentials;
8
+ readonly log: ScrawnLogger;
9
+ private readonly metadata;
10
+ constructor(target: string, credentials: grpc.ChannelCredentials, ClientConstructor: C, methodName: string, loggerName: string);
11
+ addMetadata(key: string, value: string): void;
12
+ getMetadata(): grpc.Metadata;
13
+ getServiceName(): string;
14
+ logCallStart(): void;
15
+ logCallSuccess(): void;
16
+ logCallError(error: unknown): void;
17
+ }
18
+ //# sourceMappingURL=callContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callContext.d.ts","sourceRoot":"","sources":["../../../src/core/grpc/callContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,wBAAwB;IAClE,SAAgB,iBAAiB,EAAE,CAAC,CAAC;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC;IACrD,SAAgB,GAAG,EAAE,YAAY,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;gBAG9C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,IAAI,CAAC,kBAAkB,EACpC,iBAAiB,EAAE,CAAC,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM;IASpB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7C,WAAW,IAAI,IAAI,CAAC,QAAQ;IAQ5B,cAAc,IAAI,MAAM;IAIxB,YAAY,IAAI,IAAI;IAMpB,cAAc,IAAI,IAAI;IAMtB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAKnC"}
@@ -0,0 +1,35 @@
1
+ import * as grpc from "@grpc/grpc-js";
2
+ import { ScrawnLogger } from "../../utils/logger.js";
3
+ export class GrpcCallContext {
4
+ constructor(target, credentials, ClientConstructor, methodName, loggerName) {
5
+ this.metadata = new grpc.Metadata();
6
+ this.target = target;
7
+ this.credentials = credentials;
8
+ this.ClientConstructor = ClientConstructor;
9
+ this.methodName = methodName;
10
+ this.log = new ScrawnLogger(loggerName);
11
+ }
12
+ addMetadata(key, value) {
13
+ this.metadata.set(key, value);
14
+ }
15
+ getMetadata() {
16
+ const copy = new grpc.Metadata();
17
+ for (const [key, values] of Object.entries(this.metadata.getMap())) {
18
+ copy.set(key, values);
19
+ }
20
+ return copy;
21
+ }
22
+ getServiceName() {
23
+ return this.ClientConstructor.serviceName;
24
+ }
25
+ logCallStart() {
26
+ this.log.info(`Making gRPC call to ${this.getServiceName()}.${this.methodName}`);
27
+ }
28
+ logCallSuccess() {
29
+ this.log.info(`Successfully completed gRPC call to ${this.getServiceName()}.${this.methodName}`);
30
+ }
31
+ logCallError(error) {
32
+ this.log.error(`gRPC call to ${this.getServiceName()}.${this.methodName} failed: ${error instanceof Error ? error.message : "Unknown error"}`);
33
+ }
34
+ }
35
+ //# sourceMappingURL=callContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callContext.js","sourceRoot":"","sources":["../../../src/core/grpc/callContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,OAAO,eAAe;IAQ1B,YACE,MAAc,EACd,WAAoC,EACpC,iBAAoB,EACpB,UAAkB,EAClB,UAAkB;QAPH,aAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAS9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW,CAAC,GAAW,EAAE,KAAa;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,WAAW;QACT,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;IAC5C,CAAC;IAED,YAAY;QACV,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,uBAAuB,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,uCAAuC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,gBAAgB,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,UAAU,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC/H,CAAC;IACJ,CAAC;CACF"}
@@ -1,126 +1,16 @@
1
- /**
2
- * Type-safe gRPC client abstraction layer.
3
- *
4
- * This module provides the main entry point for making gRPC calls with
5
- * full compile-time type safety and a beautiful fluent API.
6
- *
7
- * @example
8
- * ```typescript
9
- * const client = new GrpcClient('https://api.scrawn.dev');
10
- *
11
- * const response = await client
12
- * .newCall(EventService, 'registerEvent')
13
- * .addHeader('Authorization', `Bearer ${apiKey}`)
14
- * .addHeader('x-request-id', '123')
15
- * .addPayload({
16
- * type: EventType.SDK_CALL,
17
- * userId: 'user_123',
18
- * data: { case: 'sdkCall', value: new SDKCall({ sdkCallType: SDKCallType.RAW, debitAmount: 10 }) }
19
- * })
20
- * .request();
21
- * ```
22
- */
23
- import type { Transport } from '@connectrpc/connect';
24
- import type { ServiceType } from '@bufbuild/protobuf';
25
- import { RequestBuilder } from './requestBuilder.js';
26
- import type { ServiceMethodNames } from './types.js';
27
- /**
28
- * Main gRPC client for making type-safe API calls.
29
- *
30
- * This class manages the underlying transport and provides a factory method
31
- * for creating type-safe request builders. Each request builder is bound to
32
- * a specific service and method, ensuring compile-time type safety.
33
- *
34
- * The client handles:
35
- * - Transport configuration (HTTP/1.1)
36
- * - Request building with fluent API
37
- * - Header management (auth should be added via .addHeader())
38
- * - Error handling and logging
39
- *
40
- * @example
41
- * ```typescript
42
- * // Initialize the client
43
- * const client = new GrpcClient('https://api.scrawn.dev');
44
- *
45
- * // Fetch credentials from your auth system
46
- * const creds = await getCredentials();
47
- *
48
- * // Make a call to EventService.registerEvent
49
- * const eventResponse = await client
50
- * .newCall(EventService, 'registerEvent')
51
- * .addHeader('Authorization', `Bearer ${creds.apiKey}`)
52
- * .addPayload({ type: EventType.SDK_CALL, userId: 'u123', ... })
53
- * .request();
54
- *
55
- * // Make a call to AuthService.createAPIKey
56
- * const authResponse = await client
57
- * .newCall(AuthService, 'createAPIKey')
58
- * .addHeader('Authorization', `Bearer ${creds.apiKey}`)
59
- * .addPayload({ name: 'My Key', expiresIn: 3600n })
60
- * .request();
61
- * ```
62
- */
1
+ import * as grpc from "@grpc/grpc-js";
2
+ import { RequestBuilder } from "./requestBuilder.js";
3
+ import { StreamRequestBuilder } from "./streamRequestBuilder.js";
4
+ export interface GrpcClientOptions {
5
+ secure?: boolean;
6
+ credentials?: grpc.ChannelCredentials;
7
+ }
63
8
  export declare class GrpcClient {
64
- /** The underlying gRPC transport */
65
- private readonly transport;
66
- /** Base URL for API calls */
67
- private readonly baseURL;
68
- /**
69
- * Create a new GrpcClient.
70
- *
71
- * @param baseURL - The base URL of the gRPC API (e.g., 'https://api.scrawn.dev')
72
- *
73
- * @example
74
- * ```typescript
75
- * const client = new GrpcClient('https://api.scrawn.dev');
76
- * ```
77
- */
78
- constructor(baseURL: string);
79
- /**
80
- * Create a new request builder for a specific service method.
81
- *
82
- * This is the entry point for making gRPC calls. The method is fully type-safe:
83
- * - Service parameter must be a valid gRPC service
84
- * - Method name must exist on the service (autocomplete provided)
85
- * - Payload type is inferred from the method
86
- * - Response type is inferred from the method
87
- *
88
- * @template S - The gRPC service type (auto-inferred)
89
- * @template M - The method name (auto-inferred and validated)
90
- *
91
- * @param service - The gRPC service definition (e.g., EventService, AuthService)
92
- * @param method - The method name as a string literal (e.g., 'registerEvent', 'createAPIKey')
93
- * @returns A new RequestBuilder for chaining headers, payload, and execution
94
- *
95
- * @example
96
- * ```typescript
97
- * // EventService.registerEvent
98
- * const eventBuilder = client.newCall(EventService, 'registerEvent');
99
- * // Payload type is RegisterEventRequest
100
- * // Response type is RegisterEventResponse
101
- *
102
- * // AuthService.createAPIKey
103
- * const authBuilder = client.newCall(AuthService, 'createAPIKey');
104
- * // Payload type is CreateAPIKeyRequest
105
- * // Response type is CreateAPIKeyResponse
106
- *
107
- * // Type error - method doesn't exist!
108
- * // const invalid = client.newCall(EventService, 'nonExistentMethod');
109
- * ```
110
- */
111
- newCall<S extends ServiceType, M extends ServiceMethodNames<S>>(service: S, method: M): RequestBuilder<S, M>;
112
- /**
113
- * Get the base URL of this client.
114
- *
115
- * @returns The base URL string
116
- */
117
- getBaseURL(): string;
118
- /**
119
- * Get the underlying transport (for advanced use cases).
120
- *
121
- * @returns The Connect transport instance
122
- * @internal
123
- */
124
- getTransport(): Transport;
9
+ private readonly target;
10
+ private readonly credentials;
11
+ constructor(target: string, options?: GrpcClientOptions);
12
+ newCall<C extends grpc.ServiceClientConstructor>(client: C, method: string): RequestBuilder<C>;
13
+ newStreamCall<C extends grpc.ServiceClientConstructor>(client: C, method: string): StreamRequestBuilder<C>;
14
+ getTarget(): string;
125
15
  }
126
16
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/grpc/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,UAAU;IACrB,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;;;;;;;OASG;gBACS,OAAO,EAAE,MAAM;IAa3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAC5D,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,CAAC,GACR,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAKvB;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAIpB;;;;;OAKG;IACH,YAAY,IAAI,SAAS;CAG1B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/grpc/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;CACvC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;gBAE1C,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAmBvD,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC,wBAAwB,EAC7C,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,CAAC,CAAC;IAMpB,aAAa,CAAC,CAAC,SAAS,IAAI,CAAC,wBAAwB,EACnD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,GACb,oBAAoB,CAAC,CAAC,CAAC;IAM1B,SAAS,IAAI,MAAM;CAGpB"}
@@ -1,138 +1,30 @@
1
- /**
2
- * Type-safe gRPC client abstraction layer.
3
- *
4
- * This module provides the main entry point for making gRPC calls with
5
- * full compile-time type safety and a beautiful fluent API.
6
- *
7
- * @example
8
- * ```typescript
9
- * const client = new GrpcClient('https://api.scrawn.dev');
10
- *
11
- * const response = await client
12
- * .newCall(EventService, 'registerEvent')
13
- * .addHeader('Authorization', `Bearer ${apiKey}`)
14
- * .addHeader('x-request-id', '123')
15
- * .addPayload({
16
- * type: EventType.SDK_CALL,
17
- * userId: 'user_123',
18
- * data: { case: 'sdkCall', value: new SDKCall({ sdkCallType: SDKCallType.RAW, debitAmount: 10 }) }
19
- * })
20
- * .request();
21
- * ```
22
- */
23
- import { createConnectTransport } from '@connectrpc/connect-node';
24
- import { RequestBuilder } from './requestBuilder.js';
25
- import { ScrawnLogger } from '../../utils/logger.js';
26
- import { ScrawnConfig } from '../../config.js';
27
- const log = new ScrawnLogger('GrpcClient');
28
- /**
29
- * Main gRPC client for making type-safe API calls.
30
- *
31
- * This class manages the underlying transport and provides a factory method
32
- * for creating type-safe request builders. Each request builder is bound to
33
- * a specific service and method, ensuring compile-time type safety.
34
- *
35
- * The client handles:
36
- * - Transport configuration (HTTP/1.1)
37
- * - Request building with fluent API
38
- * - Header management (auth should be added via .addHeader())
39
- * - Error handling and logging
40
- *
41
- * @example
42
- * ```typescript
43
- * // Initialize the client
44
- * const client = new GrpcClient('https://api.scrawn.dev');
45
- *
46
- * // Fetch credentials from your auth system
47
- * const creds = await getCredentials();
48
- *
49
- * // Make a call to EventService.registerEvent
50
- * const eventResponse = await client
51
- * .newCall(EventService, 'registerEvent')
52
- * .addHeader('Authorization', `Bearer ${creds.apiKey}`)
53
- * .addPayload({ type: EventType.SDK_CALL, userId: 'u123', ... })
54
- * .request();
55
- *
56
- * // Make a call to AuthService.createAPIKey
57
- * const authResponse = await client
58
- * .newCall(AuthService, 'createAPIKey')
59
- * .addHeader('Authorization', `Bearer ${creds.apiKey}`)
60
- * .addPayload({ name: 'My Key', expiresIn: 3600n })
61
- * .request();
62
- * ```
63
- */
1
+ import * as grpc from "@grpc/grpc-js";
2
+ import { GrpcCallContext } from "./callContext.js";
3
+ import { RequestBuilder } from "./requestBuilder.js";
4
+ import { StreamRequestBuilder } from "./streamRequestBuilder.js";
5
+ import { ScrawnLogger } from "../../utils/logger.js";
6
+ const log = new ScrawnLogger("GrpcClient");
64
7
  export class GrpcClient {
65
- /**
66
- * Create a new GrpcClient.
67
- *
68
- * @param baseURL - The base URL of the gRPC API (e.g., 'https://api.scrawn.dev')
69
- *
70
- * @example
71
- * ```typescript
72
- * const client = new GrpcClient('https://api.scrawn.dev');
73
- * ```
74
- */
75
- constructor(baseURL) {
76
- this.baseURL = baseURL;
77
- log.info(`Initializing gRPC client for ${baseURL}`);
78
- this.transport = createConnectTransport({
79
- baseUrl: this.baseURL,
80
- httpVersion: ScrawnConfig.grpc.httpVersion,
81
- });
82
- log.info('gRPC client initialized successfully');
8
+ constructor(target, options) {
9
+ if (!target || !target.includes(":")) {
10
+ throw new Error(`Invalid target format: ${target}. Expected host:port format.`);
11
+ }
12
+ this.target = target;
13
+ this.credentials =
14
+ options?.credentials ??
15
+ (options?.secure
16
+ ? grpc.credentials.createSsl()
17
+ : grpc.credentials.createInsecure());
18
+ log.info(`Initialized gRPC client for ${target} (${options?.secure ? "secure" : "insecure"})`);
83
19
  }
84
- /**
85
- * Create a new request builder for a specific service method.
86
- *
87
- * This is the entry point for making gRPC calls. The method is fully type-safe:
88
- * - Service parameter must be a valid gRPC service
89
- * - Method name must exist on the service (autocomplete provided)
90
- * - Payload type is inferred from the method
91
- * - Response type is inferred from the method
92
- *
93
- * @template S - The gRPC service type (auto-inferred)
94
- * @template M - The method name (auto-inferred and validated)
95
- *
96
- * @param service - The gRPC service definition (e.g., EventService, AuthService)
97
- * @param method - The method name as a string literal (e.g., 'registerEvent', 'createAPIKey')
98
- * @returns A new RequestBuilder for chaining headers, payload, and execution
99
- *
100
- * @example
101
- * ```typescript
102
- * // EventService.registerEvent
103
- * const eventBuilder = client.newCall(EventService, 'registerEvent');
104
- * // Payload type is RegisterEventRequest
105
- * // Response type is RegisterEventResponse
106
- *
107
- * // AuthService.createAPIKey
108
- * const authBuilder = client.newCall(AuthService, 'createAPIKey');
109
- * // Payload type is CreateAPIKeyRequest
110
- * // Response type is CreateAPIKeyResponse
111
- *
112
- * // Type error - method doesn't exist!
113
- * // const invalid = client.newCall(EventService, 'nonExistentMethod');
114
- * ```
115
- */
116
- newCall(service, method) {
117
- log.debug(`Creating new request builder for ${service.typeName}.${method}`);
118
- return new RequestBuilder(this.transport, service, method);
20
+ newCall(client, method) {
21
+ return new RequestBuilder(new GrpcCallContext(this.target, this.credentials, client, method, "RequestBuilder"));
119
22
  }
120
- /**
121
- * Get the base URL of this client.
122
- *
123
- * @returns The base URL string
124
- */
125
- getBaseURL() {
126
- return this.baseURL;
23
+ newStreamCall(client, method) {
24
+ return new StreamRequestBuilder(new GrpcCallContext(this.target, this.credentials, client, method, "StreamRequestBuilder"));
127
25
  }
128
- /**
129
- * Get the underlying transport (for advanced use cases).
130
- *
131
- * @returns The Connect transport instance
132
- * @internal
133
- */
134
- getTransport() {
135
- return this.transport;
26
+ getTarget() {
27
+ return this.target;
136
28
  }
137
29
  }
138
30
  //# sourceMappingURL=client.js.map