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,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gearman job-server store.
|
|
4
|
+
*
|
|
5
|
+
* Gearman is a generic application framework for farming out work: a *client*
|
|
6
|
+
* submits a job for a named function, the Gearman *job server* routes it to a
|
|
7
|
+
* *worker* that has registered a handler for that function, and the result
|
|
8
|
+
* flows back. It is not a database and does not fit the SQL-shaped `Dialect`
|
|
9
|
+
* interface, so this class implements the minimal `NoSqlStore` marker
|
|
10
|
+
* interface and exposes Gearman's real submit/register operations instead.
|
|
11
|
+
*
|
|
12
|
+
* Uses the `gearman` driver. It is an optional peer loaded lazily (via
|
|
13
|
+
* `require`) inside `connect()`, so importing this module does not require it
|
|
14
|
+
* to be installed unless you actually connect. A pre-built client can be
|
|
15
|
+
* injected via `GearmanStoreOptions.client`, in which case `connect()` adopts
|
|
16
|
+
* it and skips the `require` entirely (used by the unit tests to inject a
|
|
17
|
+
* mock).
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.GearmanStore = void 0;
|
|
21
|
+
const errors_1 = require("../../errors");
|
|
22
|
+
function wrapConnectionError(err) {
|
|
23
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
24
|
+
const message = /econnrefused/i.test(parent.message)
|
|
25
|
+
? 'Connection refused'
|
|
26
|
+
: `Unable to connect to Gearman: ${parent.message}`;
|
|
27
|
+
return new errors_1.ConnectionError(message, { parent, database: 'gearman' });
|
|
28
|
+
}
|
|
29
|
+
function wrapDatabaseError(err, action) {
|
|
30
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
31
|
+
return errors_1.DatabaseError.from(parent, { message: `Gearman ${action} failed: ${parent.message}` });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* `GearmanStore` wraps a single `gearman` client and exposes the common queue
|
|
35
|
+
* surface over Gearman functions: `enqueue()` submits a job, `process()`
|
|
36
|
+
* registers a worker handler, and job status/removal/stats route to the
|
|
37
|
+
* driver's corresponding calls.
|
|
38
|
+
*/
|
|
39
|
+
class GearmanStore {
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
this.name = 'gearman';
|
|
42
|
+
this.library = 'gearman';
|
|
43
|
+
this.client = null;
|
|
44
|
+
this.connected = false;
|
|
45
|
+
this.options = options;
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------
|
|
48
|
+
// Connection lifecycle
|
|
49
|
+
// ---------------------------------------------------------------------
|
|
50
|
+
async connect() {
|
|
51
|
+
if (this.connected && this.client) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
if (this.options.client != null) {
|
|
56
|
+
this.client = this.options.client;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
60
|
+
const gearman = require('gearman');
|
|
61
|
+
const host = this.options.host || '127.0.0.1';
|
|
62
|
+
const port = this.options.port || 4730;
|
|
63
|
+
this.client =
|
|
64
|
+
typeof gearman.createClient === 'function'
|
|
65
|
+
? gearman.createClient(port, host)
|
|
66
|
+
: new gearman.Client(port, host);
|
|
67
|
+
if (typeof this.client.connect === 'function') {
|
|
68
|
+
await this.client.connect();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.connected = true;
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
this.client = null;
|
|
75
|
+
this.connected = false;
|
|
76
|
+
throw wrapConnectionError(err);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async disconnect() {
|
|
80
|
+
try {
|
|
81
|
+
if (this.client) {
|
|
82
|
+
if (typeof this.client.close === 'function')
|
|
83
|
+
this.client.close();
|
|
84
|
+
else if (typeof this.client.disconnect === 'function')
|
|
85
|
+
this.client.disconnect();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore teardown errors.
|
|
90
|
+
}
|
|
91
|
+
this.client = null;
|
|
92
|
+
this.connected = false;
|
|
93
|
+
}
|
|
94
|
+
isConnected() {
|
|
95
|
+
return this.connected && this.client !== null;
|
|
96
|
+
}
|
|
97
|
+
/** Returns the underlying `gearman` client for operations not wrapped here. */
|
|
98
|
+
getClient() {
|
|
99
|
+
return this.requireClient();
|
|
100
|
+
}
|
|
101
|
+
requireClient() {
|
|
102
|
+
if (!this.client) {
|
|
103
|
+
throw new errors_1.ConnectionError('Not connected to Gearman', { database: 'gearman' });
|
|
104
|
+
}
|
|
105
|
+
return this.client;
|
|
106
|
+
}
|
|
107
|
+
async exec(fn, action) {
|
|
108
|
+
const client = this.requireClient();
|
|
109
|
+
try {
|
|
110
|
+
return await fn(client);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
throw wrapDatabaseError(err, action);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------
|
|
117
|
+
// Queue operations
|
|
118
|
+
// ---------------------------------------------------------------------
|
|
119
|
+
/**
|
|
120
|
+
* Submit a job for the named function (`queue`). The payload is
|
|
121
|
+
* JSON-serialized (strings pass through). Returns the job handle/id the
|
|
122
|
+
* server assigns (`job.handle` if the driver returns a job object).
|
|
123
|
+
*/
|
|
124
|
+
async enqueue(queue, jobData, opts = {}) {
|
|
125
|
+
return this.exec(async (client) => {
|
|
126
|
+
const payload = typeof jobData === 'string' ? jobData : JSON.stringify(jobData);
|
|
127
|
+
const job = await client.submitJob(queue, payload, opts);
|
|
128
|
+
if (job == null)
|
|
129
|
+
return '';
|
|
130
|
+
return typeof job === 'string' ? job : job.handle ?? job.id ?? '';
|
|
131
|
+
}, 'enqueue');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Register a worker handler for the named function (`queue`). The driver
|
|
135
|
+
* invokes `handler(job)` for each dispatched task. Falls back to
|
|
136
|
+
* `addFunction()` when the driver has no `registerWorker()`.
|
|
137
|
+
*/
|
|
138
|
+
async process(queue, handler) {
|
|
139
|
+
return this.exec((client) => {
|
|
140
|
+
if (typeof client.registerWorker === 'function') {
|
|
141
|
+
return client.registerWorker(queue, handler);
|
|
142
|
+
}
|
|
143
|
+
return client.addFunction(queue, handler);
|
|
144
|
+
}, 'process');
|
|
145
|
+
}
|
|
146
|
+
/** Query the status of a submitted job by its handle/id. */
|
|
147
|
+
async getJob(_queue, id) {
|
|
148
|
+
return this.exec((client) => client.getJobStatus(id), 'getJob');
|
|
149
|
+
}
|
|
150
|
+
/** Cancel/forget a submitted job by its handle/id. */
|
|
151
|
+
async remove(_queue, id) {
|
|
152
|
+
return this.exec((client) => client.removeJob(id), 'remove');
|
|
153
|
+
}
|
|
154
|
+
/** Return job-server status (registered functions, queued/running counts). */
|
|
155
|
+
async stats(_queue) {
|
|
156
|
+
return this.exec((client) => client.getStatus(), 'stats');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.GearmanStore = GearmanStore;
|
|
160
|
+
exports.default = GearmanStore;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Apache Geode store implementation.
|
|
4
|
+
*
|
|
5
|
+
* Apache Geode (the engine behind Pivotal/VMware GemFire) is a distributed
|
|
6
|
+
* in-memory data grid. Data lives in named *regions* (its distributed maps).
|
|
7
|
+
* There is no SQL-shaped `query(sql)` surface for key/value access, so this
|
|
8
|
+
* class implements the minimal `NoSqlStore` marker interface and exposes
|
|
9
|
+
* Geode's region operations (getMap/put/get/remove/keys/size) as a typed,
|
|
10
|
+
* promise-based API.
|
|
11
|
+
*
|
|
12
|
+
* ## Transport: the Geode Developer REST API over `fetch`
|
|
13
|
+
*
|
|
14
|
+
* Geode has no canonical Node.js driver; it ships a language-neutral
|
|
15
|
+
* "Developer REST API". This store talks to it with the global `fetch`
|
|
16
|
+
* (exactly like `PrometheusStore`), so `library` is `'fetch'`. For tests
|
|
17
|
+
* (and callers who want their own transport) an alternative client can be
|
|
18
|
+
* injected via `GeodeStoreOptions.client`; when omitted a tiny internal
|
|
19
|
+
* `fetch` client is built at connect time.
|
|
20
|
+
*
|
|
21
|
+
* Endpoints wrapped (all under `/geode/v1`):
|
|
22
|
+
* - `mapPut` -> `PUT /geode/v1/<region>/<key>`
|
|
23
|
+
* - `mapGet` -> `GET /geode/v1/<region>/<key>`
|
|
24
|
+
* - `mapRemove` -> `DELETE /geode/v1/<region>/<key>`
|
|
25
|
+
* - `mapKeys` -> `GET /geode/v1/<region>/keys`
|
|
26
|
+
* - `mapSize` -> derived from `mapKeys` (the Developer REST API exposes no
|
|
27
|
+
* direct size endpoint)
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.GeodeStore = exports.DEFAULT_GEODE_BASE_URL = void 0;
|
|
31
|
+
exports.createFetchClient = createFetchClient;
|
|
32
|
+
const errors_1 = require("../../errors");
|
|
33
|
+
/** Default Geode Developer REST API base URL. */
|
|
34
|
+
exports.DEFAULT_GEODE_BASE_URL = 'http://localhost:8080';
|
|
35
|
+
/** Build a `fetch`-backed REST client for the given base URL. */
|
|
36
|
+
function createFetchClient(baseURL, headers) {
|
|
37
|
+
const base = baseURL.endsWith('/') ? baseURL : `${baseURL}/`;
|
|
38
|
+
const buildUrl = (path) => new URL(path.startsWith('/') ? path.slice(1) : path, base).toString();
|
|
39
|
+
const parse = async (res) => {
|
|
40
|
+
const text = await res.text();
|
|
41
|
+
if (!text)
|
|
42
|
+
return null;
|
|
43
|
+
try {
|
|
44
|
+
return JSON.parse(text);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return text;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
async get(path) {
|
|
52
|
+
const res = await fetch(buildUrl(path), { method: 'GET', headers });
|
|
53
|
+
if (res.status === 404)
|
|
54
|
+
return null;
|
|
55
|
+
if (!res.ok)
|
|
56
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
57
|
+
return parse(res);
|
|
58
|
+
},
|
|
59
|
+
async put(path, body, contentType = 'application/json') {
|
|
60
|
+
const res = await fetch(buildUrl(path), {
|
|
61
|
+
method: 'PUT',
|
|
62
|
+
body,
|
|
63
|
+
headers: { ...(headers ?? {}), 'Content-Type': contentType },
|
|
64
|
+
});
|
|
65
|
+
if (!res.ok)
|
|
66
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
67
|
+
return parse(res);
|
|
68
|
+
},
|
|
69
|
+
async delete(path) {
|
|
70
|
+
const res = await fetch(buildUrl(path), { method: 'DELETE', headers });
|
|
71
|
+
if (res.status === 404)
|
|
72
|
+
return null;
|
|
73
|
+
if (!res.ok)
|
|
74
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
75
|
+
return parse(res);
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const enc = encodeURIComponent;
|
|
80
|
+
/**
|
|
81
|
+
* `GeodeStore` wraps Geode's Developer REST API behind the `NoSqlStore`
|
|
82
|
+
* lifecycle and exposes named-region key/value operations.
|
|
83
|
+
*/
|
|
84
|
+
class GeodeStore {
|
|
85
|
+
constructor(options = {}) {
|
|
86
|
+
this.name = 'geode';
|
|
87
|
+
this.library = 'fetch';
|
|
88
|
+
this.client = null;
|
|
89
|
+
this.connected = false;
|
|
90
|
+
/** Cached region handles, keyed by name so `getMap` is idempotent. */
|
|
91
|
+
this.regions = new Map();
|
|
92
|
+
this.baseURL = options.baseURL ?? exports.DEFAULT_GEODE_BASE_URL;
|
|
93
|
+
this.injectedClient = options.client;
|
|
94
|
+
this.headers = options.headers;
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------
|
|
97
|
+
// Connection lifecycle
|
|
98
|
+
// ---------------------------------------------------------------------
|
|
99
|
+
async connect() {
|
|
100
|
+
if (this.connected && this.client) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.client = this.injectedClient ?? createFetchClient(this.baseURL, this.headers);
|
|
104
|
+
this.connected = true;
|
|
105
|
+
}
|
|
106
|
+
async disconnect() {
|
|
107
|
+
this.client = null;
|
|
108
|
+
this.regions.clear();
|
|
109
|
+
this.connected = false;
|
|
110
|
+
}
|
|
111
|
+
isConnected() {
|
|
112
|
+
return this.connected && this.client !== null;
|
|
113
|
+
}
|
|
114
|
+
/** Returns the underlying (internal or injected) HTTP client. */
|
|
115
|
+
getClient() {
|
|
116
|
+
return this.requireClient();
|
|
117
|
+
}
|
|
118
|
+
requireClient() {
|
|
119
|
+
if (!this.client) {
|
|
120
|
+
throw new errors_1.ConnectionError('Not connected to Geode', {
|
|
121
|
+
database: 'geode',
|
|
122
|
+
host: this.baseURL,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return this.client;
|
|
126
|
+
}
|
|
127
|
+
wrap(err, action) {
|
|
128
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
129
|
+
return errors_1.DatabaseError.from(parent, { message: `Geode ${action} failed: ${parent.message}` });
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------
|
|
132
|
+
// Distributed region operations
|
|
133
|
+
// ---------------------------------------------------------------------
|
|
134
|
+
/** Resolve (and cache) a named-region handle. */
|
|
135
|
+
async getMap(name) {
|
|
136
|
+
this.requireClient();
|
|
137
|
+
let region = this.regions.get(name);
|
|
138
|
+
if (!region) {
|
|
139
|
+
region = { name };
|
|
140
|
+
this.regions.set(name, region);
|
|
141
|
+
}
|
|
142
|
+
return region;
|
|
143
|
+
}
|
|
144
|
+
/** Store `value` under `key` in `map` (`PUT /geode/v1/<region>/<key>`). */
|
|
145
|
+
async mapPut(map, key, value) {
|
|
146
|
+
const client = this.requireClient();
|
|
147
|
+
try {
|
|
148
|
+
await client.put(`/geode/v1/${enc(map.name)}/${enc(key)}`, JSON.stringify(value));
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
throw this.wrap(err, 'mapPut');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Read `key` from `map` (`GET /geode/v1/<region>/<key>`); `null` if absent. */
|
|
155
|
+
async mapGet(map, key) {
|
|
156
|
+
const client = this.requireClient();
|
|
157
|
+
try {
|
|
158
|
+
return await client.get(`/geode/v1/${enc(map.name)}/${enc(key)}`);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
throw this.wrap(err, 'mapGet');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Remove `key` from `map` (`DELETE /geode/v1/<region>/<key>`). */
|
|
165
|
+
async mapRemove(map, key) {
|
|
166
|
+
const client = this.requireClient();
|
|
167
|
+
try {
|
|
168
|
+
return await client.delete(`/geode/v1/${enc(map.name)}/${enc(key)}`);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
throw this.wrap(err, 'mapRemove');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** List all keys in `map` (`GET /geode/v1/<region>/keys`). */
|
|
175
|
+
async mapKeys(map) {
|
|
176
|
+
const client = this.requireClient();
|
|
177
|
+
try {
|
|
178
|
+
const body = await client.get(`/geode/v1/${enc(map.name)}/keys`);
|
|
179
|
+
// Geode replies `{ "keys": [...] }`; tolerate a bare array too.
|
|
180
|
+
if (Array.isArray(body))
|
|
181
|
+
return body;
|
|
182
|
+
if (body && Array.isArray(body.keys))
|
|
183
|
+
return body.keys;
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
throw this.wrap(err, 'mapKeys');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** Number of entries in `map` (derived from `mapKeys`). */
|
|
191
|
+
async mapSize(map) {
|
|
192
|
+
return (await this.mapKeys(map)).length;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.GeodeStore = GeodeStore;
|
|
196
|
+
exports.default = GeodeStore;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ontotext GraphDB store implementation.
|
|
4
|
+
*
|
|
5
|
+
* GraphDB is an RDF triplestore that speaks the SPARQL 1.1 Protocol over HTTP.
|
|
6
|
+
* A repository exposes a query endpoint (`/repositories/<repo>`) and an update
|
|
7
|
+
* endpoint (`/repositories/<repo>/statements`). There is no SQL-shaped surface
|
|
8
|
+
* (no rows, no DDL, no identifier escaping), so it implements the minimal
|
|
9
|
+
* `NoSqlStore` marker interface (`src/nosql/store.ts`) rather than the SQL
|
|
10
|
+
* `Dialect` interface.
|
|
11
|
+
*
|
|
12
|
+
* ## No canonical driver - HTTP over `fetch`
|
|
13
|
+
*
|
|
14
|
+
* GraphDB has no dedicated npm client; it is just a SPARQL/HTTP endpoint. This
|
|
15
|
+
* store talks to the server with the global `fetch`. For tests (and for
|
|
16
|
+
* callers who want their own transport) an alternative client can be injected
|
|
17
|
+
* via `GraphdbStoreOptions.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 `/repositories/<repo>`, returns bindings
|
|
23
|
+
* - `update(sparql)` -> POST to `/repositories/<repo>/statements`
|
|
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.GraphdbStore = exports.DEFAULT_GRAPHDB_REPOSITORY = exports.DEFAULT_GRAPHDB_ENDPOINT = void 0;
|
|
30
|
+
exports.createFetchClient = createFetchClient;
|
|
31
|
+
const errors_1 = require("../../errors");
|
|
32
|
+
/** Default GraphDB base URL. */
|
|
33
|
+
exports.DEFAULT_GRAPHDB_ENDPOINT = 'http://localhost:7200';
|
|
34
|
+
/** Default repository id. */
|
|
35
|
+
exports.DEFAULT_GRAPHDB_REPOSITORY = 'repo';
|
|
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
|
+
* `GraphdbStore` wraps a GraphDB repository's SPARQL query/update endpoints
|
|
70
|
+
* behind the `NoSqlStore` lifecycle.
|
|
71
|
+
*/
|
|
72
|
+
class GraphdbStore {
|
|
73
|
+
constructor(options = {}) {
|
|
74
|
+
this.name = 'graphdb';
|
|
75
|
+
this.library = 'fetch';
|
|
76
|
+
this.client = null;
|
|
77
|
+
this.connected = false;
|
|
78
|
+
this.endpoint = options.endpoint ?? exports.DEFAULT_GRAPHDB_ENDPOINT;
|
|
79
|
+
this.repository = options.repository ?? exports.DEFAULT_GRAPHDB_REPOSITORY;
|
|
80
|
+
this.injectedClient = options.client;
|
|
81
|
+
this.headers = options.headers;
|
|
82
|
+
}
|
|
83
|
+
/** SPARQL query endpoint path for the configured repository. */
|
|
84
|
+
get queryPath() {
|
|
85
|
+
return `/repositories/${this.repository}`;
|
|
86
|
+
}
|
|
87
|
+
/** SPARQL update endpoint path for the configured repository. */
|
|
88
|
+
get updatePath() {
|
|
89
|
+
return `/repositories/${this.repository}/statements`;
|
|
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 GraphDB', {
|
|
114
|
+
database: 'graphdb',
|
|
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: `GraphDB 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: `GraphDB 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: `GraphDB 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.GraphdbStore = GraphdbStore;
|