@managesome/knotr-toolkit 0.1.1 → 0.8.5
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/dist/backend/config.d.ts +43 -0
- package/dist/backend/config.d.ts.map +1 -0
- package/dist/backend/config.js +82 -0
- package/dist/backend/config.js.map +1 -0
- package/dist/backend/database.d.ts +28 -0
- package/dist/backend/database.d.ts.map +1 -0
- package/dist/backend/database.js +112 -0
- package/dist/backend/database.js.map +1 -0
- package/dist/backend/firebase.d.ts +68 -0
- package/dist/backend/firebase.d.ts.map +1 -0
- package/dist/backend/firebase.js +233 -0
- package/dist/backend/firebase.js.map +1 -0
- package/dist/backend/index.d.ts +8 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +19 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/logger.d.ts +23 -0
- package/dist/backend/logger.d.ts.map +1 -0
- package/dist/backend/logger.js +107 -0
- package/dist/backend/logger.js.map +1 -0
- package/dist/backend/redis.d.ts +59 -0
- package/dist/backend/redis.d.ts.map +1 -0
- package/dist/backend/redis.js +169 -0
- package/dist/backend/redis.js.map +1 -0
- package/dist/backend/socket.d.ts +81 -0
- package/dist/backend/socket.d.ts.map +1 -0
- package/dist/backend/socket.js +132 -0
- package/dist/backend/socket.js.map +1 -0
- package/dist/backend/worker-queue.d.ts +40 -0
- package/dist/backend/worker-queue.d.ts.map +1 -0
- package/dist/backend/worker-queue.js +140 -0
- package/dist/backend/worker-queue.js.map +1 -0
- package/dist/client/api-client.d.ts +101 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +261 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/client/api-error.d.ts +100 -0
- package/dist/client/api-error.d.ts.map +1 -0
- package/dist/client/api-error.js +111 -0
- package/dist/client/api-error.js.map +1 -0
- package/dist/client/endpoints.d.ts +510 -0
- package/dist/client/endpoints.d.ts.map +1 -0
- package/dist/client/endpoints.js +306 -0
- package/dist/client/endpoints.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/constants/index.d.ts +2 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -1
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/socket.d.ts +165 -0
- package/dist/constants/socket.d.ts.map +1 -0
- package/dist/constants/socket.js +204 -0
- package/dist/constants/socket.js.map +1 -0
- package/dist/helpers/ApiError.d.ts +74 -0
- package/dist/helpers/ApiError.d.ts.map +1 -0
- package/dist/helpers/ApiError.js +105 -0
- package/dist/helpers/ApiError.js.map +1 -0
- package/dist/helpers/asyncHandler.d.ts +42 -0
- package/dist/helpers/asyncHandler.d.ts.map +1 -0
- package/dist/helpers/asyncHandler.js +47 -0
- package/dist/helpers/asyncHandler.js.map +1 -0
- package/dist/helpers/id-generator.d.ts +98 -0
- package/dist/helpers/id-generator.d.ts.map +1 -0
- package/dist/helpers/id-generator.js +128 -0
- package/dist/helpers/id-generator.js.map +1 -0
- package/dist/helpers/index.d.ts +5 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +8 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/response-timing.d.ts +91 -0
- package/dist/helpers/response-timing.d.ts.map +1 -0
- package/dist/helpers/response-timing.js +176 -0
- package/dist/helpers/response-timing.js.map +1 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/schemas/account.schema.d.ts +4500 -0
- package/dist/schemas/account.schema.d.ts.map +1 -0
- package/dist/schemas/account.schema.js +123 -0
- package/dist/schemas/account.schema.js.map +1 -0
- package/dist/schemas/chat.schema.d.ts +4796 -0
- package/dist/schemas/chat.schema.d.ts.map +1 -0
- package/dist/schemas/chat.schema.js +107 -0
- package/dist/schemas/chat.schema.js.map +1 -0
- package/dist/schemas/collaboration-request.schema.d.ts +3960 -0
- package/dist/schemas/collaboration-request.schema.d.ts.map +1 -0
- package/dist/schemas/collaboration-request.schema.js +92 -0
- package/dist/schemas/collaboration-request.schema.js.map +1 -0
- package/dist/schemas/company-review.schema.d.ts +3465 -0
- package/dist/schemas/company-review.schema.d.ts.map +1 -0
- package/dist/schemas/company-review.schema.js +73 -0
- package/dist/schemas/company-review.schema.js.map +1 -0
- package/dist/schemas/company.schema.d.ts +6152 -0
- package/dist/schemas/company.schema.d.ts.map +1 -0
- package/dist/schemas/company.schema.js +192 -0
- package/dist/schemas/company.schema.js.map +1 -0
- package/dist/schemas/contract.schema.d.ts +5286 -0
- package/dist/schemas/contract.schema.d.ts.map +1 -0
- package/dist/schemas/contract.schema.js +115 -0
- package/dist/schemas/contract.schema.js.map +1 -0
- package/dist/schemas/dispute-evidence.schema.d.ts +3788 -0
- package/dist/schemas/dispute-evidence.schema.d.ts.map +1 -0
- package/dist/schemas/dispute-evidence.schema.js +71 -0
- package/dist/schemas/dispute-evidence.schema.js.map +1 -0
- package/dist/schemas/dispute.schema.d.ts +4970 -0
- package/dist/schemas/dispute.schema.d.ts.map +1 -0
- package/dist/schemas/dispute.schema.js +152 -0
- package/dist/schemas/dispute.schema.js.map +1 -0
- package/dist/schemas/donation.schema.d.ts +3594 -0
- package/dist/schemas/donation.schema.d.ts.map +1 -0
- package/dist/schemas/donation.schema.js +95 -0
- package/dist/schemas/donation.schema.js.map +1 -0
- package/dist/schemas/escrow.schema.d.ts +4322 -0
- package/dist/schemas/escrow.schema.d.ts.map +1 -0
- package/dist/schemas/escrow.schema.js +93 -0
- package/dist/schemas/escrow.schema.js.map +1 -0
- package/dist/schemas/flag.schema.d.ts +4375 -0
- package/dist/schemas/flag.schema.d.ts.map +1 -0
- package/dist/schemas/flag.schema.js +133 -0
- package/dist/schemas/flag.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +33 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +39 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/interest.schema.d.ts +3804 -0
- package/dist/schemas/interest.schema.d.ts.map +1 -0
- package/dist/schemas/interest.schema.js +107 -0
- package/dist/schemas/interest.schema.js.map +1 -0
- package/dist/schemas/match.schema.d.ts +4013 -0
- package/dist/schemas/match.schema.d.ts.map +1 -0
- package/dist/schemas/match.schema.js +118 -0
- package/dist/schemas/match.schema.js.map +1 -0
- package/dist/schemas/message.schema.d.ts +4213 -0
- package/dist/schemas/message.schema.d.ts.map +1 -0
- package/dist/schemas/message.schema.js +134 -0
- package/dist/schemas/message.schema.js.map +1 -0
- package/dist/schemas/milestone.schema.d.ts +4310 -0
- package/dist/schemas/milestone.schema.d.ts.map +1 -0
- package/dist/schemas/milestone.schema.js +99 -0
- package/dist/schemas/milestone.schema.js.map +1 -0
- package/dist/schemas/notification.schema.d.ts +4641 -0
- package/dist/schemas/notification.schema.d.ts.map +1 -0
- package/dist/schemas/notification.schema.js +139 -0
- package/dist/schemas/notification.schema.js.map +1 -0
- package/dist/schemas/profile.schema.d.ts +9589 -0
- package/dist/schemas/profile.schema.d.ts.map +1 -0
- package/dist/schemas/profile.schema.js +360 -0
- package/dist/schemas/profile.schema.js.map +1 -0
- package/dist/schemas/profit-share-agreement.schema.d.ts +3789 -0
- package/dist/schemas/profit-share-agreement.schema.d.ts.map +1 -0
- package/dist/schemas/profit-share-agreement.schema.js +76 -0
- package/dist/schemas/profit-share-agreement.schema.js.map +1 -0
- package/dist/schemas/profit-share.schema.d.ts +4051 -0
- package/dist/schemas/profit-share.schema.d.ts.map +1 -0
- package/dist/schemas/profit-share.schema.js +96 -0
- package/dist/schemas/profit-share.schema.js.map +1 -0
- package/dist/schemas/promo-code.schema.d.ts +3924 -0
- package/dist/schemas/promo-code.schema.d.ts.map +1 -0
- package/dist/schemas/promo-code.schema.js +112 -0
- package/dist/schemas/promo-code.schema.js.map +1 -0
- package/dist/schemas/proposal.schema.d.ts +5182 -0
- package/dist/schemas/proposal.schema.d.ts.map +1 -0
- package/dist/schemas/proposal.schema.js +114 -0
- package/dist/schemas/proposal.schema.js.map +1 -0
- package/dist/schemas/purchase.schema.d.ts +3724 -0
- package/dist/schemas/purchase.schema.d.ts.map +1 -0
- package/dist/schemas/purchase.schema.js +89 -0
- package/dist/schemas/purchase.schema.js.map +1 -0
- package/dist/schemas/requirement-post.schema.d.ts +6315 -0
- package/dist/schemas/requirement-post.schema.d.ts.map +1 -0
- package/dist/schemas/requirement-post.schema.js +153 -0
- package/dist/schemas/requirement-post.schema.js.map +1 -0
- package/dist/schemas/review.schema.d.ts +4512 -0
- package/dist/schemas/review.schema.d.ts.map +1 -0
- package/dist/schemas/review.schema.js +121 -0
- package/dist/schemas/review.schema.js.map +1 -0
- package/dist/schemas/service-listing.schema.d.ts +5152 -0
- package/dist/schemas/service-listing.schema.d.ts.map +1 -0
- package/dist/schemas/service-listing.schema.js +137 -0
- package/dist/schemas/service-listing.schema.js.map +1 -0
- package/dist/schemas/subscription.schema.d.ts +3985 -0
- package/dist/schemas/subscription.schema.d.ts.map +1 -0
- package/dist/schemas/subscription.schema.js +94 -0
- package/dist/schemas/subscription.schema.js.map +1 -0
- package/dist/schemas/tmc-application.schema.d.ts +4357 -0
- package/dist/schemas/tmc-application.schema.d.ts.map +1 -0
- package/dist/schemas/tmc-application.schema.js +96 -0
- package/dist/schemas/tmc-application.schema.js.map +1 -0
- package/dist/schemas/tmc-membership.schema.d.ts +3985 -0
- package/dist/schemas/tmc-membership.schema.d.ts.map +1 -0
- package/dist/schemas/tmc-membership.schema.js +84 -0
- package/dist/schemas/tmc-membership.schema.js.map +1 -0
- package/dist/schemas/trust-badge.schema.d.ts +3919 -0
- package/dist/schemas/trust-badge.schema.d.ts.map +1 -0
- package/dist/schemas/trust-badge.schema.js +83 -0
- package/dist/schemas/trust-badge.schema.js.map +1 -0
- package/dist/schemas/verification.schema.d.ts +4606 -0
- package/dist/schemas/verification.schema.d.ts.map +1 -0
- package/dist/schemas/verification.schema.js +114 -0
- package/dist/schemas/verification.schema.js.map +1 -0
- package/dist/schemas/webhook-event.schema.d.ts +3534 -0
- package/dist/schemas/webhook-event.schema.d.ts.map +1 -0
- package/dist/schemas/webhook-event.schema.js +83 -0
- package/dist/schemas/webhook-event.schema.js.map +1 -0
- package/dist/types/account.d.ts +36 -7
- package/dist/types/account.d.ts.map +1 -1
- package/dist/types/account.js +3 -1
- package/dist/types/account.js.map +1 -1
- package/dist/types/admin.d.ts +20 -10
- package/dist/types/admin.d.ts.map +1 -1
- package/dist/types/admin.js +3 -1
- package/dist/types/admin.js.map +1 -1
- package/dist/types/api.d.ts +184 -109
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/api.js +2 -1
- package/dist/types/api.js.map +1 -1
- package/dist/types/chat.d.ts +38 -20
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/chat.js +3 -1
- package/dist/types/chat.js.map +1 -1
- package/dist/types/common.d.ts +39 -12
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +4 -1
- package/dist/types/common.js.map +1 -1
- package/dist/types/company.d.ts +61 -44
- package/dist/types/company.d.ts.map +1 -1
- package/dist/types/company.js +3 -1
- package/dist/types/company.js.map +1 -1
- package/dist/types/flag.d.ts +19 -8
- package/dist/types/flag.d.ts.map +1 -1
- package/dist/types/flag.js +3 -1
- package/dist/types/flag.js.map +1 -1
- package/dist/types/forms.d.ts +334 -0
- package/dist/types/forms.d.ts.map +1 -0
- package/dist/types/forms.js +5 -0
- package/dist/types/forms.js.map +1 -0
- package/dist/types/index.d.ts +18 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +18 -13
- package/dist/types/index.js.map +1 -1
- package/dist/types/marketplace.d.ts +174 -104
- package/dist/types/marketplace.d.ts.map +1 -1
- package/dist/types/marketplace.js +2 -0
- package/dist/types/marketplace.js.map +1 -1
- package/dist/types/match.d.ts +36 -19
- package/dist/types/match.d.ts.map +1 -1
- package/dist/types/match.js +3 -1
- package/dist/types/match.js.map +1 -1
- package/dist/types/navigation.d.ts +305 -0
- package/dist/types/navigation.d.ts.map +1 -0
- package/dist/types/navigation.js +18 -0
- package/dist/types/navigation.js.map +1 -0
- package/dist/types/notification.d.ts +92 -0
- package/dist/types/notification.d.ts.map +1 -0
- package/dist/types/notification.js +5 -0
- package/dist/types/notification.js.map +1 -0
- package/dist/types/payment.d.ts +70 -38
- package/dist/types/payment.d.ts.map +1 -1
- package/dist/types/payment.js +3 -1
- package/dist/types/payment.js.map +1 -1
- package/dist/types/policy.d.ts +174 -81
- package/dist/types/policy.d.ts.map +1 -1
- package/dist/types/policy.js.map +1 -1
- package/dist/types/profile.d.ts +48 -37
- package/dist/types/profile.d.ts.map +1 -1
- package/dist/types/profile.js +3 -1
- package/dist/types/profile.js.map +1 -1
- package/dist/types/socket.d.ts +431 -0
- package/dist/types/socket.d.ts.map +1 -0
- package/dist/types/socket.js +5 -0
- package/dist/types/socket.js.map +1 -0
- package/dist/types/verification.d.ts +18 -9
- package/dist/types/verification.d.ts.map +1 -1
- package/dist/types/verification.js +3 -1
- package/dist/types/verification.js.map +1 -1
- package/dist/types/worker.d.ts +452 -0
- package/dist/types/worker.d.ts.map +1 -0
- package/dist/types/worker.js +5 -0
- package/dist/types/worker.js.map +1 -0
- package/dist/validation/index.d.ts +5 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/messages.d.ts +124 -0
- package/dist/validation/messages.d.ts.map +1 -0
- package/dist/validation/messages.js +160 -0
- package/dist/validation/messages.js.map +1 -0
- package/dist/validation/schemas.d.ts +1127 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/validation/schemas.js +376 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validation/validators.d.ts +229 -0
- package/dist/validation/validators.d.ts.map +1 -0
- package/dist/validation/validators.js +307 -0
- package/dist/validation/validators.js.map +1 -0
- package/package.json +37 -3
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Worker Queue Utilities
|
|
3
|
+
// Backend-only Cloud Tasks / job queue integration
|
|
4
|
+
// ============================================
|
|
5
|
+
import { getConfig, isConfigInitialized } from './config.js';
|
|
6
|
+
import { logger } from './logger.js';
|
|
7
|
+
// Store Cloud Tasks client instance
|
|
8
|
+
let cloudTasksClient = null;
|
|
9
|
+
/**
|
|
10
|
+
* Set the Cloud Tasks client instance
|
|
11
|
+
*/
|
|
12
|
+
export function setCloudTasksClient(client) {
|
|
13
|
+
cloudTasksClient = client;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Post a request to the workers service via Cloud Tasks
|
|
17
|
+
* Falls back to HTTP POST in development mode
|
|
18
|
+
*
|
|
19
|
+
* @param endpoint - The worker endpoint (e.g., "process-matching")
|
|
20
|
+
* @param payload - The request payload
|
|
21
|
+
* @param options - Optional scheduling options
|
|
22
|
+
*/
|
|
23
|
+
export async function postWorkerRequest(endpoint, payload, options) {
|
|
24
|
+
const config = isConfigInitialized() ? getConfig() : null;
|
|
25
|
+
const workersUrl = config?.workersServiceUrl || process.env.WORKERS_SERVICE_URL;
|
|
26
|
+
// In development, make direct HTTP calls
|
|
27
|
+
if (config?.nodeEnv === 'development' || !cloudTasksClient) {
|
|
28
|
+
await postWorkerRequestDirect(endpoint, payload, workersUrl);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// In production, use Cloud Tasks
|
|
32
|
+
await postWorkerRequestCloudTasks(endpoint, payload, options);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Direct HTTP POST to workers service (development mode)
|
|
36
|
+
*/
|
|
37
|
+
async function postWorkerRequestDirect(endpoint, payload, workersUrl) {
|
|
38
|
+
const baseUrl = workersUrl || 'http://localhost:3002';
|
|
39
|
+
const url = `${baseUrl}/${endpoint}`;
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
},
|
|
46
|
+
body: JSON.stringify(payload),
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`Worker request failed: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
logger.debug('Worker request sent (direct)', { endpoint, type: payload.type });
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
logger.error('Failed to send worker request (direct)', {
|
|
55
|
+
endpoint,
|
|
56
|
+
type: payload.type,
|
|
57
|
+
error: error instanceof Error ? error.message : String(error),
|
|
58
|
+
});
|
|
59
|
+
// Don't throw in development - just log the error
|
|
60
|
+
if (process.env.NODE_ENV === 'production') {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Post to workers service via Google Cloud Tasks
|
|
67
|
+
*/
|
|
68
|
+
async function postWorkerRequestCloudTasks(endpoint, payload, options) {
|
|
69
|
+
const config = getConfig();
|
|
70
|
+
const workersUrl = config.workersServiceUrl;
|
|
71
|
+
if (!workersUrl) {
|
|
72
|
+
throw new Error('WORKERS_SERVICE_URL not configured');
|
|
73
|
+
}
|
|
74
|
+
if (!cloudTasksClient) {
|
|
75
|
+
throw new Error('Cloud Tasks client not initialized. Call setCloudTasksClient() first.');
|
|
76
|
+
}
|
|
77
|
+
const project = config.cloudTasksProject;
|
|
78
|
+
const location = config.cloudTasksLocation;
|
|
79
|
+
const queue = options?.queue || config.cloudTasksQueue || 'workers-queue';
|
|
80
|
+
if (!project || !location) {
|
|
81
|
+
throw new Error('Cloud Tasks project and location must be configured');
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const parent = `projects/${project}/locations/${location}/queues/${queue}`;
|
|
85
|
+
const url = `${workersUrl}/${endpoint}`;
|
|
86
|
+
const taskConfig = {
|
|
87
|
+
httpRequest: {
|
|
88
|
+
httpMethod: 'POST',
|
|
89
|
+
url,
|
|
90
|
+
headers: {
|
|
91
|
+
'Content-Type': 'application/json',
|
|
92
|
+
},
|
|
93
|
+
body: Buffer.from(JSON.stringify(payload)).toString('base64'),
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// Add scheduling if specified
|
|
97
|
+
if (options?.delaySeconds) {
|
|
98
|
+
taskConfig.scheduleTime = {
|
|
99
|
+
seconds: Math.floor(Date.now() / 1000) + options.delaySeconds,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
else if (options?.scheduleTime) {
|
|
103
|
+
taskConfig.scheduleTime = {
|
|
104
|
+
seconds: options.scheduleTime,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Use the Cloud Tasks client (type assertion since we don't have the types)
|
|
108
|
+
const client = cloudTasksClient;
|
|
109
|
+
await client.createTask({ parent, task: taskConfig });
|
|
110
|
+
logger.debug('Worker request queued (Cloud Tasks)', {
|
|
111
|
+
endpoint,
|
|
112
|
+
type: payload.type,
|
|
113
|
+
queue,
|
|
114
|
+
scheduled: !!options?.delaySeconds || !!options?.scheduleTime,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
logger.error('Failed to queue worker request', {
|
|
119
|
+
endpoint,
|
|
120
|
+
type: payload.type,
|
|
121
|
+
error: error instanceof Error ? error.message : String(error),
|
|
122
|
+
});
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Convenience function for scheduling a delayed worker request
|
|
128
|
+
*/
|
|
129
|
+
export async function scheduleWorkerRequest(endpoint, payload, delaySeconds) {
|
|
130
|
+
return postWorkerRequest(endpoint, payload, { delaySeconds });
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Convenience function for scheduling a worker request at a specific time
|
|
134
|
+
*/
|
|
135
|
+
export async function scheduleWorkerRequestAt(endpoint, payload, scheduledTime) {
|
|
136
|
+
return postWorkerRequest(endpoint, payload, {
|
|
137
|
+
scheduleTime: Math.floor(scheduledTime.getTime() / 1000),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=worker-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-queue.js","sourceRoot":"","sources":["../../src/backend/worker-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ClientApiError } from './api-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Credentials mode for fetch requests
|
|
4
|
+
*/
|
|
5
|
+
export type FetchCredentials = 'omit' | 'same-origin' | 'include';
|
|
6
|
+
/**
|
|
7
|
+
* Request configuration options
|
|
8
|
+
*/
|
|
9
|
+
export interface RequestConfig {
|
|
10
|
+
/** Request headers */
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
/** Request timeout in ms */
|
|
13
|
+
timeout?: number;
|
|
14
|
+
/** Number of retries */
|
|
15
|
+
retries?: number;
|
|
16
|
+
/** Retry delay in ms */
|
|
17
|
+
retryDelay?: number;
|
|
18
|
+
/** Signal for request cancellation */
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
/** Whether to include credentials */
|
|
21
|
+
credentials?: FetchCredentials;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* API client configuration
|
|
25
|
+
*/
|
|
26
|
+
export interface ApiClientConfig {
|
|
27
|
+
/** Base URL for API requests */
|
|
28
|
+
baseUrl: string;
|
|
29
|
+
/** Default request timeout */
|
|
30
|
+
timeout?: number;
|
|
31
|
+
/** Get current auth token */
|
|
32
|
+
getToken?: () => string | null | Promise<string | null>;
|
|
33
|
+
/** Called when token refresh is needed */
|
|
34
|
+
onTokenRefresh?: () => Promise<string | null>;
|
|
35
|
+
/** Called when auth fails (401/403) */
|
|
36
|
+
onAuthError?: (error: ClientApiError) => void;
|
|
37
|
+
/** Default headers for all requests */
|
|
38
|
+
defaultHeaders?: Record<string, string>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a typed API client for frontend applications.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const api = createApiClient({
|
|
46
|
+
* baseUrl: 'https://api.qalbmatch.com',
|
|
47
|
+
* getToken: () => authStore.getToken(),
|
|
48
|
+
* onAuthError: () => authStore.logout(),
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* // GET request
|
|
52
|
+
* const profile = await api.get<Profile>('/profiles/me');
|
|
53
|
+
*
|
|
54
|
+
* // POST request with body
|
|
55
|
+
* const interest = await api.post<Interest>('/interests', {
|
|
56
|
+
* targetProfileId: 'prf_123',
|
|
57
|
+
* message: 'Assalamu Alaikum...',
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* // PUT request
|
|
61
|
+
* await api.put('/profiles/me', { about: 'Updated bio' });
|
|
62
|
+
*
|
|
63
|
+
* // DELETE request
|
|
64
|
+
* await api.delete('/profiles/me/photos/abc123');
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function createApiClient(config: ApiClientConfig): {
|
|
68
|
+
/**
|
|
69
|
+
* GET request
|
|
70
|
+
*/
|
|
71
|
+
get<T>(path: string, config?: RequestConfig): Promise<T>;
|
|
72
|
+
/**
|
|
73
|
+
* POST request
|
|
74
|
+
*/
|
|
75
|
+
post<T>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
|
|
76
|
+
/**
|
|
77
|
+
* PUT request
|
|
78
|
+
*/
|
|
79
|
+
put<T>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
|
|
80
|
+
/**
|
|
81
|
+
* PATCH request
|
|
82
|
+
*/
|
|
83
|
+
patch<T>(path: string, body?: unknown, config?: RequestConfig): Promise<T>;
|
|
84
|
+
/**
|
|
85
|
+
* DELETE request
|
|
86
|
+
*/
|
|
87
|
+
delete<T>(path: string, config?: RequestConfig): Promise<T>;
|
|
88
|
+
/**
|
|
89
|
+
* Upload file with multipart/form-data
|
|
90
|
+
*/
|
|
91
|
+
upload<T>(path: string, file: File | Blob, fieldName?: string, additionalData?: Record<string, string>, config?: RequestConfig): Promise<T>;
|
|
92
|
+
/**
|
|
93
|
+
* Get the configured base URL
|
|
94
|
+
*/
|
|
95
|
+
getBaseUrl(): string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Type for the API client
|
|
99
|
+
*/
|
|
100
|
+
export type ApiClient = ReturnType<typeof createApiClient>;
|
|
101
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGlE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;IAqLnD;;OAEG;QACC,CAAC,QAAQ,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxD;;OAEG;SACE,CAAC,QAAQ,MAAM,SAAS,OAAO,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzE;;OAEG;QACC,CAAC,QAAQ,MAAM,SAAS,OAAO,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxE;;OAEG;UACG,CAAC,QAAQ,MAAM,SAAS,OAAO,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E;;OAEG;WACI,CAAC,QAAQ,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3D;;OAEG;WACU,CAAC,QACN,MAAM,QACN,IAAI,GAAG,IAAI,cACN,MAAM,mBACA,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAC9B,aAAa,GACrB,OAAO,CAAC,CAAC,CAAC;IAyBb;;OAEG;kBACW,MAAM;EAIvB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// API Client - Typed fetch wrapper for frontend apps
|
|
3
|
+
// ============================================
|
|
4
|
+
import { ClientApiError } from './api-error.js';
|
|
5
|
+
import { API_CONFIG, buildApiUrl } from './endpoints.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a typed API client for frontend applications.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const api = createApiClient({
|
|
12
|
+
* baseUrl: 'https://api.qalbmatch.com',
|
|
13
|
+
* getToken: () => authStore.getToken(),
|
|
14
|
+
* onAuthError: () => authStore.logout(),
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // GET request
|
|
18
|
+
* const profile = await api.get<Profile>('/profiles/me');
|
|
19
|
+
*
|
|
20
|
+
* // POST request with body
|
|
21
|
+
* const interest = await api.post<Interest>('/interests', {
|
|
22
|
+
* targetProfileId: 'prf_123',
|
|
23
|
+
* message: 'Assalamu Alaikum...',
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* // PUT request
|
|
27
|
+
* await api.put('/profiles/me', { about: 'Updated bio' });
|
|
28
|
+
*
|
|
29
|
+
* // DELETE request
|
|
30
|
+
* await api.delete('/profiles/me/photos/abc123');
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function createApiClient(config) {
|
|
34
|
+
const { baseUrl, timeout = API_CONFIG.DEFAULT_TIMEOUT, getToken, onTokenRefresh, onAuthError, defaultHeaders = {}, } = config;
|
|
35
|
+
/**
|
|
36
|
+
* Build headers for request
|
|
37
|
+
*/
|
|
38
|
+
async function buildHeaders(customHeaders) {
|
|
39
|
+
const headers = new Headers({
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
Accept: 'application/json',
|
|
42
|
+
...defaultHeaders,
|
|
43
|
+
...customHeaders,
|
|
44
|
+
});
|
|
45
|
+
if (getToken) {
|
|
46
|
+
const token = await getToken();
|
|
47
|
+
if (token) {
|
|
48
|
+
headers.set('Authorization', `Bearer ${token}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return headers;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Handle response and parse JSON
|
|
55
|
+
*/
|
|
56
|
+
async function handleResponse(response) {
|
|
57
|
+
// No content response
|
|
58
|
+
if (response.status === 204) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const contentType = response.headers.get('content-type');
|
|
62
|
+
const isJson = contentType?.includes('application/json');
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
if (isJson) {
|
|
65
|
+
const errorBody = (await response.json());
|
|
66
|
+
throw ClientApiError.fromResponse(response.status, errorBody);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new ClientApiError(response.status, response.statusText || 'Request failed', response.status === 401
|
|
70
|
+
? 'UNAUTHORIZED'
|
|
71
|
+
: response.status === 403
|
|
72
|
+
? 'FORBIDDEN'
|
|
73
|
+
: response.status === 404
|
|
74
|
+
? 'NOT_FOUND'
|
|
75
|
+
: response.status === 429
|
|
76
|
+
? 'RATE_LIMIT_EXCEEDED'
|
|
77
|
+
: response.status >= 500
|
|
78
|
+
? 'INTERNAL_ERROR'
|
|
79
|
+
: 'UNKNOWN_ERROR');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (isJson) {
|
|
83
|
+
const data = await response.json();
|
|
84
|
+
// Handle wrapped response { success: true, data: ... }
|
|
85
|
+
if (data && typeof data === 'object' && 'success' in data && 'data' in data) {
|
|
86
|
+
return data.data;
|
|
87
|
+
}
|
|
88
|
+
return data;
|
|
89
|
+
}
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Execute request with retry logic
|
|
94
|
+
*/
|
|
95
|
+
async function executeRequest(url, options, requestConfig) {
|
|
96
|
+
const { retries = 0, retryDelay = API_CONFIG.RETRY_DELAY } = requestConfig;
|
|
97
|
+
let lastError;
|
|
98
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
99
|
+
try {
|
|
100
|
+
// Create timeout abort controller
|
|
101
|
+
const timeoutController = new AbortController();
|
|
102
|
+
const timeoutId = setTimeout(() => {
|
|
103
|
+
timeoutController.abort();
|
|
104
|
+
}, requestConfig.timeout || timeout);
|
|
105
|
+
// Merge signals if external signal provided
|
|
106
|
+
const signal = requestConfig.signal
|
|
107
|
+
? anySignal([requestConfig.signal, timeoutController.signal])
|
|
108
|
+
: timeoutController.signal;
|
|
109
|
+
const response = await fetch(url, {
|
|
110
|
+
...options,
|
|
111
|
+
signal,
|
|
112
|
+
credentials: requestConfig.credentials || 'include',
|
|
113
|
+
});
|
|
114
|
+
clearTimeout(timeoutId);
|
|
115
|
+
// Handle 401 with token refresh
|
|
116
|
+
if (response.status === 401 && onTokenRefresh && attempt === 0) {
|
|
117
|
+
const newToken = await onTokenRefresh();
|
|
118
|
+
if (newToken) {
|
|
119
|
+
// Retry with new token
|
|
120
|
+
const headers = options.headers;
|
|
121
|
+
headers.set('Authorization', `Bearer ${newToken}`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const result = await handleResponse(response);
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (error instanceof ClientApiError) {
|
|
130
|
+
lastError = error;
|
|
131
|
+
// Handle auth errors
|
|
132
|
+
if (error.isAuthError() && onAuthError) {
|
|
133
|
+
onAuthError(error);
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
// Only retry on retryable errors
|
|
137
|
+
if (!error.isRetryable() || attempt >= retries) {
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (error instanceof Error) {
|
|
142
|
+
if (error.name === 'AbortError') {
|
|
143
|
+
lastError = ClientApiError.timeout();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
lastError = ClientApiError.networkError(error.message);
|
|
147
|
+
}
|
|
148
|
+
if (attempt >= retries) {
|
|
149
|
+
throw lastError;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Wait before retry
|
|
153
|
+
if (attempt < retries) {
|
|
154
|
+
await sleep(retryDelay * Math.pow(2, attempt)); // Exponential backoff
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
throw lastError || ClientApiError.networkError();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Make request helper
|
|
162
|
+
*/
|
|
163
|
+
async function request(method, path, body, requestConfig = {}) {
|
|
164
|
+
const url = buildApiUrl(baseUrl, path);
|
|
165
|
+
const headers = await buildHeaders(requestConfig.headers);
|
|
166
|
+
const options = {
|
|
167
|
+
method,
|
|
168
|
+
headers,
|
|
169
|
+
};
|
|
170
|
+
if (body !== undefined) {
|
|
171
|
+
options.body = JSON.stringify(body);
|
|
172
|
+
}
|
|
173
|
+
return executeRequest(url, options, requestConfig);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
/**
|
|
177
|
+
* GET request
|
|
178
|
+
*/
|
|
179
|
+
get(path, config) {
|
|
180
|
+
return request('GET', path, undefined, config);
|
|
181
|
+
},
|
|
182
|
+
/**
|
|
183
|
+
* POST request
|
|
184
|
+
*/
|
|
185
|
+
post(path, body, config) {
|
|
186
|
+
return request('POST', path, body, config);
|
|
187
|
+
},
|
|
188
|
+
/**
|
|
189
|
+
* PUT request
|
|
190
|
+
*/
|
|
191
|
+
put(path, body, config) {
|
|
192
|
+
return request('PUT', path, body, config);
|
|
193
|
+
},
|
|
194
|
+
/**
|
|
195
|
+
* PATCH request
|
|
196
|
+
*/
|
|
197
|
+
patch(path, body, config) {
|
|
198
|
+
return request('PATCH', path, body, config);
|
|
199
|
+
},
|
|
200
|
+
/**
|
|
201
|
+
* DELETE request
|
|
202
|
+
*/
|
|
203
|
+
delete(path, config) {
|
|
204
|
+
return request('DELETE', path, undefined, config);
|
|
205
|
+
},
|
|
206
|
+
/**
|
|
207
|
+
* Upload file with multipart/form-data
|
|
208
|
+
*/
|
|
209
|
+
async upload(path, file, fieldName = 'file', additionalData, config) {
|
|
210
|
+
const url = buildApiUrl(baseUrl, path);
|
|
211
|
+
const headers = await buildHeaders(config?.headers);
|
|
212
|
+
// Remove Content-Type to let browser set it with boundary
|
|
213
|
+
headers.delete('Content-Type');
|
|
214
|
+
const formData = new FormData();
|
|
215
|
+
formData.append(fieldName, file);
|
|
216
|
+
if (additionalData) {
|
|
217
|
+
Object.entries(additionalData).forEach(([key, value]) => {
|
|
218
|
+
formData.append(key, value);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
const options = {
|
|
222
|
+
method: 'POST',
|
|
223
|
+
headers,
|
|
224
|
+
body: formData,
|
|
225
|
+
};
|
|
226
|
+
return executeRequest(url, options, config || {});
|
|
227
|
+
},
|
|
228
|
+
/**
|
|
229
|
+
* Get the configured base URL
|
|
230
|
+
*/
|
|
231
|
+
getBaseUrl() {
|
|
232
|
+
return baseUrl;
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
// ============================================
|
|
237
|
+
// Utility Functions
|
|
238
|
+
// ============================================
|
|
239
|
+
/**
|
|
240
|
+
* Sleep for specified milliseconds
|
|
241
|
+
*/
|
|
242
|
+
function sleep(ms) {
|
|
243
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Combine multiple abort signals into one
|
|
247
|
+
*/
|
|
248
|
+
function anySignal(signals) {
|
|
249
|
+
const controller = new AbortController();
|
|
250
|
+
for (const signal of signals) {
|
|
251
|
+
if (signal.aborted) {
|
|
252
|
+
controller.abort(signal.reason);
|
|
253
|
+
return controller.signal;
|
|
254
|
+
}
|
|
255
|
+
signal.addEventListener('abort', () => controller.abort(signal.reason), {
|
|
256
|
+
signal: controller.signal,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return controller.signal;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error codes returned from the API
|
|
3
|
+
*/
|
|
4
|
+
export type ClientApiErrorCode = 'BAD_REQUEST' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'NOT_FOUND' | 'CONFLICT' | 'VALIDATION_ERROR' | 'RATE_LIMIT_EXCEEDED' | 'INTERNAL_ERROR' | 'SERVICE_UNAVAILABLE' | 'TIMEOUT' | 'PAYMENT_REQUIRED' | 'UNPROCESSABLE_ENTITY' | 'NETWORK_ERROR' | 'UNKNOWN_ERROR';
|
|
5
|
+
/**
|
|
6
|
+
* Validation error detail from API
|
|
7
|
+
*/
|
|
8
|
+
export interface ClientValidationError {
|
|
9
|
+
field: string;
|
|
10
|
+
message: string;
|
|
11
|
+
code?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Error response structure from API
|
|
15
|
+
*/
|
|
16
|
+
export interface ApiErrorResponse {
|
|
17
|
+
success: false;
|
|
18
|
+
error: {
|
|
19
|
+
code: ClientApiErrorCode;
|
|
20
|
+
message: string;
|
|
21
|
+
details?: ClientValidationError[];
|
|
22
|
+
timestamp: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Client-side API error class.
|
|
27
|
+
* Used in mobile apps and admin panels to handle API errors.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* try {
|
|
32
|
+
* const user = await apiClient.get('/users/me');
|
|
33
|
+
* } catch (error) {
|
|
34
|
+
* if (error instanceof ClientApiError) {
|
|
35
|
+
* if (error.code === 'UNAUTHORIZED') {
|
|
36
|
+
* // Redirect to login
|
|
37
|
+
* } else if (error.code === 'VALIDATION_ERROR') {
|
|
38
|
+
* // Show field errors
|
|
39
|
+
* error.details?.forEach(d => setFieldError(d.field, d.message));
|
|
40
|
+
* }
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare class ClientApiError extends Error {
|
|
46
|
+
/**
|
|
47
|
+
* HTTP status code (e.g., 400, 401, 404, 500)
|
|
48
|
+
*/
|
|
49
|
+
readonly statusCode: number;
|
|
50
|
+
/**
|
|
51
|
+
* Machine-readable error code
|
|
52
|
+
*/
|
|
53
|
+
readonly code: ClientApiErrorCode;
|
|
54
|
+
/**
|
|
55
|
+
* Validation error details
|
|
56
|
+
*/
|
|
57
|
+
readonly details?: ClientValidationError[];
|
|
58
|
+
/**
|
|
59
|
+
* Original response body
|
|
60
|
+
*/
|
|
61
|
+
readonly response?: ApiErrorResponse;
|
|
62
|
+
/**
|
|
63
|
+
* Whether this is a network error (no response from server)
|
|
64
|
+
*/
|
|
65
|
+
readonly isNetworkError: boolean;
|
|
66
|
+
constructor(statusCode: number, message: string, code?: ClientApiErrorCode, details?: ClientValidationError[], response?: ApiErrorResponse, isNetworkError?: boolean);
|
|
67
|
+
/**
|
|
68
|
+
* Create from API error response
|
|
69
|
+
*/
|
|
70
|
+
static fromResponse(statusCode: number, response: ApiErrorResponse): ClientApiError;
|
|
71
|
+
/**
|
|
72
|
+
* Create from network error (no response)
|
|
73
|
+
*/
|
|
74
|
+
static networkError(message?: string): ClientApiError;
|
|
75
|
+
/**
|
|
76
|
+
* Create from timeout
|
|
77
|
+
*/
|
|
78
|
+
static timeout(message?: string): ClientApiError;
|
|
79
|
+
/**
|
|
80
|
+
* Check if error is a specific code
|
|
81
|
+
*/
|
|
82
|
+
is(code: ClientApiErrorCode): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Check if error is authentication related
|
|
85
|
+
*/
|
|
86
|
+
isAuthError(): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Check if error is recoverable (can retry)
|
|
89
|
+
*/
|
|
90
|
+
isRetryable(): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Get error message for a specific field
|
|
93
|
+
*/
|
|
94
|
+
getFieldError(field: string): string | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Get all field errors as a map
|
|
97
|
+
*/
|
|
98
|
+
getFieldErrors(): Record<string, string>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=api-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../src/client/api-error.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,aAAa,GACb,cAAc,GACd,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,qBAAqB,GACrB,gBAAgB,GAChB,qBAAqB,GACrB,SAAS,GACT,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,eAAe,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,kBAAkB,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC;;OAEG;IACH,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC;;OAEG;IACH,SAAgB,IAAI,EAAE,kBAAkB,CAAC;IAEzC;;OAEG;IACH,SAAgB,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAElD;;OAEG;IACH,SAAgB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5C;;OAEG;IACH,SAAgB,cAAc,EAAE,OAAO,CAAC;gBAGtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,kBAAoC,EAC1C,OAAO,CAAC,EAAE,qBAAqB,EAAE,EACjC,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,cAAc,GAAE,OAAe;IAYjC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,cAAc;IAUnF;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,GAAE,MAAwB,GAAG,cAAc;IAItE;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,MAA4B,GAAG,cAAc;IAIrE;;OAEG;IACH,EAAE,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO;IAIrC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,WAAW,IAAI,OAAO;IAStB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAOzC"}
|