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,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqsStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Amazon SQS (Simple Queue Service) store.
|
|
6
|
+
*
|
|
7
|
+
* SQS is a managed, pull-based message queue. It has no query language and no
|
|
8
|
+
* SQL-shaped access pattern, so this store implements the minimal `NoSqlStore`
|
|
9
|
+
* marker interface (`src/nosql/store.ts`) and exposes SQS's real operations:
|
|
10
|
+
* sending a message to a queue (`publish`), a long-poll receive loop that
|
|
11
|
+
* delivers messages to a handler and deletes (acks) them afterward
|
|
12
|
+
* (`subscribe`), and queue administration (`createQueue`).
|
|
13
|
+
*
|
|
14
|
+
* Built on AWS SDK v3 (`@aws-sdk/client-sqs`): an `SQSClient` speaks the wire
|
|
15
|
+
* protocol via the command pattern — you build a command object
|
|
16
|
+
* (`new SendMessageCommand(input)`) and hand it to `client.send(command)`. The
|
|
17
|
+
* SDK is loaded lazily inside `connect()` (via `require`) so importing this
|
|
18
|
+
* module never hard-requires the driver, and tests inject a mock `client`
|
|
19
|
+
* (with a `send(command)` method) so no real SDK or network is used.
|
|
20
|
+
*
|
|
21
|
+
* Message encoding: `publish()` accepts a `string` (sent as-is), a `Buffer`
|
|
22
|
+
* (decoded to UTF-8), or any other JSON-serializable value (`JSON.stringify`d).
|
|
23
|
+
* The result becomes the message body (SQS bodies are strings).
|
|
24
|
+
*/
|
|
25
|
+
const errors_1 = require("../../errors");
|
|
26
|
+
/** Encode a message into the string body SQS carries. */
|
|
27
|
+
function toBody(message) {
|
|
28
|
+
if (typeof message === 'string')
|
|
29
|
+
return message;
|
|
30
|
+
if (Buffer.isBuffer(message))
|
|
31
|
+
return message.toString('utf8');
|
|
32
|
+
return JSON.stringify(message);
|
|
33
|
+
}
|
|
34
|
+
function sleep(ms) {
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
const timer = setTimeout(resolve, ms);
|
|
37
|
+
// Don't let a pending poll-interval timer keep the process alive.
|
|
38
|
+
timer.unref?.();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* `SqsStore` wraps an AWS v3 `SQSClient` and exposes queue sending, a
|
|
43
|
+
* receive-and-ack poll loop, and queue administration.
|
|
44
|
+
*/
|
|
45
|
+
class SqsStore {
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
this.name = 'sqs';
|
|
48
|
+
this.library = '@aws-sdk/client-sqs';
|
|
49
|
+
this.client = null;
|
|
50
|
+
this.aws = null;
|
|
51
|
+
this.connected = false;
|
|
52
|
+
/** Active subscriptions, tracked so `disconnect()` stops their receive loops. */
|
|
53
|
+
this.subscriptions = new Set();
|
|
54
|
+
this.options = options;
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------
|
|
57
|
+
// Lifecycle
|
|
58
|
+
// ---------------------------------------------------------------------
|
|
59
|
+
async connect() {
|
|
60
|
+
try {
|
|
61
|
+
if (this.options.client) {
|
|
62
|
+
this.client = this.options.client;
|
|
63
|
+
this.tryLoadSdk();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const aws = require('@aws-sdk/client-sqs');
|
|
67
|
+
this.aws = aws;
|
|
68
|
+
this.client = new aws.SQSClient({
|
|
69
|
+
region: this.options.region,
|
|
70
|
+
credentials: this.options.credentials,
|
|
71
|
+
endpoint: this.options.endpoint,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
this.connected = true;
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
this.connected = false;
|
|
78
|
+
this.client = null;
|
|
79
|
+
this.aws = null;
|
|
80
|
+
throw new errors_1.ConnectionError(`Failed to connect to SQS: ${err instanceof Error ? err.message : String(err)}`, { parent: err instanceof Error ? err : undefined, database: 'sqs' });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
tryLoadSdk() {
|
|
84
|
+
if (this.aws)
|
|
85
|
+
return;
|
|
86
|
+
try {
|
|
87
|
+
this.aws = require('@aws-sdk/client-sqs');
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
this.aws = null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async disconnect() {
|
|
94
|
+
for (const sub of this.subscriptions) {
|
|
95
|
+
try {
|
|
96
|
+
sub.stop();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Best-effort teardown.
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
this.subscriptions.clear();
|
|
103
|
+
try {
|
|
104
|
+
this.client?.destroy?.();
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
this.client = null;
|
|
108
|
+
this.aws = null;
|
|
109
|
+
this.connected = false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
isConnected() {
|
|
113
|
+
return this.connected && this.client !== null;
|
|
114
|
+
}
|
|
115
|
+
/** Returns the underlying `SQSClient` (loosely typed) for anything not wrapped here. */
|
|
116
|
+
getClient() {
|
|
117
|
+
return this.requireClient();
|
|
118
|
+
}
|
|
119
|
+
requireClient() {
|
|
120
|
+
if (!this.client || !this.connected) {
|
|
121
|
+
throw new errors_1.ConnectionError('SQS client is not connected. Call connect() first.', {
|
|
122
|
+
database: 'sqs',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return this.client;
|
|
126
|
+
}
|
|
127
|
+
command(name, input) {
|
|
128
|
+
if (!this.aws)
|
|
129
|
+
this.tryLoadSdk();
|
|
130
|
+
const Ctor = this.aws?.[name];
|
|
131
|
+
if (typeof Ctor !== 'function') {
|
|
132
|
+
throw new errors_1.ConnectionError(`SQS command '${name}' is unavailable: '@aws-sdk/client-sqs' could not be loaded.`, { database: 'sqs' });
|
|
133
|
+
}
|
|
134
|
+
return new Ctor(input);
|
|
135
|
+
}
|
|
136
|
+
wrapError(action, err) {
|
|
137
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
138
|
+
const name = parent.name ? ` (${parent.name})` : '';
|
|
139
|
+
return new errors_1.DatabaseError(`SQS ${action} failed${name}: ${parent.message}`, {
|
|
140
|
+
parent,
|
|
141
|
+
original: parent.message,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// ---------------------------------------------------------------------
|
|
145
|
+
// Producing
|
|
146
|
+
// ---------------------------------------------------------------------
|
|
147
|
+
/**
|
|
148
|
+
* `SendMessage` — publish one `message` to the queue at `queueUrl`. The
|
|
149
|
+
* message is encoded to a string body (string as-is, Buffer → UTF-8, else
|
|
150
|
+
* JSON). Returns the message id (and FIFO sequence number, if any).
|
|
151
|
+
*/
|
|
152
|
+
async publish(queueUrl, message, options = {}) {
|
|
153
|
+
const client = this.requireClient();
|
|
154
|
+
try {
|
|
155
|
+
const result = await client.send(this.command('SendMessageCommand', {
|
|
156
|
+
QueueUrl: queueUrl,
|
|
157
|
+
MessageBody: toBody(message),
|
|
158
|
+
DelaySeconds: options.delaySeconds,
|
|
159
|
+
MessageGroupId: options.messageGroupId,
|
|
160
|
+
MessageDeduplicationId: options.messageDeduplicationId,
|
|
161
|
+
MessageAttributes: options.messageAttributes,
|
|
162
|
+
}));
|
|
163
|
+
return { messageId: result?.MessageId, sequenceNumber: result?.SequenceNumber };
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
throw this.wrapError(`SendMessage to '${queueUrl}'`, err);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------
|
|
170
|
+
// Queue administration
|
|
171
|
+
// ---------------------------------------------------------------------
|
|
172
|
+
/** `CreateQueue` — create a queue by name. Returns its URL. */
|
|
173
|
+
async createQueue(name, options = {}) {
|
|
174
|
+
const client = this.requireClient();
|
|
175
|
+
try {
|
|
176
|
+
const result = await client.send(this.command('CreateQueueCommand', {
|
|
177
|
+
QueueName: name,
|
|
178
|
+
Attributes: options.attributes,
|
|
179
|
+
tags: options.tags,
|
|
180
|
+
}));
|
|
181
|
+
return result?.QueueUrl;
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
throw this.wrapError(`CreateQueue '${name}'`, err);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Alias for `createQueue()`, matching the common store surface. */
|
|
188
|
+
createTopic(name, options = {}) {
|
|
189
|
+
return this.createQueue(name, options);
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------
|
|
192
|
+
// Consuming
|
|
193
|
+
// ---------------------------------------------------------------------
|
|
194
|
+
/**
|
|
195
|
+
* Subscribe to the queue at `queueUrl`: long-poll `ReceiveMessage` in a loop,
|
|
196
|
+
* invoke `handler` once per message, and (by default) `DeleteMessage` to ack
|
|
197
|
+
* each message after the handler resolves. Returns a subscription whose
|
|
198
|
+
* `stop()` ends the loop; the subscription is tracked so `disconnect()` stops
|
|
199
|
+
* it. The loop runs detached (not awaited); this method resolves immediately.
|
|
200
|
+
*/
|
|
201
|
+
subscribe(queueUrl, handler, options = {}) {
|
|
202
|
+
const client = this.requireClient();
|
|
203
|
+
const autoDelete = options.autoDelete ?? true;
|
|
204
|
+
const pollIntervalMs = options.pollIntervalMs ?? 0;
|
|
205
|
+
let stopped = false;
|
|
206
|
+
const subscription = {
|
|
207
|
+
stop: () => {
|
|
208
|
+
stopped = true;
|
|
209
|
+
this.subscriptions.delete(subscription);
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
this.subscriptions.add(subscription);
|
|
213
|
+
const loop = async () => {
|
|
214
|
+
while (!stopped) {
|
|
215
|
+
const result = await client.send(this.command('ReceiveMessageCommand', {
|
|
216
|
+
QueueUrl: queueUrl,
|
|
217
|
+
MaxNumberOfMessages: options.maxMessages ?? 10,
|
|
218
|
+
WaitTimeSeconds: options.waitTimeSeconds ?? 20,
|
|
219
|
+
VisibilityTimeout: options.visibilityTimeout,
|
|
220
|
+
}));
|
|
221
|
+
const messages = result?.Messages ?? [];
|
|
222
|
+
for (const message of messages) {
|
|
223
|
+
if (stopped)
|
|
224
|
+
break;
|
|
225
|
+
await handler(message);
|
|
226
|
+
if (autoDelete && message?.ReceiptHandle) {
|
|
227
|
+
await client.send(this.command('DeleteMessageCommand', {
|
|
228
|
+
QueueUrl: queueUrl,
|
|
229
|
+
ReceiptHandle: message.ReceiptHandle,
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (stopped)
|
|
234
|
+
break;
|
|
235
|
+
if (pollIntervalMs > 0)
|
|
236
|
+
await sleep(pollIntervalMs);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
loop().catch(() => {
|
|
240
|
+
/* swallow — best-effort background polling */
|
|
241
|
+
});
|
|
242
|
+
return subscription;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.SqsStore = SqsStore;
|
|
246
|
+
exports.default = SqsStore;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Stardog store implementation.
|
|
4
|
+
*
|
|
5
|
+
* Stardog is an enterprise knowledge-graph / RDF triplestore. It speaks the
|
|
6
|
+
* SPARQL 1.1 Protocol over HTTP: a database exposes a query endpoint
|
|
7
|
+
* (`/<db>/query`) and an update endpoint (`/<db>/update`). There is no
|
|
8
|
+
* SQL-shaped surface, so it implements the minimal `NoSqlStore` marker
|
|
9
|
+
* interface (`src/nosql/store.ts`) rather than the SQL `Dialect` interface.
|
|
10
|
+
*
|
|
11
|
+
* ## Driver strategy - prefer HTTP over `fetch`
|
|
12
|
+
*
|
|
13
|
+
* Stardog publishes a `stardog` npm client, but this store prefers the plain
|
|
14
|
+
* SPARQL/HTTP protocol over the global `fetch` so it has no hard dependency
|
|
15
|
+
* (`library='fetch'`). For tests (and for callers who want their own
|
|
16
|
+
* transport) an alternative client can be injected via
|
|
17
|
+
* `StardogStoreOptions.client`; when omitted, a tiny internal client over
|
|
18
|
+
* `fetch` + `endpoint` is built at connect time.
|
|
19
|
+
*
|
|
20
|
+
* ## Surface
|
|
21
|
+
*
|
|
22
|
+
* - `query(sparql)` -> POST to `/<db>/query`, returns bindings
|
|
23
|
+
* - `update(sparql)` -> POST to `/<db>/update`
|
|
24
|
+
* - `ask(sparql)` -> POST an ASK query, returns the boolean
|
|
25
|
+
* - `add(triples)` -> `INSERT DATA { ... }` update
|
|
26
|
+
* - `drop(graph?)` -> `DROP GRAPH <g>` / `DROP ALL` update
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.StardogStore = exports.DEFAULT_STARDOG_DATABASE = exports.DEFAULT_STARDOG_ENDPOINT = void 0;
|
|
30
|
+
exports.createFetchClient = createFetchClient;
|
|
31
|
+
const errors_1 = require("../../errors");
|
|
32
|
+
/** Default Stardog base URL. */
|
|
33
|
+
exports.DEFAULT_STARDOG_ENDPOINT = 'http://localhost:5820';
|
|
34
|
+
/** Default database name. */
|
|
35
|
+
exports.DEFAULT_STARDOG_DATABASE = 'db';
|
|
36
|
+
/** Build a `fetch`-backed SPARQL client for the given endpoint. */
|
|
37
|
+
function createFetchClient(endpoint, headers) {
|
|
38
|
+
const base = endpoint.endsWith('/') ? endpoint : `${endpoint}/`;
|
|
39
|
+
const buildUrl = (path) => new URL(path.replace(/^\//, ''), base).toString();
|
|
40
|
+
return {
|
|
41
|
+
async query(path, sparql) {
|
|
42
|
+
const res = await fetch(buildUrl(path), {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: {
|
|
45
|
+
'Content-Type': 'application/sparql-query',
|
|
46
|
+
Accept: 'application/sparql-results+json',
|
|
47
|
+
...(headers ?? {}),
|
|
48
|
+
},
|
|
49
|
+
body: sparql,
|
|
50
|
+
});
|
|
51
|
+
if (!res.ok)
|
|
52
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
53
|
+
return res.json();
|
|
54
|
+
},
|
|
55
|
+
async update(path, sparql) {
|
|
56
|
+
const res = await fetch(buildUrl(path), {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: { 'Content-Type': 'application/sparql-update', ...(headers ?? {}) },
|
|
59
|
+
body: sparql,
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok)
|
|
62
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
63
|
+
const text = await res.text();
|
|
64
|
+
return text || undefined;
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* `StardogStore` wraps a Stardog database's SPARQL query/update endpoints
|
|
70
|
+
* behind the `NoSqlStore` lifecycle.
|
|
71
|
+
*/
|
|
72
|
+
class StardogStore {
|
|
73
|
+
constructor(options = {}) {
|
|
74
|
+
this.name = 'stardog';
|
|
75
|
+
this.library = 'fetch';
|
|
76
|
+
this.client = null;
|
|
77
|
+
this.connected = false;
|
|
78
|
+
this.endpoint = options.endpoint ?? exports.DEFAULT_STARDOG_ENDPOINT;
|
|
79
|
+
this.database = options.database ?? exports.DEFAULT_STARDOG_DATABASE;
|
|
80
|
+
this.injectedClient = options.client;
|
|
81
|
+
this.headers = options.headers;
|
|
82
|
+
}
|
|
83
|
+
/** SPARQL query endpoint path for the configured database. */
|
|
84
|
+
get queryPath() {
|
|
85
|
+
return `/${this.database}/query`;
|
|
86
|
+
}
|
|
87
|
+
/** SPARQL update endpoint path for the configured database. */
|
|
88
|
+
get updatePath() {
|
|
89
|
+
return `/${this.database}/update`;
|
|
90
|
+
}
|
|
91
|
+
// ---------------------------------------------------------------------
|
|
92
|
+
// Connection lifecycle
|
|
93
|
+
// ---------------------------------------------------------------------
|
|
94
|
+
async connect() {
|
|
95
|
+
if (this.connected && this.client)
|
|
96
|
+
return;
|
|
97
|
+
this.client = this.injectedClient ?? createFetchClient(this.endpoint, this.headers);
|
|
98
|
+
this.connected = true;
|
|
99
|
+
}
|
|
100
|
+
async disconnect() {
|
|
101
|
+
this.client = null;
|
|
102
|
+
this.connected = false;
|
|
103
|
+
}
|
|
104
|
+
isConnected() {
|
|
105
|
+
return this.connected && this.client !== null;
|
|
106
|
+
}
|
|
107
|
+
/** Returns the underlying (internal or injected) SPARQL HTTP client. */
|
|
108
|
+
getClient() {
|
|
109
|
+
return this.requireClient();
|
|
110
|
+
}
|
|
111
|
+
requireClient() {
|
|
112
|
+
if (!this.client) {
|
|
113
|
+
throw new errors_1.ConnectionError('Not connected to Stardog', {
|
|
114
|
+
database: 'stardog',
|
|
115
|
+
host: this.endpoint,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return this.client;
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------
|
|
121
|
+
// SPARQL surface
|
|
122
|
+
// ---------------------------------------------------------------------
|
|
123
|
+
/** Runs a SPARQL SELECT/CONSTRUCT query; returns the result bindings. */
|
|
124
|
+
async query(sparql) {
|
|
125
|
+
const client = this.requireClient();
|
|
126
|
+
try {
|
|
127
|
+
const body = await client.query(this.queryPath, sparql);
|
|
128
|
+
return body?.results?.bindings ?? [];
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
132
|
+
throw errors_1.DatabaseError.from(parent, { message: `Stardog query failed: ${parent.message}`, sql: sparql });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Runs a SPARQL ASK query; returns the boolean answer. */
|
|
136
|
+
async ask(sparql) {
|
|
137
|
+
const client = this.requireClient();
|
|
138
|
+
try {
|
|
139
|
+
const body = await client.query(this.queryPath, sparql);
|
|
140
|
+
return Boolean(body?.boolean);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
144
|
+
throw errors_1.DatabaseError.from(parent, { message: `Stardog ask failed: ${parent.message}`, sql: sparql });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Runs a SPARQL UPDATE (INSERT/DELETE/DROP/...). */
|
|
148
|
+
async update(sparql) {
|
|
149
|
+
const client = this.requireClient();
|
|
150
|
+
try {
|
|
151
|
+
return await client.update(this.updatePath, sparql);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
155
|
+
throw errors_1.DatabaseError.from(parent, { message: `Stardog update failed: ${parent.message}`, sql: sparql });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Inserts triples via `INSERT DATA { ... }`. Accepts a triple string or array. */
|
|
159
|
+
async add(triples, graph) {
|
|
160
|
+
const body = Array.isArray(triples) ? triples.join('\n') : triples;
|
|
161
|
+
const inner = graph ? `GRAPH <${graph}> { ${body} }` : body;
|
|
162
|
+
return this.update(`INSERT DATA { ${inner} }`);
|
|
163
|
+
}
|
|
164
|
+
/** Drops a named graph, or all graphs when no graph is given. */
|
|
165
|
+
async drop(graph) {
|
|
166
|
+
return this.update(graph ? `DROP GRAPH <${graph}>` : 'DROP ALL');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.StardogStore = StardogStore;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* StarRocks store.
|
|
4
|
+
*
|
|
5
|
+
* StarRocks is a high-performance real-time analytical (MPP OLAP) database.
|
|
6
|
+
* Crucially it speaks the **MySQL wire protocol**, so it is queried with the
|
|
7
|
+
* `mysql2` driver over a normal MySQL connection/pool. Despite the MySQL
|
|
8
|
+
* wire, StarRocks is a columnar analytics engine (no OLTP transactions, no
|
|
9
|
+
* row-level UPDATE/DELETE in the usual sense on most table types), which does
|
|
10
|
+
* not fit this ORM's SQL `Dialect` abstraction cleanly, so it is modelled as
|
|
11
|
+
* a `NoSqlStore` (`src/nosql/store.ts`) exposing a direct `query`/`ingest`
|
|
12
|
+
* surface.
|
|
13
|
+
*
|
|
14
|
+
* ## Driver: `mysql2` (MySQL-wire)
|
|
15
|
+
*
|
|
16
|
+
* The `mysql2` package is an optional peer dependency, lazily `require`d
|
|
17
|
+
* inside `connect()` so importing this module never forces it to be
|
|
18
|
+
* installed. Tests inject a pre-built mock connection via
|
|
19
|
+
* `StarrocksStoreOptions.client`, which skips the `require` entirely.
|
|
20
|
+
*
|
|
21
|
+
* ## Ingestion
|
|
22
|
+
*
|
|
23
|
+
* `ingest()` here performs a batched `INSERT` over the MySQL wire, which is
|
|
24
|
+
* convenient for small/medium loads. For high-throughput loading StarRocks
|
|
25
|
+
* also offers **Stream Load** (an HTTP `PUT /api/{db}/{table}/_stream_load`
|
|
26
|
+
* endpoint). Stream Load is intentionally *not* wired here (it is a separate
|
|
27
|
+
* HTTP transport, optional); use the `mysql2`-based `ingest()` for wire-level
|
|
28
|
+
* inserts, or POST to the Stream Load endpoint yourself for bulk pipelines.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.StarrocksStore = void 0;
|
|
32
|
+
const errors_1 = require("../../errors");
|
|
33
|
+
/**
|
|
34
|
+
* `StarrocksStore` wraps a `mysql2` connection to a StarRocks frontend and
|
|
35
|
+
* exposes `query(sql, params)` for reads/DDL and `ingest(table, rows)` for
|
|
36
|
+
* batched wire-level inserts.
|
|
37
|
+
*/
|
|
38
|
+
class StarrocksStore {
|
|
39
|
+
constructor(options = {}) {
|
|
40
|
+
this.name = 'starrocks';
|
|
41
|
+
this.library = 'mysql2';
|
|
42
|
+
this.client = null;
|
|
43
|
+
this.connected = false;
|
|
44
|
+
this.options = options;
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------
|
|
47
|
+
// NoSqlStore lifecycle
|
|
48
|
+
// ---------------------------------------------------------------------
|
|
49
|
+
async connect() {
|
|
50
|
+
if (this.connected && this.client) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
let client = this.options.client;
|
|
55
|
+
if (!client) {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
57
|
+
const mysql = require('mysql2/promise');
|
|
58
|
+
client = (await mysql.createConnection({
|
|
59
|
+
host: this.options.host,
|
|
60
|
+
port: this.options.port,
|
|
61
|
+
user: this.options.user,
|
|
62
|
+
password: this.options.password,
|
|
63
|
+
database: this.options.database,
|
|
64
|
+
...this.options.connectionOptions,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
this.client = client;
|
|
68
|
+
this.connected = true;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
this.client = null;
|
|
72
|
+
this.connected = false;
|
|
73
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
74
|
+
throw new errors_1.ConnectionError(`Unable to connect to StarRocks: ${parent.message}`, {
|
|
75
|
+
parent,
|
|
76
|
+
database: 'starrocks',
|
|
77
|
+
host: this.options.host,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async disconnect() {
|
|
82
|
+
if (this.client) {
|
|
83
|
+
try {
|
|
84
|
+
await this.client.end?.();
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
this.client = null;
|
|
88
|
+
this.connected = false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.connected = false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
isConnected() {
|
|
96
|
+
return this.connected && this.client !== null;
|
|
97
|
+
}
|
|
98
|
+
/** Returns the underlying `mysql2` connection for anything not wrapped here. */
|
|
99
|
+
getClient() {
|
|
100
|
+
return this.requireClient();
|
|
101
|
+
}
|
|
102
|
+
requireClient() {
|
|
103
|
+
if (!this.client || !this.connected) {
|
|
104
|
+
throw new errors_1.ConnectionError('StarRocks client is not connected. Call connect() first.', {
|
|
105
|
+
database: 'starrocks',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return this.client;
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------
|
|
111
|
+
// Query + ingest
|
|
112
|
+
// ---------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Execute a SQL statement over the MySQL wire with optional positional
|
|
115
|
+
* `params` and return the result rows (the first element of `mysql2`'s
|
|
116
|
+
* `[rows, fields]` tuple).
|
|
117
|
+
*/
|
|
118
|
+
async query(sql, params) {
|
|
119
|
+
const client = this.requireClient();
|
|
120
|
+
try {
|
|
121
|
+
const [rows] = await client.query(sql, params);
|
|
122
|
+
return (rows ?? []);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
126
|
+
throw errors_1.DatabaseError.from(parent, {
|
|
127
|
+
message: `StarRocks query failed: ${parent.message}`,
|
|
128
|
+
sql,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Batch-insert `rows` into `table` via a single parameterized
|
|
134
|
+
* `INSERT INTO table (cols) VALUES (...)` over the MySQL wire. Columns are
|
|
135
|
+
* taken from the first row. Returns the driver result (`OkPacket`).
|
|
136
|
+
*
|
|
137
|
+
* For high-throughput bulk loading, use StarRocks Stream Load (HTTP) instead
|
|
138
|
+
* — see the module header.
|
|
139
|
+
*/
|
|
140
|
+
async ingest(table, rows) {
|
|
141
|
+
if (rows.length === 0) {
|
|
142
|
+
throw new errors_1.DatabaseError('ingest() requires at least one row', {
|
|
143
|
+
original: 'empty rows array',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const columns = Object.keys(rows[0]);
|
|
147
|
+
if (columns.length === 0) {
|
|
148
|
+
throw new errors_1.DatabaseError('ingest() requires at least one column', {
|
|
149
|
+
original: 'empty row object',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const values = rows.map((r) => columns.map((c) => r[c]));
|
|
153
|
+
const client = this.requireClient();
|
|
154
|
+
// mysql2 expands a single `?` bound to a nested array into a bulk VALUES list.
|
|
155
|
+
const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES ?`;
|
|
156
|
+
try {
|
|
157
|
+
const [result] = await client.query(sql, [values]);
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
162
|
+
throw errors_1.DatabaseError.from(parent, {
|
|
163
|
+
message: `StarRocks ingest failed: ${parent.message}`,
|
|
164
|
+
sql,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.StarrocksStore = StarrocksStore;
|
|
170
|
+
exports.default = StarrocksStore;
|