ts-prorm-orm 1.1.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.
Files changed (310) hide show
  1. package/CHANGELOG.md +1111 -0
  2. package/LICENSE +21 -0
  3. package/README.md +573 -0
  4. package/dist/audit/history-query.js +180 -0
  5. package/dist/audit/index.js +23 -0
  6. package/dist/audit/logger.js +236 -0
  7. package/dist/cache/cache-manager.js +84 -0
  8. package/dist/cache/index.js +16 -0
  9. package/dist/cache/redis-cluster-cache.js +557 -0
  10. package/dist/cli.js +2200 -0
  11. package/dist/compliance/audit-trail.js +68 -0
  12. package/dist/compliance/backup-verification.js +685 -0
  13. package/dist/compliance/breach-detector.js +505 -0
  14. package/dist/compliance/consent-record.js +227 -0
  15. package/dist/compliance/consent-versioning.js +331 -0
  16. package/dist/compliance/cross-border-log.js +530 -0
  17. package/dist/compliance/data-classifier.js +258 -0
  18. package/dist/compliance/data-lineage.js +565 -0
  19. package/dist/compliance/data-masker.js +303 -0
  20. package/dist/compliance/data-portability.js +265 -0
  21. package/dist/compliance/data-retention.js +195 -0
  22. package/dist/compliance/dsar-workflow.js +342 -0
  23. package/dist/compliance/field-encryption.js +223 -0
  24. package/dist/compliance/immutable-record.js +148 -0
  25. package/dist/compliance/index.js +260 -0
  26. package/dist/compliance/privacy-impact-assessment.js +364 -0
  27. package/dist/compliance/pseudonymization.js +269 -0
  28. package/dist/compliance/query-firewall.js +1182 -0
  29. package/dist/compliance/rate-limiter.js +580 -0
  30. package/dist/compliance/right-to-erasure.js +117 -0
  31. package/dist/compliance/row-level-security.js +246 -0
  32. package/dist/compliance/security-decorator.js +574 -0
  33. package/dist/compliance/security-monitor.js +525 -0
  34. package/dist/compliance/sensitive-data-discovery.js +476 -0
  35. package/dist/compliance/session-isolation.js +472 -0
  36. package/dist/compliance/tls-enforcer.js +108 -0
  37. package/dist/compliance/worm-storage.js +712 -0
  38. package/dist/connection-manager.js +198 -0
  39. package/dist/connection-pool.js +519 -0
  40. package/dist/decorators/audit.js +136 -0
  41. package/dist/decorators/belongs-to-many.js +115 -0
  42. package/dist/decorators/belongs-to.js +115 -0
  43. package/dist/decorators/check.js +435 -0
  44. package/dist/decorators/collate.js +329 -0
  45. package/dist/decorators/comment.js +205 -0
  46. package/dist/decorators/database-settings.js +236 -0
  47. package/dist/decorators/default.js +244 -0
  48. package/dist/decorators/encryption.js +235 -0
  49. package/dist/decorators/engine.js +97 -0
  50. package/dist/decorators/fk-constraints.js +594 -0
  51. package/dist/decorators/foreign-table.js +136 -0
  52. package/dist/decorators/generated.js +274 -0
  53. package/dist/decorators/has-many.js +127 -0
  54. package/dist/decorators/has-one.js +116 -0
  55. package/dist/decorators/hstore.js +129 -0
  56. package/dist/decorators/index.js +355 -0
  57. package/dist/decorators/json-column.js +83 -0
  58. package/dist/decorators/jsonb.js +101 -0
  59. package/dist/decorators/orm-decorators.js +425 -0
  60. package/dist/decorators/permissions.js +294 -0
  61. package/dist/decorators/procedure.js +210 -0
  62. package/dist/decorators/query-options.js +556 -0
  63. package/dist/decorators/range.js +167 -0
  64. package/dist/decorators/set-column.js +83 -0
  65. package/dist/decorators/spatial.js +114 -0
  66. package/dist/decorators/storage.js +580 -0
  67. package/dist/decorators/timezone.js +512 -0
  68. package/dist/decorators/trigger.js +90 -0
  69. package/dist/decorators/uuid.js +135 -0
  70. package/dist/decorators/view.js +258 -0
  71. package/dist/diagrams/chen-diagram.js +354 -0
  72. package/dist/diagrams/class-diagram.js +384 -0
  73. package/dist/diagrams/dependency-diagram.js +432 -0
  74. package/dist/diagrams/er-diagram.js +605 -0
  75. package/dist/diagrams/flow-diagram.js +394 -0
  76. package/dist/diagrams/gantt-diagram.js +411 -0
  77. package/dist/diagrams/index-diagram.js +353 -0
  78. package/dist/diagrams/index.js +184 -0
  79. package/dist/diagrams/migration-diagram.js +316 -0
  80. package/dist/diagrams/model-diagram.js +616 -0
  81. package/dist/diagrams/package-diagram.js +376 -0
  82. package/dist/diagrams/palette.js +85 -0
  83. package/dist/diagrams/relational-diagram.js +455 -0
  84. package/dist/diagrams/schemadoc-diagram.js +309 -0
  85. package/dist/diagrams/sequence-diagram.js +307 -0
  86. package/dist/diagrams/state-diagram.js +344 -0
  87. package/dist/diagrams/svg-dom.js +111 -0
  88. package/dist/diagrams/tree-diagram.js +250 -0
  89. package/dist/dialects/clickhouse/index.js +1742 -0
  90. package/dist/dialects/cockroachdb/index.js +4677 -0
  91. package/dist/dialects/cratedb/index.js +441 -0
  92. package/dist/dialects/databricks/index.js +517 -0
  93. package/dist/dialects/db2/index.js +2225 -0
  94. package/dist/dialects/dialect.js +720 -0
  95. package/dist/dialects/duckdb/index.js +2014 -0
  96. package/dist/dialects/exasol/index.js +357 -0
  97. package/dist/dialects/firebird/index.js +495 -0
  98. package/dist/dialects/greenplum/index.js +457 -0
  99. package/dist/dialects/hana/index.js +1741 -0
  100. package/dist/dialects/mariadb/index.js +3590 -0
  101. package/dist/dialects/mssql/index.js +2296 -0
  102. package/dist/dialects/mysql/index.js +4058 -0
  103. package/dist/dialects/oracle/index.js +2999 -0
  104. package/dist/dialects/postgres/index.js +5319 -0
  105. package/dist/dialects/query-stream-helper.js +152 -0
  106. package/dist/dialects/questdb/index.js +433 -0
  107. package/dist/dialects/redshift/index.js +2277 -0
  108. package/dist/dialects/singlestore/index.js +354 -0
  109. package/dist/dialects/snowflake/index.js +2082 -0
  110. package/dist/dialects/spanner/index.js +1768 -0
  111. package/dist/dialects/sqlite/index.js +3382 -0
  112. package/dist/dialects/tidb/index.js +377 -0
  113. package/dist/dialects/timescaledb/index.js +164 -0
  114. package/dist/dialects/trino/index.js +420 -0
  115. package/dist/dialects/turso/index.js +227 -0
  116. package/dist/dialects/vertica/index.js +317 -0
  117. package/dist/dialects/yugabytedb/index.js +424 -0
  118. package/dist/errors/index.js +472 -0
  119. package/dist/errors/utils.js +340 -0
  120. package/dist/errors.js +21 -0
  121. package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
  122. package/dist/extensions/catalog/mssql-features.js +147 -0
  123. package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
  124. package/dist/extensions/catalog/oracle-db2-features.js +196 -0
  125. package/dist/extensions/catalog/postgres-extensions.js +516 -0
  126. package/dist/extensions/index.js +71 -0
  127. package/dist/extensions/types.js +13 -0
  128. package/dist/foreign-data.js +173 -0
  129. package/dist/hooks/hooks-manager.js +350 -0
  130. package/dist/hooks/index.js +37 -0
  131. package/dist/index.js +463 -0
  132. package/dist/logging.js +335 -0
  133. package/dist/migrations/index.js +40 -0
  134. package/dist/migrations/migration.js +196 -0
  135. package/dist/migrations/migrator.js +411 -0
  136. package/dist/migrations/prormmigration.js +275 -0
  137. package/dist/migrations/query-interface.js +435 -0
  138. package/dist/migrations/seeder.js +353 -0
  139. package/dist/models/associations.js +852 -0
  140. package/dist/models/constraints.js +288 -0
  141. package/dist/models/data-types.js +2518 -0
  142. package/dist/models/decorators.js +445 -0
  143. package/dist/models/index.js +33 -0
  144. package/dist/models/indexes.js +531 -0
  145. package/dist/models/methods.js +382 -0
  146. package/dist/models/model-manager.js +103 -0
  147. package/dist/models/model.js +5349 -0
  148. package/dist/models/operators.js +67 -0
  149. package/dist/models/scopes.js +189 -0
  150. package/dist/models/typescript-types.js +26 -0
  151. package/dist/nosql/aerospike/index.js +205 -0
  152. package/dist/nosql/allegrograph/index.js +169 -0
  153. package/dist/nosql/arangodb/index.js +364 -0
  154. package/dist/nosql/azure-blob/index.js +206 -0
  155. package/dist/nosql/beanstalkd/index.js +231 -0
  156. package/dist/nosql/beequeue/index.js +210 -0
  157. package/dist/nosql/bigchaindb/index.js +195 -0
  158. package/dist/nosql/bigtable/index.js +224 -0
  159. package/dist/nosql/blazegraph/index.js +173 -0
  160. package/dist/nosql/bullmq/index.js +191 -0
  161. package/dist/nosql/cassandra/index.js +174 -0
  162. package/dist/nosql/chroma/index.js +190 -0
  163. package/dist/nosql/cloudflare-kv/index.js +220 -0
  164. package/dist/nosql/coherence/index.js +200 -0
  165. package/dist/nosql/cosmosdb/index.js +157 -0
  166. package/dist/nosql/couchbase/index.js +213 -0
  167. package/dist/nosql/dax/index.js +212 -0
  168. package/dist/nosql/deno-kv/index.js +206 -0
  169. package/dist/nosql/dgraph/index.js +171 -0
  170. package/dist/nosql/doris/index.js +169 -0
  171. package/dist/nosql/druid/index.js +162 -0
  172. package/dist/nosql/dynamodb/index.js +937 -0
  173. package/dist/nosql/elasticsearch/index.js +377 -0
  174. package/dist/nosql/etcd/index.js +502 -0
  175. package/dist/nosql/eventhubs/index.js +213 -0
  176. package/dist/nosql/eventstore/index.js +254 -0
  177. package/dist/nosql/faunadb/index.js +188 -0
  178. package/dist/nosql/firestore/index.js +177 -0
  179. package/dist/nosql/fluree/index.js +148 -0
  180. package/dist/nosql/fuseki/index.js +170 -0
  181. package/dist/nosql/gcs/index.js +172 -0
  182. package/dist/nosql/gearman/index.js +160 -0
  183. package/dist/nosql/geode/index.js +196 -0
  184. package/dist/nosql/graphdb/index.js +169 -0
  185. package/dist/nosql/graylog/index.js +188 -0
  186. package/dist/nosql/gridgain/index.js +171 -0
  187. package/dist/nosql/hazelcast/index.js +162 -0
  188. package/dist/nosql/hbase/index.js +230 -0
  189. package/dist/nosql/ignite/index.js +173 -0
  190. package/dist/nosql/immudb/index.js +184 -0
  191. package/dist/nosql/index.js +232 -0
  192. package/dist/nosql/infinispan/index.js +200 -0
  193. package/dist/nosql/influxdb/index.js +0 -0
  194. package/dist/nosql/kafka/index.js +234 -0
  195. package/dist/nosql/keyspaces/index.js +189 -0
  196. package/dist/nosql/kinesis/index.js +253 -0
  197. package/dist/nosql/leveldb/index.js +153 -0
  198. package/dist/nosql/lmdb/index.js +160 -0
  199. package/dist/nosql/loki/index.js +201 -0
  200. package/dist/nosql/marklogic/index.js +204 -0
  201. package/dist/nosql/materialize/index.js +145 -0
  202. package/dist/nosql/meilisearch/index.js +154 -0
  203. package/dist/nosql/memcached/index.js +223 -0
  204. package/dist/nosql/milvus/index.js +410 -0
  205. package/dist/nosql/minio/index.js +265 -0
  206. package/dist/nosql/momento/index.js +179 -0
  207. package/dist/nosql/mongodb/index.js +461 -0
  208. package/dist/nosql/nats/index.js +247 -0
  209. package/dist/nosql/nedb/index.js +164 -0
  210. package/dist/nosql/neo4j/index.js +450 -0
  211. package/dist/nosql/neptune/index.js +470 -0
  212. package/dist/nosql/nsq/index.js +200 -0
  213. package/dist/nosql/opensearch/index.js +186 -0
  214. package/dist/nosql/orientdb/index.js +175 -0
  215. package/dist/nosql/papertrail/index.js +200 -0
  216. package/dist/nosql/pinecone/index.js +0 -0
  217. package/dist/nosql/pinot/index.js +133 -0
  218. package/dist/nosql/pouchdb/index.js +172 -0
  219. package/dist/nosql/prometheus/index.js +174 -0
  220. package/dist/nosql/provendb/index.js +147 -0
  221. package/dist/nosql/pubsub/index.js +187 -0
  222. package/dist/nosql/pulsar/index.js +232 -0
  223. package/dist/nosql/qdrant/index.js +295 -0
  224. package/dist/nosql/qldb/index.js +192 -0
  225. package/dist/nosql/r2/index.js +281 -0
  226. package/dist/nosql/rabbitmq/index.js +237 -0
  227. package/dist/nosql/ravendb/index.js +175 -0
  228. package/dist/nosql/redis/index.js +607 -0
  229. package/dist/nosql/redpanda/index.js +237 -0
  230. package/dist/nosql/resque/index.js +203 -0
  231. package/dist/nosql/rethinkdb/index.js +232 -0
  232. package/dist/nosql/rocksdb/index.js +152 -0
  233. package/dist/nosql/rockset/index.js +126 -0
  234. package/dist/nosql/s3/index.js +298 -0
  235. package/dist/nosql/scylladb/index.js +178 -0
  236. package/dist/nosql/signoz/index.js +227 -0
  237. package/dist/nosql/sns/index.js +201 -0
  238. package/dist/nosql/solr/index.js +231 -0
  239. package/dist/nosql/splunk/index.js +227 -0
  240. package/dist/nosql/sqs/index.js +246 -0
  241. package/dist/nosql/stardog/index.js +169 -0
  242. package/dist/nosql/starrocks/index.js +170 -0
  243. package/dist/nosql/store.js +2 -0
  244. package/dist/nosql/sumologic/index.js +213 -0
  245. package/dist/nosql/surrealdb/index.js +179 -0
  246. package/dist/nosql/terminusdb/index.js +151 -0
  247. package/dist/nosql/tigergraph/index.js +469 -0
  248. package/dist/nosql/typesense/index.js +148 -0
  249. package/dist/nosql/unqlite/index.js +157 -0
  250. package/dist/nosql/upstash/index.js +167 -0
  251. package/dist/nosql/vercel-kv/index.js +166 -0
  252. package/dist/nosql/victoriametrics/index.js +213 -0
  253. package/dist/nosql/virtuoso/index.js +169 -0
  254. package/dist/nosql/weaviate/index.js +276 -0
  255. package/dist/operators/index.js +108 -0
  256. package/dist/operators.js +2690 -0
  257. package/dist/prisma-migrate/index.js +38 -0
  258. package/dist/prisma-migrate/migration-generator.js +125 -0
  259. package/dist/prisma-migrate/model-generator.js +172 -0
  260. package/dist/prisma-migrate/relations.js +100 -0
  261. package/dist/prisma-migrate/schema-parser.js +167 -0
  262. package/dist/prisma-migrate/type-mapper.js +40 -0
  263. package/dist/prorm.js +6832 -0
  264. package/dist/query-builders/cte-builder.js +80 -0
  265. package/dist/query-builders/functions/aggregate.js +390 -0
  266. package/dist/query-builders/functions/conditional.js +503 -0
  267. package/dist/query-builders/functions/datetime.js +695 -0
  268. package/dist/query-builders/functions/fulltext.js +439 -0
  269. package/dist/query-builders/functions/index.js +93 -0
  270. package/dist/query-builders/functions/json.js +427 -0
  271. package/dist/query-builders/functions/math.js +399 -0
  272. package/dist/query-builders/functions/string.js +518 -0
  273. package/dist/query-builders/functions/window.js +328 -0
  274. package/dist/query-builders/include-builder.js +323 -0
  275. package/dist/query-builders/index-expression-builder.js +242 -0
  276. package/dist/query-builders/index.js +161 -0
  277. package/dist/query-builders/insert-builder.js +164 -0
  278. package/dist/query-builders/model-helpers.js +38 -0
  279. package/dist/query-builders/order-limit-builder.js +239 -0
  280. package/dist/query-builders/sql-compiler.js +2040 -0
  281. package/dist/query-builders/subquery-builder.js +152 -0
  282. package/dist/query-builders/update-builder.js +182 -0
  283. package/dist/query-builders/view-builder.js +218 -0
  284. package/dist/query-builders/where-builder.js +1532 -0
  285. package/dist/query-interface.js +622 -0
  286. package/dist/query-optimizers/batch-optimizer.js +426 -0
  287. package/dist/query-optimizers/explain-plans.js +415 -0
  288. package/dist/query-optimizers/index.js +51 -0
  289. package/dist/query-optimizers/prepared-statement-cache.js +423 -0
  290. package/dist/query-optimizers/query-hints.js +438 -0
  291. package/dist/query-optimizers/query-optimizer.js +278 -0
  292. package/dist/query-optimizers/slow-query-logger.js +271 -0
  293. package/dist/replica-manager.js +507 -0
  294. package/dist/schema/index.js +15 -0
  295. package/dist/schema/migration-generator.js +374 -0
  296. package/dist/schema/schema-differ.js +549 -0
  297. package/dist/schema/types.js +6 -0
  298. package/dist/sql-constants.js +300 -0
  299. package/dist/sqlite-advanced.js +1047 -0
  300. package/dist/streams/index.js +12 -0
  301. package/dist/streams/transforms.js +178 -0
  302. package/dist/transaction.js +456 -0
  303. package/dist/types/index.js +180 -0
  304. package/dist/user-management.js +127 -0
  305. package/dist/utils/date.js +300 -0
  306. package/dist/utils/index.js +1079 -0
  307. package/dist/utils/string.js +161 -0
  308. package/dist/validators/index.js +19 -0
  309. package/dist/validators/validator.js +911 -0
  310. package/package.json +190 -0
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ /**
3
+ * Beanstalkd job/work-queue store.
4
+ *
5
+ * Beanstalkd is a simple, fast work queue. Producers `put` jobs (opaque byte
6
+ * payloads) into named *tubes*; workers `reserve` jobs from the tubes they
7
+ * `watch`, do the work, then `delete` (destroy) them. It is not a database:
8
+ * there is no query language and it does not fit the SQL-shaped `Dialect`
9
+ * interface, so this class implements the minimal `NoSqlStore` marker
10
+ * interface and exposes Beanstalkd's real queue operations instead.
11
+ *
12
+ * Uses the `fivebeans` driver, whose client exposes a callback-style API
13
+ * (`client.put(pri, delay, ttr, payload, cb)` etc.); this store promisifies
14
+ * those calls internally so its surface is promise-based. `fivebeans` is an
15
+ * optional peer and is loaded lazily (via `require`) inside `connect()`, so
16
+ * importing this module does not require it to be installed unless you
17
+ * actually connect. A pre-built client can be injected via
18
+ * `BeanstalkdStoreOptions.client`, in which case `connect()` adopts it and
19
+ * skips the `require` entirely (used by the unit tests to inject a mock).
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.BeanstalkdStore = void 0;
23
+ const errors_1 = require("../../errors");
24
+ function wrapConnectionError(err) {
25
+ const parent = err instanceof Error ? err : new Error(String(err));
26
+ const message = /econnrefused/i.test(parent.message)
27
+ ? 'Connection refused'
28
+ : `Unable to connect to Beanstalkd: ${parent.message}`;
29
+ return new errors_1.ConnectionError(message, { parent, database: 'beanstalkd' });
30
+ }
31
+ function wrapDatabaseError(err, action) {
32
+ const parent = err instanceof Error ? err : new Error(String(err));
33
+ return errors_1.DatabaseError.from(parent, { message: `Beanstalkd ${action} failed: ${parent.message}` });
34
+ }
35
+ /**
36
+ * `BeanstalkdStore` wraps a single `fivebeans` client and exposes the common
37
+ * queue surface (`enqueue`/`process`/`getJob`/`remove`/`stats`) over
38
+ * Beanstalkd tubes, promisifying the driver's callback API.
39
+ */
40
+ class BeanstalkdStore {
41
+ constructor(options = {}) {
42
+ this.name = 'beanstalkd';
43
+ this.library = 'fivebeans';
44
+ this.client = null;
45
+ this.connected = false;
46
+ /** Set false on disconnect to break any running `process()` reserve loop. */
47
+ this.running = false;
48
+ this.options = options;
49
+ }
50
+ // ---------------------------------------------------------------------
51
+ // Connection lifecycle
52
+ // ---------------------------------------------------------------------
53
+ async connect() {
54
+ if (this.connected && this.client) {
55
+ return;
56
+ }
57
+ try {
58
+ if (this.options.client != null) {
59
+ // Injected client (e.g. a test mock): adopt it, don't require the driver.
60
+ this.client = this.options.client;
61
+ }
62
+ else {
63
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
64
+ const fivebeans = require('fivebeans');
65
+ const host = this.options.host || '127.0.0.1';
66
+ const port = this.options.port || 11300;
67
+ this.client = new fivebeans.client(host, port);
68
+ await new Promise((resolve, reject) => {
69
+ this.client.once('connect', () => resolve());
70
+ this.client.once('error', (err) => reject(err));
71
+ this.client.connect();
72
+ });
73
+ }
74
+ this.connected = true;
75
+ this.running = true;
76
+ }
77
+ catch (err) {
78
+ this.client = null;
79
+ this.connected = false;
80
+ throw wrapConnectionError(err);
81
+ }
82
+ }
83
+ async disconnect() {
84
+ this.running = false;
85
+ try {
86
+ if (this.client && typeof this.client.end === 'function') {
87
+ this.client.end();
88
+ }
89
+ else if (this.client && typeof this.client.quit === 'function') {
90
+ this.client.quit();
91
+ }
92
+ }
93
+ catch {
94
+ // Ignore teardown errors.
95
+ }
96
+ this.client = null;
97
+ this.connected = false;
98
+ }
99
+ isConnected() {
100
+ return this.connected && this.client !== null;
101
+ }
102
+ /** Returns the underlying `fivebeans` client for operations not wrapped here. */
103
+ getClient() {
104
+ return this.requireClient();
105
+ }
106
+ requireClient() {
107
+ if (!this.client) {
108
+ throw new errors_1.ConnectionError('Not connected to Beanstalkd', { database: 'beanstalkd' });
109
+ }
110
+ return this.client;
111
+ }
112
+ /** Promisify a callback-style client method whose callback is `(err, result)`. */
113
+ call(method, ...args) {
114
+ const client = this.requireClient();
115
+ return new Promise((resolve, reject) => {
116
+ client[method](...args, (err, result) => {
117
+ if (err)
118
+ reject(err);
119
+ else
120
+ resolve(result);
121
+ });
122
+ });
123
+ }
124
+ // ---------------------------------------------------------------------
125
+ // Queue operations
126
+ // ---------------------------------------------------------------------
127
+ /**
128
+ * Enqueue a job into a tube. Selects the tube via `use()`, then `put()`s the
129
+ * (JSON-serialized) payload with the given priority/delay/ttr. Returns the
130
+ * job id assigned by the server.
131
+ */
132
+ async enqueue(queue, jobData, opts = {}) {
133
+ try {
134
+ await this.call('use', queue);
135
+ const payload = typeof jobData === 'string' ? jobData : JSON.stringify(jobData);
136
+ const priority = opts.priority ?? 0;
137
+ const delay = opts.delay ?? 0;
138
+ const ttr = opts.ttr ?? 60;
139
+ const jobId = await this.call('put', priority, delay, ttr, payload);
140
+ return jobId;
141
+ }
142
+ catch (err) {
143
+ throw wrapDatabaseError(err, 'enqueue');
144
+ }
145
+ }
146
+ /**
147
+ * Register a worker on a tube: `watch()` it, then loop `reserve()`ing jobs
148
+ * and invoking `handler(job)`. After the handler resolves the job is
149
+ * `destroy()`ed. The loop stops when the store disconnects.
150
+ */
151
+ async process(queue, handler) {
152
+ try {
153
+ await this.call('watch', queue);
154
+ }
155
+ catch (err) {
156
+ throw wrapDatabaseError(err, 'process');
157
+ }
158
+ const loop = async () => {
159
+ while (this.running && this.client) {
160
+ let job;
161
+ try {
162
+ // fivebeans reserve callback is (err, jobid, payload).
163
+ job = await new Promise((resolve, reject) => {
164
+ this.client.reserve((err, id, payload) => {
165
+ if (err)
166
+ reject(err);
167
+ else
168
+ resolve({ id, payload: payload != null ? payload.toString() : '' });
169
+ });
170
+ });
171
+ }
172
+ catch {
173
+ // Reserve failed (e.g. connection torn down): stop the loop.
174
+ return;
175
+ }
176
+ try {
177
+ await handler(job);
178
+ await this.call('destroy', job.id);
179
+ }
180
+ catch {
181
+ // Handler/destroy error: leave the job to time out and requeue.
182
+ }
183
+ }
184
+ };
185
+ // Fire-and-forget the reserve loop; it self-terminates on disconnect.
186
+ void loop();
187
+ }
188
+ /** Peek at a job by id, returning its id and payload (or `null` if absent). */
189
+ async getJob(_queue, id) {
190
+ try {
191
+ const payload = await new Promise((resolve, reject) => {
192
+ this.requireClient().peek(id, (err, _jobId, data) => {
193
+ if (err)
194
+ reject(err);
195
+ else
196
+ resolve(data);
197
+ });
198
+ });
199
+ if (payload == null)
200
+ return null;
201
+ return { id, payload: payload.toString() };
202
+ }
203
+ catch (err) {
204
+ // fivebeans reports a missing job as a NOT_FOUND error; treat as null.
205
+ if (err instanceof Error && /not[_\s]?found/i.test(err.message)) {
206
+ return null;
207
+ }
208
+ throw wrapDatabaseError(err, 'getJob');
209
+ }
210
+ }
211
+ /** Delete (destroy) a job by id. */
212
+ async remove(_queue, id) {
213
+ try {
214
+ await this.call('destroy', id);
215
+ }
216
+ catch (err) {
217
+ throw wrapDatabaseError(err, 'remove');
218
+ }
219
+ }
220
+ /** Return per-tube statistics (`stats-tube`), e.g. ready/reserved/buried counts. */
221
+ async stats(queue) {
222
+ try {
223
+ return await this.call('stats_tube', queue);
224
+ }
225
+ catch (err) {
226
+ throw wrapDatabaseError(err, 'stats');
227
+ }
228
+ }
229
+ }
230
+ exports.BeanstalkdStore = BeanstalkdStore;
231
+ exports.default = BeanstalkdStore;
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * Bee-Queue job/task-queue store.
4
+ *
5
+ * Bee-Queue is a fast, lightweight Redis-backed job queue. A single `Queue`
6
+ * object (bound to a queue name) both produces jobs — `queue.createJob(data)`
7
+ * built into a job, then `.save()`d — and consumes them via
8
+ * `queue.process(handler)`. Each queue is a distinct object per name, so this
9
+ * store caches one `Queue` per queue name. It is not a database and does not
10
+ * fit the SQL-shaped `Dialect` interface, so this class implements the
11
+ * minimal `NoSqlStore` marker interface and exposes Bee-Queue's real
12
+ * create/process/getJob operations instead.
13
+ *
14
+ * Uses the `bee-queue` driver, whose default export is the `Queue`
15
+ * constructor. It is an optional peer loaded lazily (via `require`) inside
16
+ * `connect()`, so importing this module does not require it to be installed
17
+ * unless you actually connect. A pre-built `Queue` constructor can be
18
+ * injected via `BeeQueueStoreOptions.client`, in which case `connect()`
19
+ * adopts it and skips the `require` entirely (used by the unit tests to
20
+ * inject a mock).
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.BeeQueueStore = void 0;
24
+ const errors_1 = require("../../errors");
25
+ function wrapConnectionError(err) {
26
+ const parent = err instanceof Error ? err : new Error(String(err));
27
+ const message = /econnrefused/i.test(parent.message)
28
+ ? 'Connection refused'
29
+ : `Unable to connect to Bee-Queue: ${parent.message}`;
30
+ return new errors_1.ConnectionError(message, { parent, database: 'beequeue' });
31
+ }
32
+ function wrapDatabaseError(err, action) {
33
+ const parent = err instanceof Error ? err : new Error(String(err));
34
+ return errors_1.DatabaseError.from(parent, { message: `Bee-Queue ${action} failed: ${parent.message}` });
35
+ }
36
+ /**
37
+ * `BeeQueueStore` manages a pool of Bee-Queue `Queue` objects keyed by queue
38
+ * name and exposes the common queue surface
39
+ * (`enqueue`/`process`/`getJob`/`remove`/`stats`).
40
+ */
41
+ class BeeQueueStore {
42
+ constructor(options = {}) {
43
+ this.name = 'beequeue';
44
+ this.library = 'bee-queue';
45
+ this.Queue = null;
46
+ this.connected = false;
47
+ this.queues = new Map();
48
+ /** Queue names that already have a `process()` handler registered. */
49
+ this.processing = new Set();
50
+ this.options = options;
51
+ }
52
+ // ---------------------------------------------------------------------
53
+ // Connection lifecycle
54
+ // ---------------------------------------------------------------------
55
+ async connect() {
56
+ if (this.connected && this.Queue) {
57
+ return;
58
+ }
59
+ try {
60
+ // Bee-Queue opens Redis connections per Queue; "connecting" here just
61
+ // resolves the Queue constructor. Injected client skips the require.
62
+ this.Queue = this.options.client != null ? this.options.client : require('bee-queue');
63
+ this.connected = true;
64
+ }
65
+ catch (err) {
66
+ this.Queue = null;
67
+ this.connected = false;
68
+ throw wrapConnectionError(err);
69
+ }
70
+ }
71
+ async disconnect() {
72
+ for (const queue of this.queues.values()) {
73
+ try {
74
+ if (queue && typeof queue.close === 'function')
75
+ await queue.close();
76
+ }
77
+ catch {
78
+ // Ignore teardown errors.
79
+ }
80
+ }
81
+ this.queues.clear();
82
+ this.processing.clear();
83
+ this.Queue = null;
84
+ this.connected = false;
85
+ }
86
+ isConnected() {
87
+ return this.connected && this.Queue !== null;
88
+ }
89
+ /** Returns the underlying `bee-queue` `Queue` constructor. */
90
+ getClient() {
91
+ return this.requireDriver();
92
+ }
93
+ requireDriver() {
94
+ if (!this.Queue) {
95
+ throw new errors_1.ConnectionError('Not connected to Bee-Queue', { database: 'beequeue' });
96
+ }
97
+ return this.Queue;
98
+ }
99
+ get settings() {
100
+ return this.options.settings ?? { redis: { host: '127.0.0.1', port: 6379 } };
101
+ }
102
+ /** Get (creating and caching on first use) the `Queue` for a queue name. */
103
+ getQueue(name) {
104
+ const Queue = this.requireDriver();
105
+ let queue = this.queues.get(name);
106
+ if (!queue) {
107
+ queue = new Queue(name, this.settings);
108
+ this.queues.set(name, queue);
109
+ }
110
+ return queue;
111
+ }
112
+ // ---------------------------------------------------------------------
113
+ // Queue operations
114
+ // ---------------------------------------------------------------------
115
+ /**
116
+ * Build a job with `queue.createJob(data)`, apply any retry/delay/timeout
117
+ * options, `.save()` it, and return the id Bee-Queue assigns.
118
+ */
119
+ async enqueue(queue, jobData, opts = {}) {
120
+ try {
121
+ const q = this.getQueue(queue);
122
+ let job = q.createJob(jobData);
123
+ if (opts.retries !== undefined && typeof job.retries === 'function') {
124
+ job = job.retries(opts.retries);
125
+ }
126
+ if (opts.delayUntil !== undefined && typeof job.delayUntil === 'function') {
127
+ job = job.delayUntil(opts.delayUntil);
128
+ }
129
+ if (opts.timeout !== undefined && typeof job.timeout === 'function') {
130
+ job = job.timeout(opts.timeout);
131
+ }
132
+ const saved = await job.save();
133
+ // `save()` resolves with the job (carrying its assigned id).
134
+ return (saved ?? job)?.id;
135
+ }
136
+ catch (err) {
137
+ throw wrapDatabaseError(err, 'enqueue');
138
+ }
139
+ }
140
+ /**
141
+ * Register the worker handler for a queue via `queue.process(concurrency,
142
+ * handler)`. Bee-Queue allows only one `process()` per Queue object, so a
143
+ * repeat call on the same queue name is a no-op.
144
+ */
145
+ async process(queue, handler, opts = {}) {
146
+ try {
147
+ const q = this.getQueue(queue);
148
+ if (this.processing.has(queue))
149
+ return q;
150
+ if (opts.concurrency !== undefined) {
151
+ q.process(opts.concurrency, handler);
152
+ }
153
+ else {
154
+ q.process(handler);
155
+ }
156
+ this.processing.add(queue);
157
+ return q;
158
+ }
159
+ catch (err) {
160
+ throw wrapDatabaseError(err, 'process');
161
+ }
162
+ }
163
+ /** Fetch a job by id from the named queue (`queue.getJob(id)`). */
164
+ async getJob(queue, id) {
165
+ try {
166
+ return await this.getQueue(queue).getJob(id);
167
+ }
168
+ catch (err) {
169
+ throw wrapDatabaseError(err, 'getJob');
170
+ }
171
+ }
172
+ /**
173
+ * Remove a job by id from the named queue. Uses `queue.removeJob(id)` when
174
+ * available, otherwise fetches the job and calls `job.remove()`.
175
+ */
176
+ async remove(queue, id) {
177
+ try {
178
+ const q = this.getQueue(queue);
179
+ if (typeof q.removeJob === 'function') {
180
+ await q.removeJob(id);
181
+ return;
182
+ }
183
+ const job = await q.getJob(id);
184
+ if (job && typeof job.remove === 'function') {
185
+ await job.remove();
186
+ }
187
+ }
188
+ catch (err) {
189
+ throw wrapDatabaseError(err, 'remove');
190
+ }
191
+ }
192
+ /**
193
+ * Return job counts by state for a queue. Uses `queue.getJobCounts()` when
194
+ * available, otherwise falls back to Bee-Queue's `queue.checkHealth()`.
195
+ */
196
+ async stats(queue) {
197
+ try {
198
+ const q = this.getQueue(queue);
199
+ if (typeof q.getJobCounts === 'function') {
200
+ return await q.getJobCounts();
201
+ }
202
+ return await q.checkHealth();
203
+ }
204
+ catch (err) {
205
+ throw wrapDatabaseError(err, 'stats');
206
+ }
207
+ }
208
+ }
209
+ exports.BeeQueueStore = BeeQueueStore;
210
+ exports.default = BeeQueueStore;
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ /**
3
+ * BigchainDB store implementation.
4
+ *
5
+ * BigchainDB is a blockchain database: data is written as cryptographically
6
+ * signed, immutable **transactions** over **assets**. A CREATE transaction
7
+ * registers a new asset (with arbitrary immutable `asset.data` and mutable
8
+ * `metadata`); TRANSFER transactions spend prior outputs. Because every
9
+ * transaction is Ed25519-signed and content-addressed by its hash (`tx.id`),
10
+ * the ledger is append-only and tamper-evident by construction.
11
+ *
12
+ * BigchainDB is not a SQL `Dialect`, so this class implements the minimal
13
+ * `NoSqlStore` marker interface plus the shared ledger surface:
14
+ * - `append(table, data)` -> build + sign + commit a CREATE transaction
15
+ * whose asset carries `{ table, ...data }`, returning the new `tx.id`.
16
+ * - `get(table, id)` -> fetch a transaction by id.
17
+ * - `history(table, id)` -> list all transactions for the asset `id`.
18
+ * - `verify(table, id)` -> return the signed transaction (its signatures
19
+ * and content hash are the proof of integrity).
20
+ * - `query(text)` -> full-text asset search (`searchAssets`).
21
+ *
22
+ * ## Lazy driver loading
23
+ *
24
+ * `bigchaindb-driver` is loaded lazily inside `connect()`. Tests inject a
25
+ * pre-built connection via `BigchaindbStoreOptions.client` and the transaction
26
+ * factory via `BigchaindbStoreOptions.transaction`, bypassing the `require`.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.BigchaindbStore = void 0;
30
+ const errors_1 = require("../../errors");
31
+ /**
32
+ * `BigchaindbStore` wraps a `bigchaindb-driver` connection + transaction
33
+ * factory behind the shared ledger surface.
34
+ */
35
+ class BigchaindbStore {
36
+ constructor(options = {}) {
37
+ this.name = 'bigchaindb';
38
+ this.library = 'bigchaindb-driver';
39
+ this.conn = null;
40
+ this.txFactory = null;
41
+ this.connected = false;
42
+ this.options = options;
43
+ }
44
+ // ---------------------------------------------------------------------
45
+ // Connection lifecycle
46
+ // ---------------------------------------------------------------------
47
+ async connect() {
48
+ if (this.connected && this.conn) {
49
+ return;
50
+ }
51
+ try {
52
+ if (this.options.client) {
53
+ this.conn = this.options.client;
54
+ this.txFactory = this.options.transaction ?? null;
55
+ }
56
+ else {
57
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
58
+ const driver = require('bigchaindb-driver');
59
+ this.conn = new driver.Connection(this.options.url ?? 'http://localhost:9984/api/v1/', this.options.headers ?? {});
60
+ this.txFactory = this.options.transaction ?? driver.Transaction;
61
+ }
62
+ this.connected = true;
63
+ }
64
+ catch (err) {
65
+ this.conn = null;
66
+ this.txFactory = null;
67
+ this.connected = false;
68
+ const parent = err instanceof Error ? err : new Error(String(err));
69
+ throw new errors_1.ConnectionError(`Unable to connect to BigchainDB: ${parent.message}`, {
70
+ parent,
71
+ database: 'bigchaindb',
72
+ });
73
+ }
74
+ }
75
+ async disconnect() {
76
+ this.conn = null;
77
+ this.txFactory = null;
78
+ this.connected = false;
79
+ }
80
+ isConnected() {
81
+ return this.connected && this.conn !== null;
82
+ }
83
+ /** Returns the underlying `Connection` for anything not wrapped here. */
84
+ getClient() {
85
+ return this.requireConn();
86
+ }
87
+ requireConn() {
88
+ if (!this.conn || !this.connected) {
89
+ throw new errors_1.ConnectionError('Not connected to BigchainDB. Call connect() first.', {
90
+ database: 'bigchaindb',
91
+ });
92
+ }
93
+ return this.conn;
94
+ }
95
+ requireTxFactory() {
96
+ if (!this.txFactory) {
97
+ throw new errors_1.DatabaseError('BigchainDB Transaction factory unavailable. Provide `transaction` in options.', { code: 'QUERY_ERROR' });
98
+ }
99
+ return this.txFactory;
100
+ }
101
+ // ---------------------------------------------------------------------
102
+ // Ledger surface
103
+ // ---------------------------------------------------------------------
104
+ /**
105
+ * Build, sign and commit a CREATE transaction registering a new asset whose
106
+ * immutable `asset.data` is `{ table, ...data }`. Returns the resulting
107
+ * transaction id (its content hash). Requires `options.keypair`.
108
+ */
109
+ async append(table, data) {
110
+ const conn = this.requireConn();
111
+ const tx = this.requireTxFactory();
112
+ const keypair = this.options.keypair;
113
+ if (!keypair) {
114
+ throw new errors_1.DatabaseError('BigchaindbStore.append requires a `keypair` to sign transactions', {
115
+ code: 'INVALID_CONNECTION',
116
+ });
117
+ }
118
+ try {
119
+ const assetData = { table, ...data };
120
+ const output = tx.makeOutput(tx.makeEd25519Condition(keypair.publicKey));
121
+ const created = tx.makeCreateTransaction(assetData, { table }, [output], keypair.publicKey);
122
+ const signed = tx.signTransaction(created, keypair.privateKey);
123
+ const committed = await conn.postTransactionCommit(signed);
124
+ return String(committed?.id ?? signed?.id ?? '');
125
+ }
126
+ catch (err) {
127
+ const parent = err instanceof Error ? err : new Error(String(err));
128
+ throw errors_1.DatabaseError.from(parent, { message: `BigchainDB append failed: ${parent.message}` });
129
+ }
130
+ }
131
+ /** Fetch a transaction by its id (`get(_, id)`). Returns the signed transaction. */
132
+ async get(_table, id) {
133
+ const conn = this.requireConn();
134
+ try {
135
+ return await conn.getTransaction(id);
136
+ }
137
+ catch (err) {
138
+ const parent = err instanceof Error ? err : new Error(String(err));
139
+ throw errors_1.DatabaseError.from(parent, { message: `BigchainDB get failed: ${parent.message}` });
140
+ }
141
+ }
142
+ /**
143
+ * List every transaction (CREATE + subsequent TRANSFERs) for the asset `id`
144
+ * - the append-only history of that asset. Uses `listTransactions`.
145
+ */
146
+ async history(_table, id) {
147
+ const conn = this.requireConn();
148
+ if (typeof conn.listTransactions !== 'function') {
149
+ throw new errors_1.DatabaseError('BigchainDB connection does not support listTransactions()', {
150
+ code: 'QUERY_ERROR',
151
+ });
152
+ }
153
+ try {
154
+ return await conn.listTransactions({ asset_id: id });
155
+ }
156
+ catch (err) {
157
+ const parent = err instanceof Error ? err : new Error(String(err));
158
+ throw errors_1.DatabaseError.from(parent, { message: `BigchainDB history failed: ${parent.message}` });
159
+ }
160
+ }
161
+ /**
162
+ * Return the signed transaction `id` as its own proof of integrity: its
163
+ * Ed25519 signatures and content-hash id are what any party independently
164
+ * re-verifies against the asset data. Returns `{ id, valid, transaction }`.
165
+ */
166
+ async verify(_table, id) {
167
+ const conn = this.requireConn();
168
+ try {
169
+ const transaction = await conn.getTransaction(id);
170
+ return { id, valid: transaction != null, transaction };
171
+ }
172
+ catch (err) {
173
+ const parent = err instanceof Error ? err : new Error(String(err));
174
+ throw errors_1.DatabaseError.from(parent, { message: `BigchainDB verify failed: ${parent.message}` });
175
+ }
176
+ }
177
+ /** Full-text search over asset data via `searchAssets`. */
178
+ async query(text) {
179
+ const conn = this.requireConn();
180
+ if (typeof conn.searchAssets !== 'function') {
181
+ throw new errors_1.DatabaseError('BigchainDB connection does not support searchAssets()', {
182
+ code: 'QUERY_ERROR',
183
+ });
184
+ }
185
+ try {
186
+ return await conn.searchAssets(text);
187
+ }
188
+ catch (err) {
189
+ const parent = err instanceof Error ? err : new Error(String(err));
190
+ throw errors_1.DatabaseError.from(parent, { message: `BigchainDB query failed: ${parent.message}` });
191
+ }
192
+ }
193
+ }
194
+ exports.BigchaindbStore = BigchaindbStore;
195
+ exports.default = BigchaindbStore;