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,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Graylog store implementation.
|
|
4
|
+
*
|
|
5
|
+
* Graylog is a centralized log-management platform. Logs are ingested in the
|
|
6
|
+
* GELF (Graylog Extended Log Format) over an HTTP input, and searched via
|
|
7
|
+
* the REST universal search API. There is no SQL-shaped query surface, no
|
|
8
|
+
* row-level UPDATE/DELETE, and no identifier escaping, so Graylog does not
|
|
9
|
+
* fit the SQL `Dialect` interface (`src/dialects/dialect.ts`). This class
|
|
10
|
+
* implements the minimal `NoSqlStore` marker interface
|
|
11
|
+
* (`src/nosql/store.ts`) and exposes Graylog's ingest/search API.
|
|
12
|
+
*
|
|
13
|
+
* ## No canonical driver - HTTP over `fetch`
|
|
14
|
+
*
|
|
15
|
+
* Graylog has no single canonical npm client; it is an HTTP/JSON API. This
|
|
16
|
+
* store talks to it with the global `fetch` (so `library` is `'fetch'`). For
|
|
17
|
+
* tests (and custom transports) an alternative HTTP client can be injected
|
|
18
|
+
* via `GraylogStoreOptions.client`.
|
|
19
|
+
*
|
|
20
|
+
* ## Endpoints wrapped
|
|
21
|
+
*
|
|
22
|
+
* - `push(host, entries)` -> `POST /gelf` (GELF ingest, one message per entry)
|
|
23
|
+
* - `query(q, opts?)` -> `GET /api/search/universal/relative` (search)
|
|
24
|
+
* - `labels()` -> `GET /api/system/fields` (message field names)
|
|
25
|
+
* - `streams()` -> `GET /api/streams` (configured streams)
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.GraylogStore = exports.DEFAULT_GRAYLOG_BASE_URL = void 0;
|
|
29
|
+
exports.createFetchClient = createFetchClient;
|
|
30
|
+
const errors_1 = require("../../errors");
|
|
31
|
+
/** Default Graylog HTTP base URL (GELF HTTP input on 12201, REST on 9000). */
|
|
32
|
+
exports.DEFAULT_GRAYLOG_BASE_URL = 'http://localhost:9000';
|
|
33
|
+
/** Build a `fetch`-backed client for the given base URL. */
|
|
34
|
+
function createFetchClient(baseURL, headers) {
|
|
35
|
+
const buildUrl = (path, params) => {
|
|
36
|
+
const url = new URL(path, baseURL.endsWith('/') ? baseURL : `${baseURL}/`);
|
|
37
|
+
for (const [key, value] of Object.entries(params ?? {})) {
|
|
38
|
+
if (value === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
for (const item of value)
|
|
42
|
+
url.searchParams.append(key, item);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
url.searchParams.set(key, value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return url.toString();
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
async get(path, params) {
|
|
52
|
+
const res = await fetch(buildUrl(path, params), {
|
|
53
|
+
method: 'GET',
|
|
54
|
+
headers: { Accept: 'application/json', ...(headers ?? {}) },
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok)
|
|
57
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
58
|
+
return res.json();
|
|
59
|
+
},
|
|
60
|
+
async post(path, body, contentType) {
|
|
61
|
+
const res = await fetch(buildUrl(path), {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
body,
|
|
64
|
+
headers: { ...(headers ?? {}), ...(contentType ? { 'Content-Type': contentType } : {}) },
|
|
65
|
+
});
|
|
66
|
+
if (!res.ok)
|
|
67
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
68
|
+
const text = await res.text();
|
|
69
|
+
if (!text)
|
|
70
|
+
return undefined;
|
|
71
|
+
try {
|
|
72
|
+
return JSON.parse(text);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return text;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* `GraylogStore` wraps Graylog's GELF HTTP ingest input and its REST
|
|
82
|
+
* universal-search / metadata API behind the `NoSqlStore` lifecycle.
|
|
83
|
+
*/
|
|
84
|
+
class GraylogStore {
|
|
85
|
+
constructor(options = {}) {
|
|
86
|
+
this.name = 'graylog';
|
|
87
|
+
this.library = 'fetch';
|
|
88
|
+
this.client = null;
|
|
89
|
+
this.connected = false;
|
|
90
|
+
this.baseURL = options.baseURL ?? exports.DEFAULT_GRAYLOG_BASE_URL;
|
|
91
|
+
this.injectedClient = options.client;
|
|
92
|
+
this.headers = options.headers;
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------------
|
|
95
|
+
// Connection lifecycle
|
|
96
|
+
// ---------------------------------------------------------------------
|
|
97
|
+
async connect() {
|
|
98
|
+
if (this.connected && this.client)
|
|
99
|
+
return;
|
|
100
|
+
this.client = this.injectedClient ?? createFetchClient(this.baseURL, this.headers);
|
|
101
|
+
this.connected = true;
|
|
102
|
+
}
|
|
103
|
+
async disconnect() {
|
|
104
|
+
this.client = null;
|
|
105
|
+
this.connected = false;
|
|
106
|
+
}
|
|
107
|
+
isConnected() {
|
|
108
|
+
return this.connected && this.client !== null;
|
|
109
|
+
}
|
|
110
|
+
/** Returns the underlying (internal or injected) HTTP client. */
|
|
111
|
+
getClient() {
|
|
112
|
+
return this.requireClient();
|
|
113
|
+
}
|
|
114
|
+
requireClient() {
|
|
115
|
+
if (!this.client) {
|
|
116
|
+
throw new errors_1.ConnectionError('Not connected to Graylog', {
|
|
117
|
+
database: 'graylog',
|
|
118
|
+
host: this.baseURL,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return this.client;
|
|
122
|
+
}
|
|
123
|
+
async doGet(path, params, action) {
|
|
124
|
+
const client = this.requireClient();
|
|
125
|
+
try {
|
|
126
|
+
return await client.get(path, params);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
130
|
+
throw errors_1.DatabaseError.from(parent, {
|
|
131
|
+
message: `Graylog ${action ?? 'request'} failed: ${parent.message}`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// ---------------------------------------------------------------------
|
|
136
|
+
// Ingest (GELF HTTP)
|
|
137
|
+
// ---------------------------------------------------------------------
|
|
138
|
+
/**
|
|
139
|
+
* Ingests one or more log entries as GELF messages via `POST /gelf`. Each
|
|
140
|
+
* entry is completed into a GELF `1.1` message with the shared `host`, and
|
|
141
|
+
* messages are newline-delimited (the GELF HTTP input accepts one JSON
|
|
142
|
+
* message per line).
|
|
143
|
+
*/
|
|
144
|
+
async push(host, entries) {
|
|
145
|
+
const client = this.requireClient();
|
|
146
|
+
const body = entries
|
|
147
|
+
.map((entry) => JSON.stringify({ version: '1.1', host, ...entry }))
|
|
148
|
+
.join('\n');
|
|
149
|
+
try {
|
|
150
|
+
return await client.post('/gelf', body, 'application/json');
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
154
|
+
throw errors_1.DatabaseError.from(parent, { message: `Graylog push failed: ${parent.message}` });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------
|
|
158
|
+
// Search
|
|
159
|
+
// ---------------------------------------------------------------------
|
|
160
|
+
/**
|
|
161
|
+
* Runs a relative universal search via
|
|
162
|
+
* `GET /api/search/universal/relative`. Returns the parsed response
|
|
163
|
+
* (`{ messages, total_results, fields, ... }`).
|
|
164
|
+
*/
|
|
165
|
+
async query(q, options = {}) {
|
|
166
|
+
return this.doGet('/api/search/universal/relative', {
|
|
167
|
+
query: q,
|
|
168
|
+
range: String(options.range ?? 300),
|
|
169
|
+
limit: options.limit === undefined ? undefined : String(options.limit),
|
|
170
|
+
offset: options.offset === undefined ? undefined : String(options.offset),
|
|
171
|
+
sort: options.sort,
|
|
172
|
+
filter: options.filter,
|
|
173
|
+
}, 'query');
|
|
174
|
+
}
|
|
175
|
+
// ---------------------------------------------------------------------
|
|
176
|
+
// Metadata
|
|
177
|
+
// ---------------------------------------------------------------------
|
|
178
|
+
/** Lists the known message field names via `GET /api/system/fields`. */
|
|
179
|
+
async labels() {
|
|
180
|
+
return this.doGet('/api/system/fields', undefined, 'labels');
|
|
181
|
+
}
|
|
182
|
+
/** Lists the configured streams via `GET /api/streams`. */
|
|
183
|
+
async streams() {
|
|
184
|
+
return this.doGet('/api/streams', undefined, 'streams');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.GraylogStore = GraylogStore;
|
|
188
|
+
exports.default = GraylogStore;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GridGain store implementation.
|
|
4
|
+
*
|
|
5
|
+
* GridGain is the commercial in-memory computing platform built on (and
|
|
6
|
+
* wire-compatible with) Apache Ignite: it speaks the same thin-client
|
|
7
|
+
* protocol and exposes the same distributed key/value caches. Consequently
|
|
8
|
+
* this store uses the very same `apache-ignite-client` Node.js thin-client
|
|
9
|
+
* driver as `IgniteStore`, differing only in `name` ('gridgain') and the
|
|
10
|
+
* error/message labels. Like Ignite it targets the distributed-cache
|
|
11
|
+
* (key/value grid) surface rather than SQL, so it implements the minimal
|
|
12
|
+
* `NoSqlStore` marker interface and exposes cache operations
|
|
13
|
+
* (getCache/put/get/removeKey/getKeys/getSize) as a typed, promise-based API.
|
|
14
|
+
*
|
|
15
|
+
* The driver is loaded lazily inside `connect()` (or supplied pre-built via
|
|
16
|
+
* the `client` option) so importing this module never requires
|
|
17
|
+
* `apache-ignite-client` to be installed unless a GridGain store is actually
|
|
18
|
+
* connected. Tests inject a mock client this way.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.GridGainStore = void 0;
|
|
22
|
+
const errors_1 = require("../../errors");
|
|
23
|
+
function wrapConnectionError(err) {
|
|
24
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
25
|
+
const message = /econnrefused/i.test(parent.message)
|
|
26
|
+
? 'Connection refused'
|
|
27
|
+
: `Unable to connect to GridGain: ${parent.message}`;
|
|
28
|
+
return new errors_1.ConnectionError(message, { parent, database: 'gridgain' });
|
|
29
|
+
}
|
|
30
|
+
function wrapDatabaseError(err, action) {
|
|
31
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
32
|
+
return errors_1.DatabaseError.from(parent, { message: `GridGain ${action} failed: ${parent.message}` });
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* `GridGainStore` wraps an `apache-ignite-client` client (GridGain is
|
|
36
|
+
* Ignite-based and shares the thin-client protocol) and exposes its
|
|
37
|
+
* distributed-cache operations as a typed, promise-based API.
|
|
38
|
+
*/
|
|
39
|
+
class GridGainStore {
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
this.name = 'gridgain';
|
|
42
|
+
this.library = 'apache-ignite-client';
|
|
43
|
+
this.client = null;
|
|
44
|
+
this.connected = false;
|
|
45
|
+
/** Resolved `CacheClient` handles, cached by name so `getMap` is idempotent. */
|
|
46
|
+
this.caches = new Map();
|
|
47
|
+
this.options = options;
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------
|
|
50
|
+
// Connection lifecycle
|
|
51
|
+
// ---------------------------------------------------------------------
|
|
52
|
+
async connect() {
|
|
53
|
+
if (this.connected && this.client) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
if (this.options.client) {
|
|
58
|
+
this.client = this.options.client;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
62
|
+
const mod = require('apache-ignite-client');
|
|
63
|
+
const IgniteClient = mod.IgniteClient ?? mod;
|
|
64
|
+
const IgniteClientConfiguration = mod.IgniteClientConfiguration;
|
|
65
|
+
const client = new IgniteClient();
|
|
66
|
+
const endpoints = this.options.endpoints ?? ['127.0.0.1:10800'];
|
|
67
|
+
const cfg = new IgniteClientConfiguration(...endpoints);
|
|
68
|
+
await client.connect(cfg);
|
|
69
|
+
this.client = client;
|
|
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
|
+
if (this.client) {
|
|
81
|
+
try {
|
|
82
|
+
await this.client.disconnect();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// best-effort disconnect
|
|
86
|
+
}
|
|
87
|
+
this.client = null;
|
|
88
|
+
}
|
|
89
|
+
this.caches.clear();
|
|
90
|
+
this.connected = false;
|
|
91
|
+
}
|
|
92
|
+
isConnected() {
|
|
93
|
+
return this.connected && this.client !== null;
|
|
94
|
+
}
|
|
95
|
+
/** Returns the underlying `apache-ignite-client` client for anything not wrapped here. */
|
|
96
|
+
getClient() {
|
|
97
|
+
return this.requireClient();
|
|
98
|
+
}
|
|
99
|
+
requireClient() {
|
|
100
|
+
if (!this.client) {
|
|
101
|
+
throw new errors_1.ConnectionError('Not connected to GridGain', { database: 'gridgain' });
|
|
102
|
+
}
|
|
103
|
+
return this.client;
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------
|
|
106
|
+
// Distributed cache operations
|
|
107
|
+
// ---------------------------------------------------------------------
|
|
108
|
+
/** Resolve (and cache) a distributed cache handle by name. */
|
|
109
|
+
async getMap(name) {
|
|
110
|
+
const cached = this.caches.get(name);
|
|
111
|
+
if (cached) {
|
|
112
|
+
return cached;
|
|
113
|
+
}
|
|
114
|
+
const client = this.requireClient();
|
|
115
|
+
try {
|
|
116
|
+
const cache = await client.getCache(name);
|
|
117
|
+
this.caches.set(name, cache);
|
|
118
|
+
return cache;
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
throw wrapDatabaseError(err, 'getCache');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Put `value` under `key` in `map` (a GridGain cache handle). */
|
|
125
|
+
async mapPut(map, key, value) {
|
|
126
|
+
try {
|
|
127
|
+
return await map.put(key, value);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
throw wrapDatabaseError(err, 'cache put');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Get the value stored under `key` in `map` (or null if absent). */
|
|
134
|
+
async mapGet(map, key) {
|
|
135
|
+
try {
|
|
136
|
+
return await map.get(key);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
throw wrapDatabaseError(err, 'cache get');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Remove `key` from `map`. Returns GridGain's boolean success flag. */
|
|
143
|
+
async mapRemove(map, key) {
|
|
144
|
+
try {
|
|
145
|
+
return await map.removeKey(key);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
throw wrapDatabaseError(err, 'cache removeKey');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** Return all keys currently in `map` as an array. */
|
|
152
|
+
async mapKeys(map) {
|
|
153
|
+
try {
|
|
154
|
+
return await map.getKeys();
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
throw wrapDatabaseError(err, 'cache getKeys');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Return the number of entries in `map`. */
|
|
161
|
+
async mapSize(map) {
|
|
162
|
+
try {
|
|
163
|
+
return await map.getSize();
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
throw wrapDatabaseError(err, 'cache getSize');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.GridGainStore = GridGainStore;
|
|
171
|
+
exports.default = GridGainStore;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hazelcast store implementation.
|
|
4
|
+
*
|
|
5
|
+
* Hazelcast is a distributed in-memory data grid (IMDG). Its central data
|
|
6
|
+
* structure is the distributed `IMap` - a partitioned, replicated key/value
|
|
7
|
+
* map spread across cluster members. It has no SQL-shaped `query(sql)`
|
|
8
|
+
* surface, so this class implements the minimal `NoSqlStore` marker
|
|
9
|
+
* interface and exposes Hazelcast's distributed-map operations
|
|
10
|
+
* (getMap/put/get/remove/keySet/size) as a typed, promise-based API.
|
|
11
|
+
*
|
|
12
|
+
* Uses the `hazelcast-client` driver. The driver is loaded lazily inside
|
|
13
|
+
* `connect()` (or supplied pre-built via the `client` option) so importing
|
|
14
|
+
* this module never requires `hazelcast-client` to be installed unless a
|
|
15
|
+
* Hazelcast store is actually connected. Tests inject a mock client this way.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.HazelcastStore = void 0;
|
|
19
|
+
const errors_1 = require("../../errors");
|
|
20
|
+
function wrapConnectionError(err) {
|
|
21
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
22
|
+
const message = /econnrefused/i.test(parent.message)
|
|
23
|
+
? 'Connection refused'
|
|
24
|
+
: `Unable to connect to Hazelcast: ${parent.message}`;
|
|
25
|
+
return new errors_1.ConnectionError(message, { parent, database: 'hazelcast' });
|
|
26
|
+
}
|
|
27
|
+
function wrapDatabaseError(err, action) {
|
|
28
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
29
|
+
return errors_1.DatabaseError.from(parent, { message: `Hazelcast ${action} failed: ${parent.message}` });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* `HazelcastStore` wraps a `hazelcast-client` `Client` and exposes its
|
|
33
|
+
* distributed `IMap` operations as a typed, promise-based API.
|
|
34
|
+
*/
|
|
35
|
+
class HazelcastStore {
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
this.name = 'hazelcast';
|
|
38
|
+
this.library = 'hazelcast-client';
|
|
39
|
+
this.client = null;
|
|
40
|
+
this.connected = false;
|
|
41
|
+
/** Resolved `IMap` handles, cached by map name so `getMap` is idempotent. */
|
|
42
|
+
this.maps = new Map();
|
|
43
|
+
this.options = options;
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------------
|
|
46
|
+
// Connection lifecycle
|
|
47
|
+
// ---------------------------------------------------------------------
|
|
48
|
+
async connect() {
|
|
49
|
+
if (this.connected && this.client) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
if (this.options.client) {
|
|
54
|
+
this.client = this.options.client;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
58
|
+
const hazelcast = require('hazelcast-client');
|
|
59
|
+
const Client = hazelcast.Client ?? hazelcast;
|
|
60
|
+
this.client = (await Client.newHazelcastClient(this.options.config));
|
|
61
|
+
}
|
|
62
|
+
this.connected = true;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
this.client = null;
|
|
66
|
+
this.connected = false;
|
|
67
|
+
throw wrapConnectionError(err);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async disconnect() {
|
|
71
|
+
if (this.client) {
|
|
72
|
+
try {
|
|
73
|
+
await this.client.shutdown();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// best-effort shutdown
|
|
77
|
+
}
|
|
78
|
+
this.client = null;
|
|
79
|
+
}
|
|
80
|
+
this.maps.clear();
|
|
81
|
+
this.connected = false;
|
|
82
|
+
}
|
|
83
|
+
isConnected() {
|
|
84
|
+
return this.connected && this.client !== null;
|
|
85
|
+
}
|
|
86
|
+
/** Returns the underlying `hazelcast-client` client for anything not wrapped here. */
|
|
87
|
+
getClient() {
|
|
88
|
+
return this.requireClient();
|
|
89
|
+
}
|
|
90
|
+
requireClient() {
|
|
91
|
+
if (!this.client) {
|
|
92
|
+
throw new errors_1.ConnectionError('Not connected to Hazelcast', { database: 'hazelcast' });
|
|
93
|
+
}
|
|
94
|
+
return this.client;
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------
|
|
97
|
+
// Distributed map (IMap) operations
|
|
98
|
+
// ---------------------------------------------------------------------
|
|
99
|
+
/** Resolve (and cache) a distributed `IMap` handle by name. */
|
|
100
|
+
async getMap(name) {
|
|
101
|
+
const cached = this.maps.get(name);
|
|
102
|
+
if (cached) {
|
|
103
|
+
return cached;
|
|
104
|
+
}
|
|
105
|
+
const client = this.requireClient();
|
|
106
|
+
try {
|
|
107
|
+
const map = await client.getMap(name);
|
|
108
|
+
this.maps.set(name, map);
|
|
109
|
+
return map;
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
throw wrapDatabaseError(err, 'getMap');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Put `value` under `key` in `map`, returning the previous value (or null). */
|
|
116
|
+
async mapPut(map, key, value) {
|
|
117
|
+
try {
|
|
118
|
+
return await map.put(key, value);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
throw wrapDatabaseError(err, 'map put');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Get the value stored under `key` in `map` (or null if absent). */
|
|
125
|
+
async mapGet(map, key) {
|
|
126
|
+
try {
|
|
127
|
+
return await map.get(key);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
throw wrapDatabaseError(err, 'map get');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Remove `key` from `map`, returning the removed value (or null). */
|
|
134
|
+
async mapRemove(map, key) {
|
|
135
|
+
try {
|
|
136
|
+
return await map.remove(key);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
throw wrapDatabaseError(err, 'map remove');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Return all keys currently in `map` as an array. */
|
|
143
|
+
async mapKeys(map) {
|
|
144
|
+
try {
|
|
145
|
+
return await map.keySet();
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
throw wrapDatabaseError(err, 'map keys');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** Return the number of entries in `map`. */
|
|
152
|
+
async mapSize(map) {
|
|
153
|
+
try {
|
|
154
|
+
return await map.size();
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
throw wrapDatabaseError(err, 'map size');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
exports.HazelcastStore = HazelcastStore;
|
|
162
|
+
exports.default = HazelcastStore;
|