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.
- package/CHANGELOG.md +1111 -0
- package/LICENSE +21 -0
- package/README.md +573 -0
- package/dist/audit/history-query.js +180 -0
- package/dist/audit/index.js +23 -0
- package/dist/audit/logger.js +236 -0
- package/dist/cache/cache-manager.js +84 -0
- package/dist/cache/index.js +16 -0
- package/dist/cache/redis-cluster-cache.js +557 -0
- package/dist/cli.js +2200 -0
- package/dist/compliance/audit-trail.js +68 -0
- package/dist/compliance/backup-verification.js +685 -0
- package/dist/compliance/breach-detector.js +505 -0
- package/dist/compliance/consent-record.js +227 -0
- package/dist/compliance/consent-versioning.js +331 -0
- package/dist/compliance/cross-border-log.js +530 -0
- package/dist/compliance/data-classifier.js +258 -0
- package/dist/compliance/data-lineage.js +565 -0
- package/dist/compliance/data-masker.js +303 -0
- package/dist/compliance/data-portability.js +265 -0
- package/dist/compliance/data-retention.js +195 -0
- package/dist/compliance/dsar-workflow.js +342 -0
- package/dist/compliance/field-encryption.js +223 -0
- package/dist/compliance/immutable-record.js +148 -0
- package/dist/compliance/index.js +260 -0
- package/dist/compliance/privacy-impact-assessment.js +364 -0
- package/dist/compliance/pseudonymization.js +269 -0
- package/dist/compliance/query-firewall.js +1182 -0
- package/dist/compliance/rate-limiter.js +580 -0
- package/dist/compliance/right-to-erasure.js +117 -0
- package/dist/compliance/row-level-security.js +246 -0
- package/dist/compliance/security-decorator.js +574 -0
- package/dist/compliance/security-monitor.js +525 -0
- package/dist/compliance/sensitive-data-discovery.js +476 -0
- package/dist/compliance/session-isolation.js +472 -0
- package/dist/compliance/tls-enforcer.js +108 -0
- package/dist/compliance/worm-storage.js +712 -0
- package/dist/connection-manager.js +198 -0
- package/dist/connection-pool.js +519 -0
- package/dist/decorators/audit.js +136 -0
- package/dist/decorators/belongs-to-many.js +115 -0
- package/dist/decorators/belongs-to.js +115 -0
- package/dist/decorators/check.js +435 -0
- package/dist/decorators/collate.js +329 -0
- package/dist/decorators/comment.js +205 -0
- package/dist/decorators/database-settings.js +236 -0
- package/dist/decorators/default.js +244 -0
- package/dist/decorators/encryption.js +235 -0
- package/dist/decorators/engine.js +97 -0
- package/dist/decorators/fk-constraints.js +594 -0
- package/dist/decorators/foreign-table.js +136 -0
- package/dist/decorators/generated.js +274 -0
- package/dist/decorators/has-many.js +127 -0
- package/dist/decorators/has-one.js +116 -0
- package/dist/decorators/hstore.js +129 -0
- package/dist/decorators/index.js +355 -0
- package/dist/decorators/json-column.js +83 -0
- package/dist/decorators/jsonb.js +101 -0
- package/dist/decorators/orm-decorators.js +425 -0
- package/dist/decorators/permissions.js +294 -0
- package/dist/decorators/procedure.js +210 -0
- package/dist/decorators/query-options.js +556 -0
- package/dist/decorators/range.js +167 -0
- package/dist/decorators/set-column.js +83 -0
- package/dist/decorators/spatial.js +114 -0
- package/dist/decorators/storage.js +580 -0
- package/dist/decorators/timezone.js +512 -0
- package/dist/decorators/trigger.js +90 -0
- package/dist/decorators/uuid.js +135 -0
- package/dist/decorators/view.js +258 -0
- package/dist/diagrams/chen-diagram.js +354 -0
- package/dist/diagrams/class-diagram.js +384 -0
- package/dist/diagrams/dependency-diagram.js +432 -0
- package/dist/diagrams/er-diagram.js +605 -0
- package/dist/diagrams/flow-diagram.js +394 -0
- package/dist/diagrams/gantt-diagram.js +411 -0
- package/dist/diagrams/index-diagram.js +353 -0
- package/dist/diagrams/index.js +184 -0
- package/dist/diagrams/migration-diagram.js +316 -0
- package/dist/diagrams/model-diagram.js +616 -0
- package/dist/diagrams/package-diagram.js +376 -0
- package/dist/diagrams/palette.js +85 -0
- package/dist/diagrams/relational-diagram.js +455 -0
- package/dist/diagrams/schemadoc-diagram.js +309 -0
- package/dist/diagrams/sequence-diagram.js +307 -0
- package/dist/diagrams/state-diagram.js +344 -0
- package/dist/diagrams/svg-dom.js +111 -0
- package/dist/diagrams/tree-diagram.js +250 -0
- package/dist/dialects/clickhouse/index.js +1742 -0
- package/dist/dialects/cockroachdb/index.js +4677 -0
- package/dist/dialects/cratedb/index.js +441 -0
- package/dist/dialects/databricks/index.js +517 -0
- package/dist/dialects/db2/index.js +2225 -0
- package/dist/dialects/dialect.js +720 -0
- package/dist/dialects/duckdb/index.js +2014 -0
- package/dist/dialects/exasol/index.js +357 -0
- package/dist/dialects/firebird/index.js +495 -0
- package/dist/dialects/greenplum/index.js +457 -0
- package/dist/dialects/hana/index.js +1741 -0
- package/dist/dialects/mariadb/index.js +3590 -0
- package/dist/dialects/mssql/index.js +2296 -0
- package/dist/dialects/mysql/index.js +4058 -0
- package/dist/dialects/oracle/index.js +2999 -0
- package/dist/dialects/postgres/index.js +5319 -0
- package/dist/dialects/query-stream-helper.js +152 -0
- package/dist/dialects/questdb/index.js +433 -0
- package/dist/dialects/redshift/index.js +2277 -0
- package/dist/dialects/singlestore/index.js +354 -0
- package/dist/dialects/snowflake/index.js +2082 -0
- package/dist/dialects/spanner/index.js +1768 -0
- package/dist/dialects/sqlite/index.js +3382 -0
- package/dist/dialects/tidb/index.js +377 -0
- package/dist/dialects/timescaledb/index.js +164 -0
- package/dist/dialects/trino/index.js +420 -0
- package/dist/dialects/turso/index.js +227 -0
- package/dist/dialects/vertica/index.js +317 -0
- package/dist/dialects/yugabytedb/index.js +424 -0
- package/dist/errors/index.js +472 -0
- package/dist/errors/utils.js +340 -0
- package/dist/errors.js +21 -0
- package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
- package/dist/extensions/catalog/mssql-features.js +147 -0
- package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
- package/dist/extensions/catalog/oracle-db2-features.js +196 -0
- package/dist/extensions/catalog/postgres-extensions.js +516 -0
- package/dist/extensions/index.js +71 -0
- package/dist/extensions/types.js +13 -0
- package/dist/foreign-data.js +173 -0
- package/dist/hooks/hooks-manager.js +350 -0
- package/dist/hooks/index.js +37 -0
- package/dist/index.js +463 -0
- package/dist/logging.js +335 -0
- package/dist/migrations/index.js +40 -0
- package/dist/migrations/migration.js +196 -0
- package/dist/migrations/migrator.js +411 -0
- package/dist/migrations/prormmigration.js +275 -0
- package/dist/migrations/query-interface.js +435 -0
- package/dist/migrations/seeder.js +353 -0
- package/dist/models/associations.js +852 -0
- package/dist/models/constraints.js +288 -0
- package/dist/models/data-types.js +2518 -0
- package/dist/models/decorators.js +445 -0
- package/dist/models/index.js +33 -0
- package/dist/models/indexes.js +531 -0
- package/dist/models/methods.js +382 -0
- package/dist/models/model-manager.js +103 -0
- package/dist/models/model.js +5349 -0
- package/dist/models/operators.js +67 -0
- package/dist/models/scopes.js +189 -0
- package/dist/models/typescript-types.js +26 -0
- package/dist/nosql/aerospike/index.js +205 -0
- package/dist/nosql/allegrograph/index.js +169 -0
- package/dist/nosql/arangodb/index.js +364 -0
- package/dist/nosql/azure-blob/index.js +206 -0
- package/dist/nosql/beanstalkd/index.js +231 -0
- package/dist/nosql/beequeue/index.js +210 -0
- package/dist/nosql/bigchaindb/index.js +195 -0
- package/dist/nosql/bigtable/index.js +224 -0
- package/dist/nosql/blazegraph/index.js +173 -0
- package/dist/nosql/bullmq/index.js +191 -0
- package/dist/nosql/cassandra/index.js +174 -0
- package/dist/nosql/chroma/index.js +190 -0
- package/dist/nosql/cloudflare-kv/index.js +220 -0
- package/dist/nosql/coherence/index.js +200 -0
- package/dist/nosql/cosmosdb/index.js +157 -0
- package/dist/nosql/couchbase/index.js +213 -0
- package/dist/nosql/dax/index.js +212 -0
- package/dist/nosql/deno-kv/index.js +206 -0
- package/dist/nosql/dgraph/index.js +171 -0
- package/dist/nosql/doris/index.js +169 -0
- package/dist/nosql/druid/index.js +162 -0
- package/dist/nosql/dynamodb/index.js +937 -0
- package/dist/nosql/elasticsearch/index.js +377 -0
- package/dist/nosql/etcd/index.js +502 -0
- package/dist/nosql/eventhubs/index.js +213 -0
- package/dist/nosql/eventstore/index.js +254 -0
- package/dist/nosql/faunadb/index.js +188 -0
- package/dist/nosql/firestore/index.js +177 -0
- package/dist/nosql/fluree/index.js +148 -0
- package/dist/nosql/fuseki/index.js +170 -0
- package/dist/nosql/gcs/index.js +172 -0
- package/dist/nosql/gearman/index.js +160 -0
- package/dist/nosql/geode/index.js +196 -0
- package/dist/nosql/graphdb/index.js +169 -0
- package/dist/nosql/graylog/index.js +188 -0
- package/dist/nosql/gridgain/index.js +171 -0
- package/dist/nosql/hazelcast/index.js +162 -0
- package/dist/nosql/hbase/index.js +230 -0
- package/dist/nosql/ignite/index.js +173 -0
- package/dist/nosql/immudb/index.js +184 -0
- package/dist/nosql/index.js +232 -0
- package/dist/nosql/infinispan/index.js +200 -0
- package/dist/nosql/influxdb/index.js +0 -0
- package/dist/nosql/kafka/index.js +234 -0
- package/dist/nosql/keyspaces/index.js +189 -0
- package/dist/nosql/kinesis/index.js +253 -0
- package/dist/nosql/leveldb/index.js +153 -0
- package/dist/nosql/lmdb/index.js +160 -0
- package/dist/nosql/loki/index.js +201 -0
- package/dist/nosql/marklogic/index.js +204 -0
- package/dist/nosql/materialize/index.js +145 -0
- package/dist/nosql/meilisearch/index.js +154 -0
- package/dist/nosql/memcached/index.js +223 -0
- package/dist/nosql/milvus/index.js +410 -0
- package/dist/nosql/minio/index.js +265 -0
- package/dist/nosql/momento/index.js +179 -0
- package/dist/nosql/mongodb/index.js +461 -0
- package/dist/nosql/nats/index.js +247 -0
- package/dist/nosql/nedb/index.js +164 -0
- package/dist/nosql/neo4j/index.js +450 -0
- package/dist/nosql/neptune/index.js +470 -0
- package/dist/nosql/nsq/index.js +200 -0
- package/dist/nosql/opensearch/index.js +186 -0
- package/dist/nosql/orientdb/index.js +175 -0
- package/dist/nosql/papertrail/index.js +200 -0
- package/dist/nosql/pinecone/index.js +0 -0
- package/dist/nosql/pinot/index.js +133 -0
- package/dist/nosql/pouchdb/index.js +172 -0
- package/dist/nosql/prometheus/index.js +174 -0
- package/dist/nosql/provendb/index.js +147 -0
- package/dist/nosql/pubsub/index.js +187 -0
- package/dist/nosql/pulsar/index.js +232 -0
- package/dist/nosql/qdrant/index.js +295 -0
- package/dist/nosql/qldb/index.js +192 -0
- package/dist/nosql/r2/index.js +281 -0
- package/dist/nosql/rabbitmq/index.js +237 -0
- package/dist/nosql/ravendb/index.js +175 -0
- package/dist/nosql/redis/index.js +607 -0
- package/dist/nosql/redpanda/index.js +237 -0
- package/dist/nosql/resque/index.js +203 -0
- package/dist/nosql/rethinkdb/index.js +232 -0
- package/dist/nosql/rocksdb/index.js +152 -0
- package/dist/nosql/rockset/index.js +126 -0
- package/dist/nosql/s3/index.js +298 -0
- package/dist/nosql/scylladb/index.js +178 -0
- package/dist/nosql/signoz/index.js +227 -0
- package/dist/nosql/sns/index.js +201 -0
- package/dist/nosql/solr/index.js +231 -0
- package/dist/nosql/splunk/index.js +227 -0
- package/dist/nosql/sqs/index.js +246 -0
- package/dist/nosql/stardog/index.js +169 -0
- package/dist/nosql/starrocks/index.js +170 -0
- package/dist/nosql/store.js +2 -0
- package/dist/nosql/sumologic/index.js +213 -0
- package/dist/nosql/surrealdb/index.js +179 -0
- package/dist/nosql/terminusdb/index.js +151 -0
- package/dist/nosql/tigergraph/index.js +469 -0
- package/dist/nosql/typesense/index.js +148 -0
- package/dist/nosql/unqlite/index.js +157 -0
- package/dist/nosql/upstash/index.js +167 -0
- package/dist/nosql/vercel-kv/index.js +166 -0
- package/dist/nosql/victoriametrics/index.js +213 -0
- package/dist/nosql/virtuoso/index.js +169 -0
- package/dist/nosql/weaviate/index.js +276 -0
- package/dist/operators/index.js +108 -0
- package/dist/operators.js +2690 -0
- package/dist/prisma-migrate/index.js +38 -0
- package/dist/prisma-migrate/migration-generator.js +125 -0
- package/dist/prisma-migrate/model-generator.js +172 -0
- package/dist/prisma-migrate/relations.js +100 -0
- package/dist/prisma-migrate/schema-parser.js +167 -0
- package/dist/prisma-migrate/type-mapper.js +40 -0
- package/dist/prorm.js +6832 -0
- package/dist/query-builders/cte-builder.js +80 -0
- package/dist/query-builders/functions/aggregate.js +390 -0
- package/dist/query-builders/functions/conditional.js +503 -0
- package/dist/query-builders/functions/datetime.js +695 -0
- package/dist/query-builders/functions/fulltext.js +439 -0
- package/dist/query-builders/functions/index.js +93 -0
- package/dist/query-builders/functions/json.js +427 -0
- package/dist/query-builders/functions/math.js +399 -0
- package/dist/query-builders/functions/string.js +518 -0
- package/dist/query-builders/functions/window.js +328 -0
- package/dist/query-builders/include-builder.js +323 -0
- package/dist/query-builders/index-expression-builder.js +242 -0
- package/dist/query-builders/index.js +161 -0
- package/dist/query-builders/insert-builder.js +164 -0
- package/dist/query-builders/model-helpers.js +38 -0
- package/dist/query-builders/order-limit-builder.js +239 -0
- package/dist/query-builders/sql-compiler.js +2040 -0
- package/dist/query-builders/subquery-builder.js +152 -0
- package/dist/query-builders/update-builder.js +182 -0
- package/dist/query-builders/view-builder.js +218 -0
- package/dist/query-builders/where-builder.js +1532 -0
- package/dist/query-interface.js +622 -0
- package/dist/query-optimizers/batch-optimizer.js +426 -0
- package/dist/query-optimizers/explain-plans.js +415 -0
- package/dist/query-optimizers/index.js +51 -0
- package/dist/query-optimizers/prepared-statement-cache.js +423 -0
- package/dist/query-optimizers/query-hints.js +438 -0
- package/dist/query-optimizers/query-optimizer.js +278 -0
- package/dist/query-optimizers/slow-query-logger.js +271 -0
- package/dist/replica-manager.js +507 -0
- package/dist/schema/index.js +15 -0
- package/dist/schema/migration-generator.js +374 -0
- package/dist/schema/schema-differ.js +549 -0
- package/dist/schema/types.js +6 -0
- package/dist/sql-constants.js +300 -0
- package/dist/sqlite-advanced.js +1047 -0
- package/dist/streams/index.js +12 -0
- package/dist/streams/transforms.js +178 -0
- package/dist/transaction.js +456 -0
- package/dist/types/index.js +180 -0
- package/dist/user-management.js +127 -0
- package/dist/utils/date.js +300 -0
- package/dist/utils/index.js +1079 -0
- package/dist/utils/string.js +161 -0
- package/dist/validators/index.js +19 -0
- package/dist/validators/validator.js +911 -0
- package/package.json +190 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NATS store implementation.
|
|
4
|
+
*
|
|
5
|
+
* NATS is a lightweight publish/subscribe and request/reply messaging system.
|
|
6
|
+
* Its JetStream layer adds persistence, including a key/value (KV) store built
|
|
7
|
+
* on top of streams. NATS has no query language and does not fit the
|
|
8
|
+
* SQL-shaped `Dialect` interface, so this class implements the minimal
|
|
9
|
+
* `NoSqlStore` marker interface and exposes NATS's real operations
|
|
10
|
+
* (core pub/sub, request/reply, and JetStream KV) instead of forcing
|
|
11
|
+
* everything into a `query(sql)` shape.
|
|
12
|
+
*
|
|
13
|
+
* Uses the `nats` driver (`nats.js`). The driver is lazy-loaded inside
|
|
14
|
+
* `connect()` via `require('nats')` so that importing this module never
|
|
15
|
+
* pulls in the driver unless a connection is actually opened; tests inject a
|
|
16
|
+
* pre-built connection through the `client` option and never touch the real
|
|
17
|
+
* driver or the network.
|
|
18
|
+
*
|
|
19
|
+
* Encoding: NATS messages are byte payloads (`Uint8Array`). `publish()` and
|
|
20
|
+
* `request()` accept either a `string` (UTF-8 encoded via `TextEncoder`) or a
|
|
21
|
+
* `Uint8Array` (passed through unchanged). `subscribe()` handlers and
|
|
22
|
+
* `request()` replies deliver the raw `Uint8Array` payload; decode with
|
|
23
|
+
* `TextDecoder` (or the message's own `.string()`/`.json()` helpers when using
|
|
24
|
+
* the real driver) as needed. JetStream KV values are encoded the same way on
|
|
25
|
+
* write, and `kvGet()` returns the entry's raw `Uint8Array` value (or `null`
|
|
26
|
+
* when the key is absent).
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.NatsStore = void 0;
|
|
30
|
+
const errors_1 = require("../../errors");
|
|
31
|
+
const textEncoder = new TextEncoder();
|
|
32
|
+
/** Encode a string/`Uint8Array` payload into the `Uint8Array` the driver expects. */
|
|
33
|
+
function encode(data) {
|
|
34
|
+
return typeof data === 'string' ? textEncoder.encode(data) : data;
|
|
35
|
+
}
|
|
36
|
+
function wrapConnectionError(err, servers) {
|
|
37
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
38
|
+
const host = Array.isArray(servers) ? servers.join(',') : servers;
|
|
39
|
+
return new errors_1.ConnectionError(`Unable to connect to NATS: ${parent.message}`, {
|
|
40
|
+
parent,
|
|
41
|
+
database: 'nats',
|
|
42
|
+
host,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function wrapDatabaseError(err, message) {
|
|
46
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
47
|
+
const combined = message ? `${message}: ${parent.message}` : parent.message;
|
|
48
|
+
return errors_1.DatabaseError.from(parent, { message: combined });
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* `NatsStore` wraps a `nats` `NatsConnection` and exposes NATS's core
|
|
52
|
+
* publish/subscribe and request/reply operations plus JetStream KV
|
|
53
|
+
* (`kvPut`/`kvGet`/`kvDelete`) as a typed, promise-based API.
|
|
54
|
+
*/
|
|
55
|
+
class NatsStore {
|
|
56
|
+
constructor(options = {}) {
|
|
57
|
+
this.name = 'nats';
|
|
58
|
+
this.library = 'nats';
|
|
59
|
+
this.connection = null;
|
|
60
|
+
this.connected = false;
|
|
61
|
+
/** Cached JetStream KV bucket views, keyed by bucket name. */
|
|
62
|
+
this.kvCache = new Map();
|
|
63
|
+
this.options = options;
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------
|
|
66
|
+
// Connection lifecycle
|
|
67
|
+
// ---------------------------------------------------------------------
|
|
68
|
+
async connect() {
|
|
69
|
+
if (this.connected && this.connection) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
if (this.options.client) {
|
|
74
|
+
// A pre-built connection was injected (used by tests and by callers
|
|
75
|
+
// that manage the connection themselves); adopt it and skip the
|
|
76
|
+
// driver require entirely.
|
|
77
|
+
this.connection = this.options.client;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Lazy-load the optional `nats` driver only when actually opening a
|
|
81
|
+
// real connection, so importing this module never requires it.
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
83
|
+
const nats = require('nats');
|
|
84
|
+
this.connection = (await nats.connect({
|
|
85
|
+
servers: this.options.servers,
|
|
86
|
+
token: this.options.token,
|
|
87
|
+
user: this.options.user,
|
|
88
|
+
pass: this.options.pass,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
this.connected = true;
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
this.connection = null;
|
|
95
|
+
this.connected = false;
|
|
96
|
+
throw wrapConnectionError(err, this.options.servers);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async disconnect() {
|
|
100
|
+
if (this.connection) {
|
|
101
|
+
try {
|
|
102
|
+
// Prefer a graceful drain (flushes pending messages and unsubscribes)
|
|
103
|
+
// and fall back to a hard close if the connection doesn't support it.
|
|
104
|
+
if (typeof this.connection.drain === 'function') {
|
|
105
|
+
await this.connection.drain();
|
|
106
|
+
}
|
|
107
|
+
else if (typeof this.connection.close === 'function') {
|
|
108
|
+
await this.connection.close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
try {
|
|
113
|
+
await this.connection.close?.();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Ignore secondary teardown failures - we're discarding the
|
|
117
|
+
// connection regardless.
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
this.connection = null;
|
|
121
|
+
}
|
|
122
|
+
this.kvCache.clear();
|
|
123
|
+
this.connected = false;
|
|
124
|
+
}
|
|
125
|
+
isConnected() {
|
|
126
|
+
return this.connected && this.connection !== null;
|
|
127
|
+
}
|
|
128
|
+
/** Returns the underlying `nats` connection for anything not wrapped here. */
|
|
129
|
+
getClient() {
|
|
130
|
+
return this.requireConnection();
|
|
131
|
+
}
|
|
132
|
+
requireConnection() {
|
|
133
|
+
if (!this.connection) {
|
|
134
|
+
throw new errors_1.ConnectionError('Not connected to NATS', { database: 'nats' });
|
|
135
|
+
}
|
|
136
|
+
return this.connection;
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------
|
|
139
|
+
// Core pub/sub + request/reply
|
|
140
|
+
// ---------------------------------------------------------------------
|
|
141
|
+
/**
|
|
142
|
+
* Publish `data` to `subject`. The payload is encoded per the module's
|
|
143
|
+
* encoding rules (string → UTF-8, `Uint8Array` → as-is).
|
|
144
|
+
*/
|
|
145
|
+
publish(subject, data) {
|
|
146
|
+
const connection = this.requireConnection();
|
|
147
|
+
try {
|
|
148
|
+
connection.publish(subject, encode(data));
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
throw wrapDatabaseError(err, `NATS publish to "${subject}" failed`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Subscribe to `subject`, invoking `handler` for each message via the
|
|
156
|
+
* driver's callback option (`subscribe(subject, { callback })`). Returns the
|
|
157
|
+
* driver's `Subscription` (call `.unsubscribe()` / `.drain()` on it to stop).
|
|
158
|
+
* The callback style is chosen over the async-iterator style so a handler
|
|
159
|
+
* can be registered without spawning a consuming loop.
|
|
160
|
+
*/
|
|
161
|
+
subscribe(subject, handler) {
|
|
162
|
+
const connection = this.requireConnection();
|
|
163
|
+
try {
|
|
164
|
+
return connection.subscribe(subject, { callback: handler });
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
throw wrapDatabaseError(err, `NATS subscribe to "${subject}" failed`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Send a request to `subject` and await a single reply. `opts` is passed
|
|
172
|
+
* straight through to the driver (e.g. `{ timeout }`). Resolves with the
|
|
173
|
+
* driver's reply `Msg`; read `.data` / `.string()` / `.json()` off it.
|
|
174
|
+
*/
|
|
175
|
+
async request(subject, data, opts) {
|
|
176
|
+
const connection = this.requireConnection();
|
|
177
|
+
try {
|
|
178
|
+
return await connection.request(subject, encode(data), opts);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
throw wrapDatabaseError(err, `NATS request to "${subject}" failed`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ---------------------------------------------------------------------
|
|
185
|
+
// JetStream KV
|
|
186
|
+
// ---------------------------------------------------------------------
|
|
187
|
+
/**
|
|
188
|
+
* Lazily resolve (and cache) the JetStream KV bucket view for `bucket` via
|
|
189
|
+
* `connection.jetstream().views.kv(bucket)`. Subsequent calls for the same
|
|
190
|
+
* bucket return the cached view.
|
|
191
|
+
*/
|
|
192
|
+
async kv(bucket) {
|
|
193
|
+
const cached = this.kvCache.get(bucket);
|
|
194
|
+
if (cached) {
|
|
195
|
+
return cached;
|
|
196
|
+
}
|
|
197
|
+
const connection = this.requireConnection();
|
|
198
|
+
try {
|
|
199
|
+
const view = await connection.jetstream().views.kv(bucket);
|
|
200
|
+
this.kvCache.set(bucket, view);
|
|
201
|
+
return view;
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
throw wrapDatabaseError(err, `NATS KV open bucket "${bucket}" failed`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Put `value` at `key` in `bucket`'s KV store (encoded per the module's
|
|
209
|
+
* encoding rules). Returns the revision number assigned by JetStream.
|
|
210
|
+
*/
|
|
211
|
+
async kvPut(bucket, key, value) {
|
|
212
|
+
const view = await this.kv(bucket);
|
|
213
|
+
try {
|
|
214
|
+
return await view.put(key, encode(value));
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
throw wrapDatabaseError(err, `NATS KV put "${key}" in bucket "${bucket}" failed`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get the raw value stored at `key` in `bucket`, or `null` if the key is
|
|
222
|
+
* absent (or holds a deleted/purged entry). Returns the entry's
|
|
223
|
+
* `Uint8Array` value; decode with `TextDecoder` as needed.
|
|
224
|
+
*/
|
|
225
|
+
async kvGet(bucket, key) {
|
|
226
|
+
const view = await this.kv(bucket);
|
|
227
|
+
try {
|
|
228
|
+
const entry = await view.get(key);
|
|
229
|
+
return entry ? entry.value : null;
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
throw wrapDatabaseError(err, `NATS KV get "${key}" from bucket "${bucket}" failed`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** Delete `key` from `bucket`'s KV store. */
|
|
236
|
+
async kvDelete(bucket, key) {
|
|
237
|
+
const view = await this.kv(bucket);
|
|
238
|
+
try {
|
|
239
|
+
await view.delete(key);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
throw wrapDatabaseError(err, `NATS KV delete "${key}" from bucket "${bucket}" failed`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.NatsStore = NatsStore;
|
|
247
|
+
exports.default = NatsStore;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NedbStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* NeDB store.
|
|
6
|
+
*
|
|
7
|
+
* NeDB is an embedded, in-process document database with a MongoDB-like API,
|
|
8
|
+
* backed by an append-only file (or purely in-memory). It stores documents
|
|
9
|
+
* addressed by an `_id` field and exposes `insert`/`findOne`/`find`/`remove`.
|
|
10
|
+
* It has no SQL-shaped surface, so it does not fit the `Dialect` interface
|
|
11
|
+
* used by the SQL dialects in this repo. Instead it implements the minimal
|
|
12
|
+
* `NoSqlStore` marker interface (`src/nosql/store.ts`) and maps a common
|
|
13
|
+
* key-value surface (`put`/`get`/`del` on `_id`) onto NeDB's document API,
|
|
14
|
+
* alongside the native `insert`/`find`.
|
|
15
|
+
*
|
|
16
|
+
* Built on the `nedb` npm driver (callback-based), loaded lazily inside
|
|
17
|
+
* `connect()` (via `require`) so importing this module never forces the driver
|
|
18
|
+
* to be installed; tests inject a pre-built mock `client` instead and never
|
|
19
|
+
* reach the `require`.
|
|
20
|
+
*/
|
|
21
|
+
const errors_1 = require("../../errors");
|
|
22
|
+
/**
|
|
23
|
+
* `NedbStore` wraps a `nedb` `Datastore` and exposes both a common KV surface
|
|
24
|
+
* — `put`/`get`/`del` keyed on `_id`, `batch`, `list` — and NeDB's native
|
|
25
|
+
* document operations `insert`/`find`.
|
|
26
|
+
*/
|
|
27
|
+
class NedbStore {
|
|
28
|
+
constructor(options = {}) {
|
|
29
|
+
this.name = 'nedb';
|
|
30
|
+
this.library = 'nedb';
|
|
31
|
+
this.client = null;
|
|
32
|
+
this.connected = false;
|
|
33
|
+
this.options = options;
|
|
34
|
+
}
|
|
35
|
+
async connect() {
|
|
36
|
+
if (this.connected && this.client) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
if (this.options.client) {
|
|
41
|
+
this.client = this.options.client;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
45
|
+
const Datastore = require('nedb');
|
|
46
|
+
this.client = new Datastore(this.options.filename
|
|
47
|
+
? { filename: this.options.filename, autoload: true }
|
|
48
|
+
: {});
|
|
49
|
+
}
|
|
50
|
+
this.connected = true;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
this.client = null;
|
|
54
|
+
this.connected = false;
|
|
55
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
56
|
+
throw new errors_1.ConnectionError(`Unable to open NeDB: ${parent.message}`, {
|
|
57
|
+
parent,
|
|
58
|
+
database: 'nedb',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async disconnect() {
|
|
63
|
+
// NeDB has no explicit close; drop the reference so the store reports
|
|
64
|
+
// disconnected and callers can't keep using it.
|
|
65
|
+
this.client = null;
|
|
66
|
+
this.connected = false;
|
|
67
|
+
}
|
|
68
|
+
isConnected() {
|
|
69
|
+
return this.connected && this.client !== null;
|
|
70
|
+
}
|
|
71
|
+
/** Returns the underlying `nedb` `Datastore` for anything not wrapped here. */
|
|
72
|
+
getClient() {
|
|
73
|
+
return this.requireClient();
|
|
74
|
+
}
|
|
75
|
+
requireClient() {
|
|
76
|
+
if (!this.client || !this.connected) {
|
|
77
|
+
throw new errors_1.ConnectionError('NeDB datastore is not connected. Call connect() first.', {
|
|
78
|
+
database: 'nedb',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return this.client;
|
|
82
|
+
}
|
|
83
|
+
wrapError(action, err) {
|
|
84
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
85
|
+
return errors_1.DatabaseError.from(parent, { message: `NeDB ${action} failed: ${parent.message}` });
|
|
86
|
+
}
|
|
87
|
+
/** Wrap a callback-style NeDB call into a Promise. */
|
|
88
|
+
promisify(fn) {
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
fn((err, result) => (err ? reject(err) : resolve(result)));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Writes a document keyed by `_id = key`. Maps onto NeDB's `insert`, merging
|
|
95
|
+
* `key` into the document as its `_id`.
|
|
96
|
+
*/
|
|
97
|
+
async put(key, value) {
|
|
98
|
+
const client = this.requireClient();
|
|
99
|
+
try {
|
|
100
|
+
return await this.promisify((cb) => client.insert({ _id: key, ...value }, cb));
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
throw this.wrapError('put', err);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Reads a document by `_id` (NeDB `findOne({ _id })`). Returns `null` if absent. */
|
|
107
|
+
async get(key) {
|
|
108
|
+
const client = this.requireClient();
|
|
109
|
+
try {
|
|
110
|
+
return await this.promisify((cb) => client.findOne({ _id: key }, cb));
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
throw this.wrapError('get', err);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Deletes a document by `_id` (NeDB `remove({ _id })`). Returns the number removed. */
|
|
117
|
+
async del(key) {
|
|
118
|
+
const client = this.requireClient();
|
|
119
|
+
try {
|
|
120
|
+
return await this.promisify((cb) => client.remove({ _id: key }, {}, cb));
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
throw this.wrapError('del', err);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Native `insert`: adds a document (NeDB assigns an `_id` if omitted). */
|
|
127
|
+
async insert(doc) {
|
|
128
|
+
const client = this.requireClient();
|
|
129
|
+
try {
|
|
130
|
+
return await this.promisify((cb) => client.insert(doc, cb));
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
throw this.wrapError('insert', err);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Native `find`: returns every document matching the Mongo-style `query`. */
|
|
137
|
+
async find(query = {}) {
|
|
138
|
+
const client = this.requireClient();
|
|
139
|
+
try {
|
|
140
|
+
return await this.promisify((cb) => client.find(query, cb));
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
throw this.wrapError('find', err);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Applies a list of `put`/`del` operations sequentially. */
|
|
147
|
+
async batch(ops) {
|
|
148
|
+
for (const op of ops) {
|
|
149
|
+
if (op.type === 'put') {
|
|
150
|
+
await this.put(op.key, op.value);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
await this.del(op.key);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Lists all document `_id`s (via `find({})`). */
|
|
158
|
+
async list() {
|
|
159
|
+
const docs = await this.find({});
|
|
160
|
+
return docs.map((doc) => String(doc._id));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.NedbStore = NedbStore;
|
|
164
|
+
exports.default = NedbStore;
|