s3db.js 11.3.2 → 12.0.0
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 +102 -8
- package/dist/s3db.cjs.js +36664 -15480
- package/dist/s3db.cjs.js.map +1 -1
- package/dist/s3db.d.ts +57 -0
- package/dist/s3db.es.js +36661 -15531
- package/dist/s3db.es.js.map +1 -1
- package/mcp/entrypoint.js +58 -0
- package/mcp/tools/documentation.js +434 -0
- package/mcp/tools/index.js +4 -0
- package/package.json +27 -6
- package/src/behaviors/user-managed.js +13 -6
- package/src/client.class.js +41 -46
- package/src/concerns/base62.js +85 -0
- package/src/concerns/dictionary-encoding.js +294 -0
- package/src/concerns/geo-encoding.js +256 -0
- package/src/concerns/high-performance-inserter.js +34 -30
- package/src/concerns/ip.js +325 -0
- package/src/concerns/metadata-encoding.js +345 -66
- package/src/concerns/money.js +193 -0
- package/src/concerns/partition-queue.js +7 -4
- package/src/concerns/plugin-storage.js +39 -19
- package/src/database.class.js +76 -74
- package/src/errors.js +0 -4
- package/src/plugins/api/auth/api-key-auth.js +88 -0
- package/src/plugins/api/auth/basic-auth.js +154 -0
- package/src/plugins/api/auth/index.js +112 -0
- package/src/plugins/api/auth/jwt-auth.js +169 -0
- package/src/plugins/api/index.js +539 -0
- package/src/plugins/api/middlewares/index.js +15 -0
- package/src/plugins/api/middlewares/validator.js +185 -0
- package/src/plugins/api/routes/auth-routes.js +241 -0
- package/src/plugins/api/routes/resource-routes.js +304 -0
- package/src/plugins/api/server.js +350 -0
- package/src/plugins/api/utils/error-handler.js +147 -0
- package/src/plugins/api/utils/openapi-generator.js +1240 -0
- package/src/plugins/api/utils/response-formatter.js +218 -0
- package/src/plugins/backup/streaming-exporter.js +132 -0
- package/src/plugins/backup.plugin.js +103 -50
- package/src/plugins/cache/s3-cache.class.js +95 -47
- package/src/plugins/cache.plugin.js +107 -9
- package/src/plugins/concerns/plugin-dependencies.js +313 -0
- package/src/plugins/concerns/prometheus-formatter.js +255 -0
- package/src/plugins/consumers/rabbitmq-consumer.js +4 -0
- package/src/plugins/consumers/sqs-consumer.js +4 -0
- package/src/plugins/costs.plugin.js +255 -39
- package/src/plugins/eventual-consistency/helpers.js +15 -1
- package/src/plugins/geo.plugin.js +873 -0
- package/src/plugins/importer/index.js +1020 -0
- package/src/plugins/index.js +11 -0
- package/src/plugins/metrics.plugin.js +163 -4
- package/src/plugins/queue-consumer.plugin.js +6 -27
- package/src/plugins/relation.errors.js +139 -0
- package/src/plugins/relation.plugin.js +1242 -0
- package/src/plugins/replicators/bigquery-replicator.class.js +180 -8
- package/src/plugins/replicators/dynamodb-replicator.class.js +383 -0
- package/src/plugins/replicators/index.js +28 -3
- package/src/plugins/replicators/mongodb-replicator.class.js +391 -0
- package/src/plugins/replicators/mysql-replicator.class.js +558 -0
- package/src/plugins/replicators/planetscale-replicator.class.js +409 -0
- package/src/plugins/replicators/postgres-replicator.class.js +182 -7
- package/src/plugins/replicators/s3db-replicator.class.js +1 -12
- package/src/plugins/replicators/schema-sync.helper.js +601 -0
- package/src/plugins/replicators/sqs-replicator.class.js +11 -9
- package/src/plugins/replicators/turso-replicator.class.js +416 -0
- package/src/plugins/replicators/webhook-replicator.class.js +612 -0
- package/src/plugins/state-machine.plugin.js +122 -68
- package/src/plugins/tfstate/README.md +745 -0
- package/src/plugins/tfstate/base-driver.js +80 -0
- package/src/plugins/tfstate/errors.js +112 -0
- package/src/plugins/tfstate/filesystem-driver.js +129 -0
- package/src/plugins/tfstate/index.js +2660 -0
- package/src/plugins/tfstate/s3-driver.js +192 -0
- package/src/plugins/ttl.plugin.js +536 -0
- package/src/resource.class.js +14 -10
- package/src/s3db.d.ts +57 -0
- package/src/schema.class.js +366 -32
- package/SECURITY.md +0 -76
- package/src/partition-drivers/base-partition-driver.js +0 -106
- package/src/partition-drivers/index.js +0 -66
- package/src/partition-drivers/memory-partition-driver.js +0 -289
- package/src/partition-drivers/sqs-partition-driver.js +0 -337
- package/src/partition-drivers/sync-partition-driver.js +0 -38
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handler - Global error handling middleware
|
|
3
|
+
*
|
|
4
|
+
* Catches and formats errors from routes and middlewares
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { error as formatError } from './response-formatter.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Map s3db.js errors to HTTP status codes
|
|
11
|
+
*/
|
|
12
|
+
const errorStatusMap = {
|
|
13
|
+
'ValidationError': 400,
|
|
14
|
+
'InvalidResourceItem': 400,
|
|
15
|
+
'ResourceNotFound': 404,
|
|
16
|
+
'NoSuchKey': 404,
|
|
17
|
+
'NoSuchBucket': 404,
|
|
18
|
+
'PartitionError': 400,
|
|
19
|
+
'CryptoError': 500,
|
|
20
|
+
'SchemaError': 400,
|
|
21
|
+
'QueueError': 500,
|
|
22
|
+
'ResourceError': 500
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get HTTP status code from error
|
|
27
|
+
* @param {Error} err - Error object
|
|
28
|
+
* @returns {number} HTTP status code
|
|
29
|
+
*/
|
|
30
|
+
function getStatusFromError(err) {
|
|
31
|
+
// Check error name
|
|
32
|
+
if (err.name && errorStatusMap[err.name]) {
|
|
33
|
+
return errorStatusMap[err.name];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Check error constructor name
|
|
37
|
+
if (err.constructor && err.constructor.name && errorStatusMap[err.constructor.name]) {
|
|
38
|
+
return errorStatusMap[err.constructor.name];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Check for specific error patterns
|
|
42
|
+
if (err.message) {
|
|
43
|
+
if (err.message.includes('not found') || err.message.includes('does not exist')) {
|
|
44
|
+
return 404;
|
|
45
|
+
}
|
|
46
|
+
if (err.message.includes('validation') || err.message.includes('invalid')) {
|
|
47
|
+
return 400;
|
|
48
|
+
}
|
|
49
|
+
if (err.message.includes('unauthorized') || err.message.includes('authentication')) {
|
|
50
|
+
return 401;
|
|
51
|
+
}
|
|
52
|
+
if (err.message.includes('forbidden') || err.message.includes('permission')) {
|
|
53
|
+
return 403;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Default to 500
|
|
58
|
+
return 500;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Global error handler middleware
|
|
63
|
+
* @param {Error} err - Error object
|
|
64
|
+
* @param {Object} c - Hono context
|
|
65
|
+
* @returns {Response} Error response
|
|
66
|
+
*/
|
|
67
|
+
export function errorHandler(err, c) {
|
|
68
|
+
const status = getStatusFromError(err);
|
|
69
|
+
|
|
70
|
+
// Get error code from error name or default
|
|
71
|
+
const code = err.name || 'INTERNAL_ERROR';
|
|
72
|
+
|
|
73
|
+
// Extract error details
|
|
74
|
+
const details = {};
|
|
75
|
+
|
|
76
|
+
if (err.resource) details.resource = err.resource;
|
|
77
|
+
if (err.bucket) details.bucket = err.bucket;
|
|
78
|
+
if (err.key) details.key = err.key;
|
|
79
|
+
if (err.operation) details.operation = err.operation;
|
|
80
|
+
if (err.suggestion) details.suggestion = err.suggestion;
|
|
81
|
+
if (err.availableResources) details.availableResources = err.availableResources;
|
|
82
|
+
|
|
83
|
+
// Format error response
|
|
84
|
+
const response = formatError(err, {
|
|
85
|
+
status,
|
|
86
|
+
code,
|
|
87
|
+
details
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Log error (except for expected errors like 404)
|
|
91
|
+
if (status >= 500) {
|
|
92
|
+
console.error('[API Plugin] Error:', {
|
|
93
|
+
message: err.message,
|
|
94
|
+
code,
|
|
95
|
+
status,
|
|
96
|
+
stack: err.stack,
|
|
97
|
+
details
|
|
98
|
+
});
|
|
99
|
+
} else if (status >= 400 && status < 500 && c.get('verbose')) {
|
|
100
|
+
console.warn('[API Plugin] Client error:', {
|
|
101
|
+
message: err.message,
|
|
102
|
+
code,
|
|
103
|
+
status,
|
|
104
|
+
details
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return c.json(response, response._status);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Async error wrapper for route handlers
|
|
113
|
+
* @param {Function} fn - Async route handler
|
|
114
|
+
* @returns {Function} Wrapped handler with error catching
|
|
115
|
+
*/
|
|
116
|
+
export function asyncHandler(fn) {
|
|
117
|
+
return async (c) => {
|
|
118
|
+
try {
|
|
119
|
+
return await fn(c);
|
|
120
|
+
} catch (err) {
|
|
121
|
+
return errorHandler(err, c);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Try-catch wrapper with formatted error response
|
|
128
|
+
* @param {Function} fn - Function to execute
|
|
129
|
+
* @param {Object} c - Hono context
|
|
130
|
+
* @returns {Promise<[boolean, Error|null, any]>} [ok, error, result] tuple
|
|
131
|
+
*/
|
|
132
|
+
export async function tryApiCall(fn, c) {
|
|
133
|
+
try {
|
|
134
|
+
const result = await fn();
|
|
135
|
+
return [true, null, result];
|
|
136
|
+
} catch (err) {
|
|
137
|
+
const response = errorHandler(err, c);
|
|
138
|
+
return [false, err, response];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export default {
|
|
143
|
+
errorHandler,
|
|
144
|
+
asyncHandler,
|
|
145
|
+
tryApiCall,
|
|
146
|
+
getStatusFromError
|
|
147
|
+
};
|