s3db.js 11.3.2 → 12.0.1

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 (83) hide show
  1. package/README.md +102 -8
  2. package/dist/s3db.cjs.js +36945 -15510
  3. package/dist/s3db.cjs.js.map +1 -1
  4. package/dist/s3db.d.ts +66 -1
  5. package/dist/s3db.es.js +36914 -15534
  6. package/dist/s3db.es.js.map +1 -1
  7. package/mcp/entrypoint.js +58 -0
  8. package/mcp/tools/documentation.js +434 -0
  9. package/mcp/tools/index.js +4 -0
  10. package/package.json +35 -15
  11. package/src/behaviors/user-managed.js +13 -6
  12. package/src/client.class.js +79 -49
  13. package/src/concerns/base62.js +85 -0
  14. package/src/concerns/dictionary-encoding.js +294 -0
  15. package/src/concerns/geo-encoding.js +256 -0
  16. package/src/concerns/high-performance-inserter.js +34 -30
  17. package/src/concerns/ip.js +325 -0
  18. package/src/concerns/metadata-encoding.js +345 -66
  19. package/src/concerns/money.js +193 -0
  20. package/src/concerns/partition-queue.js +7 -4
  21. package/src/concerns/plugin-storage.js +97 -47
  22. package/src/database.class.js +76 -74
  23. package/src/errors.js +0 -4
  24. package/src/plugins/api/auth/api-key-auth.js +88 -0
  25. package/src/plugins/api/auth/basic-auth.js +154 -0
  26. package/src/plugins/api/auth/index.js +112 -0
  27. package/src/plugins/api/auth/jwt-auth.js +169 -0
  28. package/src/plugins/api/index.js +544 -0
  29. package/src/plugins/api/middlewares/index.js +15 -0
  30. package/src/plugins/api/middlewares/validator.js +185 -0
  31. package/src/plugins/api/routes/auth-routes.js +241 -0
  32. package/src/plugins/api/routes/resource-routes.js +304 -0
  33. package/src/plugins/api/server.js +354 -0
  34. package/src/plugins/api/utils/error-handler.js +147 -0
  35. package/src/plugins/api/utils/openapi-generator.js +1240 -0
  36. package/src/plugins/api/utils/response-formatter.js +218 -0
  37. package/src/plugins/backup/streaming-exporter.js +132 -0
  38. package/src/plugins/backup.plugin.js +103 -50
  39. package/src/plugins/cache/s3-cache.class.js +95 -47
  40. package/src/plugins/cache.plugin.js +107 -9
  41. package/src/plugins/concerns/plugin-dependencies.js +313 -0
  42. package/src/plugins/concerns/prometheus-formatter.js +255 -0
  43. package/src/plugins/consumers/rabbitmq-consumer.js +4 -0
  44. package/src/plugins/consumers/sqs-consumer.js +4 -0
  45. package/src/plugins/costs.plugin.js +255 -39
  46. package/src/plugins/eventual-consistency/helpers.js +15 -1
  47. package/src/plugins/geo.plugin.js +873 -0
  48. package/src/plugins/importer/index.js +1020 -0
  49. package/src/plugins/index.js +11 -0
  50. package/src/plugins/metrics.plugin.js +163 -4
  51. package/src/plugins/queue-consumer.plugin.js +6 -27
  52. package/src/plugins/relation.errors.js +139 -0
  53. package/src/plugins/relation.plugin.js +1242 -0
  54. package/src/plugins/replicator.plugin.js +2 -1
  55. package/src/plugins/replicators/bigquery-replicator.class.js +180 -8
  56. package/src/plugins/replicators/dynamodb-replicator.class.js +383 -0
  57. package/src/plugins/replicators/index.js +28 -3
  58. package/src/plugins/replicators/mongodb-replicator.class.js +391 -0
  59. package/src/plugins/replicators/mysql-replicator.class.js +558 -0
  60. package/src/plugins/replicators/planetscale-replicator.class.js +409 -0
  61. package/src/plugins/replicators/postgres-replicator.class.js +182 -7
  62. package/src/plugins/replicators/s3db-replicator.class.js +1 -12
  63. package/src/plugins/replicators/schema-sync.helper.js +601 -0
  64. package/src/plugins/replicators/sqs-replicator.class.js +11 -9
  65. package/src/plugins/replicators/turso-replicator.class.js +416 -0
  66. package/src/plugins/replicators/webhook-replicator.class.js +612 -0
  67. package/src/plugins/state-machine.plugin.js +122 -68
  68. package/src/plugins/tfstate/README.md +745 -0
  69. package/src/plugins/tfstate/base-driver.js +80 -0
  70. package/src/plugins/tfstate/errors.js +112 -0
  71. package/src/plugins/tfstate/filesystem-driver.js +129 -0
  72. package/src/plugins/tfstate/index.js +2660 -0
  73. package/src/plugins/tfstate/s3-driver.js +192 -0
  74. package/src/plugins/ttl.plugin.js +536 -0
  75. package/src/resource.class.js +315 -36
  76. package/src/s3db.d.ts +66 -1
  77. package/src/schema.class.js +366 -32
  78. package/SECURITY.md +0 -76
  79. package/src/partition-drivers/base-partition-driver.js +0 -106
  80. package/src/partition-drivers/index.js +0 -66
  81. package/src/partition-drivers/memory-partition-driver.js +0 -289
  82. package/src/partition-drivers/sqs-partition-driver.js +0 -337
  83. 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
+ };