@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.
- package/README.md +40 -0
- package/dist/config.d.ts +17 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -2
- package/dist/config.js.map +1 -1
- package/dist/core/auth/apiKeyAuth.d.ts +4 -13
- package/dist/core/auth/apiKeyAuth.d.ts.map +1 -1
- package/dist/core/auth/apiKeyAuth.js +12 -17
- package/dist/core/auth/apiKeyAuth.js.map +1 -1
- package/dist/core/auth/baseAuth.d.ts +14 -36
- package/dist/core/auth/baseAuth.d.ts.map +1 -1
- package/dist/core/auth/baseAuth.js +0 -6
- package/dist/core/auth/baseAuth.js.map +1 -1
- package/dist/core/errors/index.d.ts +192 -0
- package/dist/core/errors/index.d.ts.map +1 -0
- package/dist/core/errors/index.js +280 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/grpc/callContext.d.ts +18 -0
- package/dist/core/grpc/callContext.d.ts.map +1 -0
- package/dist/core/grpc/callContext.js +35 -0
- package/dist/core/grpc/callContext.js.map +1 -0
- package/dist/core/grpc/client.d.ts +13 -123
- package/dist/core/grpc/client.d.ts.map +1 -1
- package/dist/core/grpc/client.js +23 -131
- package/dist/core/grpc/client.js.map +1 -1
- package/dist/core/grpc/index.d.ts +5 -3
- package/dist/core/grpc/index.d.ts.map +1 -1
- package/dist/core/grpc/index.js +4 -2
- package/dist/core/grpc/index.js.map +1 -1
- package/dist/core/grpc/requestBuilder.d.ts +12 -113
- package/dist/core/grpc/requestBuilder.d.ts.map +1 -1
- package/dist/core/grpc/requestBuilder.js +36 -126
- package/dist/core/grpc/requestBuilder.js.map +1 -1
- package/dist/core/grpc/streamRequestBuilder.d.ts +13 -0
- package/dist/core/grpc/streamRequestBuilder.d.ts.map +1 -0
- package/dist/core/grpc/streamRequestBuilder.js +60 -0
- package/dist/core/grpc/streamRequestBuilder.js.map +1 -0
- package/dist/core/grpc/types.d.ts +5 -52
- package/dist/core/grpc/types.d.ts.map +1 -1
- package/dist/core/grpc/types.js +0 -7
- package/dist/core/grpc/types.js.map +1 -1
- package/dist/core/pricing/builders.d.ts +157 -0
- package/dist/core/pricing/builders.d.ts.map +1 -0
- package/dist/core/pricing/builders.js +218 -0
- package/dist/core/pricing/builders.js.map +1 -0
- package/dist/core/pricing/index.d.ts +30 -0
- package/dist/core/pricing/index.d.ts.map +1 -0
- package/dist/core/pricing/index.js +32 -0
- package/dist/core/pricing/index.js.map +1 -0
- package/dist/core/pricing/resolve.d.ts +39 -0
- package/dist/core/pricing/resolve.d.ts.map +1 -0
- package/dist/core/pricing/resolve.js +50 -0
- package/dist/core/pricing/resolve.js.map +1 -0
- package/dist/core/pricing/serialize.d.ts +55 -0
- package/dist/core/pricing/serialize.d.ts.map +1 -0
- package/dist/core/pricing/serialize.js +127 -0
- package/dist/core/pricing/serialize.js.map +1 -0
- package/dist/core/pricing/types.d.ts +122 -0
- package/dist/core/pricing/types.d.ts.map +1 -0
- package/dist/core/pricing/types.js +17 -0
- package/dist/core/pricing/types.js.map +1 -0
- package/dist/core/pricing/validate.d.ts +56 -0
- package/dist/core/pricing/validate.d.ts.map +1 -0
- package/dist/core/pricing/validate.js +162 -0
- package/dist/core/pricing/validate.js.map +1 -0
- package/dist/core/scrawn.d.ts +218 -17
- package/dist/core/scrawn.d.ts.map +1 -1
- package/dist/core/scrawn.js +469 -71
- package/dist/core/scrawn.js.map +1 -1
- package/dist/core/types/auth.d.ts +1 -1
- package/dist/core/types/event.d.ts +182 -18
- package/dist/core/types/event.d.ts.map +1 -1
- package/dist/core/types/event.js +133 -5
- package/dist/core/types/event.js.map +1 -1
- package/dist/gen/auth/v1/auth_grpc_pb.d.ts +3 -0
- package/dist/gen/auth/v1/auth_grpc_pb.js +45 -0
- package/dist/gen/auth/v1/auth_pb.d.ts +63 -57
- package/dist/gen/auth/v1/auth_pb.js +471 -86
- package/dist/gen/data/v1/data_grpc_pb.d.ts +5 -0
- package/dist/gen/data/v1/data_grpc_pb.js +44 -0
- package/dist/gen/data/v1/data_pb.d.ts +254 -0
- package/dist/gen/data/v1/data_pb.js +1530 -0
- package/dist/gen/event/v1/event_grpc_pb.d.ts +3 -0
- package/dist/gen/event/v1/event_grpc_pb.js +79 -0
- package/dist/gen/event/v1/event_pb.d.ts +273 -100
- package/dist/gen/event/v1/event_pb.js +1862 -138
- package/dist/gen/package.json +3 -0
- package/dist/gen/payment/v1/payment_grpc_pb.d.ts +3 -0
- package/dist/gen/payment/v1/payment_grpc_pb.js +45 -0
- package/dist/gen/payment/v1/payment_pb.d.ts +43 -35
- package/dist/gen/payment/v1/payment_pb.js +321 -59
- package/dist/gen/query/v1/query_grpc_pb.d.ts +5 -0
- package/dist/gen/query/v1/query_grpc_pb.js +44 -0
- package/dist/gen/query/v1/query_pb.d.ts +359 -0
- package/dist/gen/query/v1/query_pb.js +2327 -0
- package/dist/index.d.ts +19 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -10
- package/dist/index.js.map +1 -1
- package/dist/utils/forkAsyncIterable.d.ts +13 -0
- package/dist/utils/forkAsyncIterable.d.ts.map +1 -0
- package/dist/utils/forkAsyncIterable.js +78 -0
- package/dist/utils/forkAsyncIterable.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +19 -19
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/pathMatcher.js +5 -5
- package/package.json +19 -15
- package/dist/gen/auth/v1/auth_connect.d.ts +0 -22
- package/dist/gen/auth/v1/auth_connect.d.ts.map +0 -1
- package/dist/gen/auth/v1/auth_connect.js +0 -26
- package/dist/gen/auth/v1/auth_connect.js.map +0 -1
- package/dist/gen/auth/v1/auth_pb.d.ts.map +0 -1
- package/dist/gen/auth/v1/auth_pb.js.map +0 -1
- package/dist/gen/event/v1/event_connect.d.ts +0 -22
- package/dist/gen/event/v1/event_connect.d.ts.map +0 -1
- package/dist/gen/event/v1/event_connect.js +0 -26
- package/dist/gen/event/v1/event_connect.js.map +0 -1
- package/dist/gen/event/v1/event_pb.d.ts.map +0 -1
- package/dist/gen/event/v1/event_pb.js.map +0 -1
- package/dist/gen/payment/v1/payment_connect.d.ts +0 -22
- package/dist/gen/payment/v1/payment_connect.d.ts.map +0 -1
- package/dist/gen/payment/v1/payment_connect.js +0 -26
- package/dist/gen/payment/v1/payment_connect.js.map +0 -1
- package/dist/gen/payment/v1/payment_pb.d.ts.map +0 -1
- 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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
65
|
-
private readonly
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
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"}
|
package/dist/core/grpc/client.js
CHANGED
|
@@ -1,138 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|