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,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sumo Logic store implementation.
|
|
4
|
+
*
|
|
5
|
+
* Sumo Logic is a cloud log-management and analytics platform. Logs are
|
|
6
|
+
* ingested by POSTing to an HTTP Source collector URL, and searched with the
|
|
7
|
+
* Search Job API (create a job, then poll for status/messages). There is no
|
|
8
|
+
* SQL-shaped query surface, no row-level UPDATE/DELETE, and no identifier
|
|
9
|
+
* escaping, so Sumo Logic does not fit the SQL `Dialect` interface
|
|
10
|
+
* (`src/dialects/dialect.ts`). This class implements the minimal
|
|
11
|
+
* `NoSqlStore` marker interface (`src/nosql/store.ts`) and exposes Sumo's
|
|
12
|
+
* ingest/search API.
|
|
13
|
+
*
|
|
14
|
+
* ## No canonical driver - HTTP over `fetch`
|
|
15
|
+
*
|
|
16
|
+
* Sumo Logic has no single canonical npm client; it is an HTTP/JSON API.
|
|
17
|
+
* This store talks to it with the global `fetch` (so `library` is
|
|
18
|
+
* `'fetch'`). For tests (and custom transports) an alternative HTTP client
|
|
19
|
+
* can be injected via `SumoLogicStoreOptions.client`.
|
|
20
|
+
*
|
|
21
|
+
* Ingest and search live on different hosts: ingest targets the per-source
|
|
22
|
+
* `collectorURL`, while search targets the regional `apiURL`. The internal
|
|
23
|
+
* client resolves absolute URLs verbatim, so `push()` posts to the full
|
|
24
|
+
* collector URL while the search/metadata methods use relative API paths.
|
|
25
|
+
*
|
|
26
|
+
* ## Endpoints wrapped
|
|
27
|
+
*
|
|
28
|
+
* - `push(lines)` -> `POST <collectorURL>` (HTTP Source ingest)
|
|
29
|
+
* - `query(q, opts?)` -> `POST /api/v1/search/jobs` (create search job)
|
|
30
|
+
* - `messages(id)` -> `GET /api/v1/search/jobs/<id>/messages`
|
|
31
|
+
* - `labels()` -> `GET /api/v1/fields` (field names)
|
|
32
|
+
* - `streams()` -> `GET /api/v1/collectors` (collectors)
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.SumoLogicStore = exports.DEFAULT_SUMOLOGIC_API_URL = void 0;
|
|
36
|
+
exports.createFetchClient = createFetchClient;
|
|
37
|
+
const errors_1 = require("../../errors");
|
|
38
|
+
/** Default Sumo Logic API base URL. */
|
|
39
|
+
exports.DEFAULT_SUMOLOGIC_API_URL = 'https://api.sumologic.com';
|
|
40
|
+
/** Build a `fetch`-backed client for the given base URL. */
|
|
41
|
+
function createFetchClient(baseURL, headers) {
|
|
42
|
+
const buildUrl = (path, params) => {
|
|
43
|
+
// Absolute URLs (the collector URL) override the base entirely.
|
|
44
|
+
const url = new URL(path, baseURL.endsWith('/') ? baseURL : `${baseURL}/`);
|
|
45
|
+
for (const [key, value] of Object.entries(params ?? {})) {
|
|
46
|
+
if (value === undefined)
|
|
47
|
+
continue;
|
|
48
|
+
if (Array.isArray(value)) {
|
|
49
|
+
for (const item of value)
|
|
50
|
+
url.searchParams.append(key, item);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
url.searchParams.set(key, value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return url.toString();
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
async get(path, params) {
|
|
60
|
+
const res = await fetch(buildUrl(path, params), {
|
|
61
|
+
method: 'GET',
|
|
62
|
+
headers: { Accept: 'application/json', ...(headers ?? {}) },
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok)
|
|
65
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
66
|
+
return res.json();
|
|
67
|
+
},
|
|
68
|
+
async post(path, body, contentType) {
|
|
69
|
+
const res = await fetch(buildUrl(path), {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
body,
|
|
72
|
+
headers: { ...(headers ?? {}), ...(contentType ? { 'Content-Type': contentType } : {}) },
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok)
|
|
75
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
76
|
+
const text = await res.text();
|
|
77
|
+
if (!text)
|
|
78
|
+
return undefined;
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(text);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return text;
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* `SumoLogicStore` wraps Sumo Logic's HTTP Source ingest and its Search Job
|
|
90
|
+
* API (create job + fetch messages) plus field/collector metadata behind the
|
|
91
|
+
* `NoSqlStore` lifecycle.
|
|
92
|
+
*/
|
|
93
|
+
class SumoLogicStore {
|
|
94
|
+
constructor(options = {}) {
|
|
95
|
+
this.name = 'sumologic';
|
|
96
|
+
this.library = 'fetch';
|
|
97
|
+
this.client = null;
|
|
98
|
+
this.connected = false;
|
|
99
|
+
this.apiURL = options.apiURL ?? exports.DEFAULT_SUMOLOGIC_API_URL;
|
|
100
|
+
this.collectorURL = options.collectorURL;
|
|
101
|
+
this.injectedClient = options.client;
|
|
102
|
+
this.headers = options.headers;
|
|
103
|
+
}
|
|
104
|
+
// ---------------------------------------------------------------------
|
|
105
|
+
// Connection lifecycle
|
|
106
|
+
// ---------------------------------------------------------------------
|
|
107
|
+
async connect() {
|
|
108
|
+
if (this.connected && this.client)
|
|
109
|
+
return;
|
|
110
|
+
this.client = this.injectedClient ?? createFetchClient(this.apiURL, this.headers);
|
|
111
|
+
this.connected = true;
|
|
112
|
+
}
|
|
113
|
+
async disconnect() {
|
|
114
|
+
this.client = null;
|
|
115
|
+
this.connected = false;
|
|
116
|
+
}
|
|
117
|
+
isConnected() {
|
|
118
|
+
return this.connected && this.client !== null;
|
|
119
|
+
}
|
|
120
|
+
/** Returns the underlying (internal or injected) HTTP client. */
|
|
121
|
+
getClient() {
|
|
122
|
+
return this.requireClient();
|
|
123
|
+
}
|
|
124
|
+
requireClient() {
|
|
125
|
+
if (!this.client) {
|
|
126
|
+
throw new errors_1.ConnectionError('Not connected to Sumo Logic', {
|
|
127
|
+
database: 'sumologic',
|
|
128
|
+
host: this.apiURL,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return this.client;
|
|
132
|
+
}
|
|
133
|
+
async doGet(path, params, action) {
|
|
134
|
+
const client = this.requireClient();
|
|
135
|
+
try {
|
|
136
|
+
return await client.get(path, params);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
140
|
+
throw errors_1.DatabaseError.from(parent, {
|
|
141
|
+
message: `Sumo Logic ${action ?? 'request'} failed: ${parent.message}`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// ---------------------------------------------------------------------
|
|
146
|
+
// Ingest (HTTP Source)
|
|
147
|
+
// ---------------------------------------------------------------------
|
|
148
|
+
/**
|
|
149
|
+
* Ingests raw log lines by POSTing them (newline-delimited) to the
|
|
150
|
+
* configured HTTP Source `collectorURL`. Accepts a single string or an
|
|
151
|
+
* array of lines (joined with newlines).
|
|
152
|
+
*/
|
|
153
|
+
async push(lines) {
|
|
154
|
+
if (!this.collectorURL) {
|
|
155
|
+
throw new errors_1.DatabaseError('Sumo Logic push requires a collectorURL to be configured');
|
|
156
|
+
}
|
|
157
|
+
const client = this.requireClient();
|
|
158
|
+
const body = Array.isArray(lines) ? lines.join('\n') : lines;
|
|
159
|
+
try {
|
|
160
|
+
return await client.post(this.collectorURL, body, 'text/plain');
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
164
|
+
throw errors_1.DatabaseError.from(parent, { message: `Sumo Logic push failed: ${parent.message}` });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ---------------------------------------------------------------------
|
|
168
|
+
// Search Job API
|
|
169
|
+
// ---------------------------------------------------------------------
|
|
170
|
+
/**
|
|
171
|
+
* Creates a search job via `POST /api/v1/search/jobs`. Returns the parsed
|
|
172
|
+
* response (typically `{ id }`); use `messages(id)` to fetch results once
|
|
173
|
+
* the job completes.
|
|
174
|
+
*/
|
|
175
|
+
async query(q, options = {}) {
|
|
176
|
+
const client = this.requireClient();
|
|
177
|
+
const payload = {
|
|
178
|
+
query: q,
|
|
179
|
+
from: options.from === undefined ? undefined : String(options.from),
|
|
180
|
+
to: options.to === undefined ? undefined : String(options.to),
|
|
181
|
+
timeZone: options.timeZone ?? 'UTC',
|
|
182
|
+
byReceiptTime: options.byReceiptTime,
|
|
183
|
+
};
|
|
184
|
+
try {
|
|
185
|
+
return await client.post('/api/v1/search/jobs', JSON.stringify(payload), 'application/json');
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
189
|
+
throw errors_1.DatabaseError.from(parent, { message: `Sumo Logic query failed: ${parent.message}` });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Fetches messages for a completed search job via `GET /api/v1/search/jobs/<id>/messages`. */
|
|
193
|
+
async messages(jobId, offset = 0, limit = 100) {
|
|
194
|
+
return this.doGet(`/api/v1/search/jobs/${encodeURIComponent(jobId)}/messages`, { offset: String(offset), limit: String(limit) }, 'messages');
|
|
195
|
+
}
|
|
196
|
+
/** Fetches the status of a search job via `GET /api/v1/search/jobs/<id>`. */
|
|
197
|
+
async jobStatus(jobId) {
|
|
198
|
+
return this.doGet(`/api/v1/search/jobs/${encodeURIComponent(jobId)}`, undefined, 'jobStatus');
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------
|
|
201
|
+
// Metadata
|
|
202
|
+
// ---------------------------------------------------------------------
|
|
203
|
+
/** Lists the configured fields via `GET /api/v1/fields`. */
|
|
204
|
+
async labels() {
|
|
205
|
+
return this.doGet('/api/v1/fields', undefined, 'labels');
|
|
206
|
+
}
|
|
207
|
+
/** Lists the collectors via `GET /api/v1/collectors`. */
|
|
208
|
+
async streams() {
|
|
209
|
+
return this.doGet('/api/v1/collectors', undefined, 'streams');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.SumoLogicStore = SumoLogicStore;
|
|
213
|
+
exports.default = SumoLogicStore;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SurrealDB store implementation for the Prorm NoSQL layer.
|
|
4
|
+
*
|
|
5
|
+
* SurrealDB is a multi-model database with its own record/graph model and
|
|
6
|
+
* the SurrealQL query language, so it does not fit the SQL-shaped `Dialect`
|
|
7
|
+
* interface (no identifier escaping, no SQL DDL). This class implements the
|
|
8
|
+
* minimal `NoSqlStore` marker interface for connection lifecycle and
|
|
9
|
+
* otherwise exposes SurrealDB's real API surface directly: record CRUD over
|
|
10
|
+
* "things" (table or `table:id` record identifiers) plus raw SurrealQL via
|
|
11
|
+
* `query()`.
|
|
12
|
+
*
|
|
13
|
+
* Uses the `surrealdb` driver. The driver is loaded lazily inside
|
|
14
|
+
* `connect()` (via `require`) so importing this module never forces the
|
|
15
|
+
* optional `surrealdb` dependency to be installed. For testing (or to reuse
|
|
16
|
+
* an already-configured connection) a pre-built `Surreal` instance can be
|
|
17
|
+
* injected through {@link SurrealStoreOptions.client}, in which case the
|
|
18
|
+
* `require` is skipped entirely.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.SurrealStore = void 0;
|
|
22
|
+
const errors_1 = require("../../errors");
|
|
23
|
+
/**
|
|
24
|
+
* `SurrealStore` wraps the `surrealdb` driver's `Surreal` client, exposing
|
|
25
|
+
* record CRUD (`create`/`select`/`update`/`merge`/`delete`) and raw
|
|
26
|
+
* SurrealQL (`query`) as a small promise-based API.
|
|
27
|
+
*/
|
|
28
|
+
class SurrealStore {
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.name = 'surrealdb';
|
|
31
|
+
this.library = 'surrealdb';
|
|
32
|
+
this.db = null;
|
|
33
|
+
this.connected = false;
|
|
34
|
+
if (!options || !options.url) {
|
|
35
|
+
throw new errors_1.DatabaseError('SurrealStore requires a connection `url`', {
|
|
36
|
+
code: 'INVALID_CONNECTION',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
this.options = options;
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------
|
|
42
|
+
// Connection lifecycle
|
|
43
|
+
// ---------------------------------------------------------------------
|
|
44
|
+
async connect() {
|
|
45
|
+
if (this.connected && this.db) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
let db = this.options.client;
|
|
50
|
+
if (!db) {
|
|
51
|
+
// Lazy-load the optional driver only when we actually need to build
|
|
52
|
+
// a connection, so importing this module never requires `surrealdb`.
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
54
|
+
const { Surreal } = require('surrealdb');
|
|
55
|
+
db = new Surreal();
|
|
56
|
+
}
|
|
57
|
+
await db.connect(this.options.url);
|
|
58
|
+
if (this.options.username !== undefined || this.options.password !== undefined) {
|
|
59
|
+
await db.signin({
|
|
60
|
+
username: this.options.username,
|
|
61
|
+
password: this.options.password,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (this.options.namespace !== undefined || this.options.database !== undefined) {
|
|
65
|
+
await db.use({
|
|
66
|
+
namespace: this.options.namespace,
|
|
67
|
+
database: this.options.database,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.db = db;
|
|
71
|
+
this.connected = true;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.db = null;
|
|
75
|
+
this.connected = false;
|
|
76
|
+
throw new errors_1.ConnectionError('Failed to connect to SurrealDB', {
|
|
77
|
+
parent: error instanceof Error ? error : undefined,
|
|
78
|
+
database: this.options.database,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async disconnect() {
|
|
83
|
+
const db = this.db;
|
|
84
|
+
this.db = null;
|
|
85
|
+
this.connected = false;
|
|
86
|
+
if (!db) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
await db.close();
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
throw new errors_1.DatabaseError('Failed to disconnect from SurrealDB', {
|
|
94
|
+
parent: error instanceof Error ? error : undefined,
|
|
95
|
+
original: error instanceof Error ? error.message : String(error),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
isConnected() {
|
|
100
|
+
return this.connected && this.db !== null;
|
|
101
|
+
}
|
|
102
|
+
/** Returns the underlying native `Surreal` client. */
|
|
103
|
+
getClient() {
|
|
104
|
+
return this.requireClient();
|
|
105
|
+
}
|
|
106
|
+
requireClient() {
|
|
107
|
+
if (!this.db || !this.connected) {
|
|
108
|
+
throw new errors_1.ConnectionError('SurrealStore is not connected. Call connect() first.', {
|
|
109
|
+
code: 'INVALID_CONNECTION',
|
|
110
|
+
database: this.options.database,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return this.db;
|
|
114
|
+
}
|
|
115
|
+
async exec(op, fn) {
|
|
116
|
+
const db = this.requireClient();
|
|
117
|
+
try {
|
|
118
|
+
return await fn(db);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw new errors_1.DatabaseError(`SurrealDB operation "${op}" failed`, {
|
|
122
|
+
code: 'QUERY_ERROR',
|
|
123
|
+
parent: error instanceof Error ? error : undefined,
|
|
124
|
+
original: error instanceof Error ? error.message : String(error),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// ---------------------------------------------------------------------
|
|
129
|
+
// Record operations
|
|
130
|
+
// ---------------------------------------------------------------------
|
|
131
|
+
/**
|
|
132
|
+
* Create a record. `thing` may be a table name (`'user'`, id auto-
|
|
133
|
+
* generated) or a specific record id (`'user:jane'`). Passthrough to the
|
|
134
|
+
* driver's `Surreal.create()`.
|
|
135
|
+
*/
|
|
136
|
+
async create(thing, data) {
|
|
137
|
+
return this.exec('create', (db) => db.create(thing, data));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Select a record or all records in a table. Passthrough to the driver's
|
|
141
|
+
* `Surreal.select()`.
|
|
142
|
+
*/
|
|
143
|
+
async select(thing) {
|
|
144
|
+
return this.exec('select', (db) => db.select(thing));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Replace the content of a record (or every record in a table).
|
|
148
|
+
* Passthrough to the driver's `Surreal.update()`.
|
|
149
|
+
*/
|
|
150
|
+
async update(thing, data) {
|
|
151
|
+
return this.exec('update', (db) => db.update(thing, data));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Merge the given data into a record (or every record in a table),
|
|
155
|
+
* leaving unspecified fields intact. Passthrough to the driver's
|
|
156
|
+
* `Surreal.merge()`.
|
|
157
|
+
*/
|
|
158
|
+
async merge(thing, data) {
|
|
159
|
+
return this.exec('merge', (db) => db.merge(thing, data));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Delete a record (or every record in a table). Passthrough to the
|
|
163
|
+
* driver's `Surreal.delete()`.
|
|
164
|
+
*/
|
|
165
|
+
async delete(thing) {
|
|
166
|
+
return this.exec('delete', (db) => db.delete(thing));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Run a raw SurrealQL statement (or several `;`-separated statements),
|
|
170
|
+
* optionally binding `vars` as `$name` parameters. Returns the driver's
|
|
171
|
+
* result array (one entry per statement). Passthrough to the driver's
|
|
172
|
+
* `Surreal.query()`.
|
|
173
|
+
*/
|
|
174
|
+
async query(surql, vars) {
|
|
175
|
+
return this.exec('query', (db) => db.query(surql, vars));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.SurrealStore = SurrealStore;
|
|
179
|
+
exports.default = SurrealStore;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TerminusDB store implementation.
|
|
4
|
+
*
|
|
5
|
+
* TerminusDB is an immutable, versioned document/graph database with a
|
|
6
|
+
* git-like data model: every write produces a new commit on a branch, and
|
|
7
|
+
* the full commit history is retained, so past states are always
|
|
8
|
+
* reconstructable and the store is effectively append-only/auditable.
|
|
9
|
+
* Documents are typed JSON objects; queries are expressed in WOQL (the Web
|
|
10
|
+
* Object Query Language).
|
|
11
|
+
*
|
|
12
|
+
* TerminusDB is not a SQL `Dialect`, so this class implements the minimal
|
|
13
|
+
* `NoSqlStore` marker interface plus the shared ledger surface:
|
|
14
|
+
* - `append(table, data)` -> `addDocument` of `{ '@type': table, ...data }`.
|
|
15
|
+
* - `get(table, id)` -> `getDocument` by `<table>/<id>`.
|
|
16
|
+
* - `history(table, id)` -> commit-log WOQL query for the document.
|
|
17
|
+
* - `verify(table, id)` -> fetch the document + report existence (its
|
|
18
|
+
* presence in the immutable commit graph is its provenance).
|
|
19
|
+
* - `query(woql)` -> raw WOQL passthrough.
|
|
20
|
+
*
|
|
21
|
+
* ## Lazy driver loading
|
|
22
|
+
*
|
|
23
|
+
* `@terminusdb/terminusdb-client` is loaded lazily inside `connect()`. Tests
|
|
24
|
+
* inject a pre-built, already-connected `WOQLClient` via
|
|
25
|
+
* `TerminusdbStoreOptions.client`, bypassing the `require`.
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.TerminusdbStore = void 0;
|
|
29
|
+
const errors_1 = require("../../errors");
|
|
30
|
+
/**
|
|
31
|
+
* `TerminusdbStore` wraps a `WOQLClient` behind the shared ledger surface.
|
|
32
|
+
*/
|
|
33
|
+
class TerminusdbStore {
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
this.name = 'terminusdb';
|
|
36
|
+
this.library = '@terminusdb/terminusdb-client';
|
|
37
|
+
this.client = null;
|
|
38
|
+
this.connected = false;
|
|
39
|
+
this.options = options;
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------
|
|
42
|
+
// Connection lifecycle
|
|
43
|
+
// ---------------------------------------------------------------------
|
|
44
|
+
async connect() {
|
|
45
|
+
if (this.connected && this.client) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
if (this.options.client) {
|
|
50
|
+
this.client = this.options.client;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
54
|
+
const mod = require('@terminusdb/terminusdb-client');
|
|
55
|
+
const WOQLClient = mod.WOQLClient ?? mod.default?.WOQLClient ?? mod.default;
|
|
56
|
+
this.client = new WOQLClient(this.options.url ?? 'http://localhost:6363', {
|
|
57
|
+
user: this.options.user,
|
|
58
|
+
key: this.options.key,
|
|
59
|
+
organization: this.options.organization,
|
|
60
|
+
});
|
|
61
|
+
if (typeof this.client.connect === 'function') {
|
|
62
|
+
await this.client.connect();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (this.options.db && typeof this.client.db === 'function') {
|
|
66
|
+
this.client.db(this.options.db);
|
|
67
|
+
}
|
|
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 TerminusDB: ${parent.message}`, {
|
|
75
|
+
parent,
|
|
76
|
+
database: 'terminusdb',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async disconnect() {
|
|
81
|
+
this.client = null;
|
|
82
|
+
this.connected = false;
|
|
83
|
+
}
|
|
84
|
+
isConnected() {
|
|
85
|
+
return this.connected && this.client !== null;
|
|
86
|
+
}
|
|
87
|
+
/** Returns the underlying `WOQLClient` for anything not wrapped here. */
|
|
88
|
+
getClient() {
|
|
89
|
+
return this.requireClient();
|
|
90
|
+
}
|
|
91
|
+
requireClient() {
|
|
92
|
+
if (!this.client || !this.connected) {
|
|
93
|
+
throw new errors_1.ConnectionError('Not connected to TerminusDB. Call connect() first.', {
|
|
94
|
+
database: 'terminusdb',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return this.client;
|
|
98
|
+
}
|
|
99
|
+
fullId(table, id) {
|
|
100
|
+
return id.includes('/') ? id : `${table}/${id}`;
|
|
101
|
+
}
|
|
102
|
+
async run(action, fn) {
|
|
103
|
+
const client = this.requireClient();
|
|
104
|
+
try {
|
|
105
|
+
return await fn(client);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const parent = err instanceof Error ? err : new Error(String(err));
|
|
109
|
+
throw errors_1.DatabaseError.from(parent, { message: `TerminusDB ${action} failed: ${parent.message}` });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------
|
|
113
|
+
// Ledger surface
|
|
114
|
+
// ---------------------------------------------------------------------
|
|
115
|
+
/**
|
|
116
|
+
* Insert `data` as a new document of type `table` (a new commit). Returns
|
|
117
|
+
* whatever `addDocument` reports (typically the inserted document id(s)).
|
|
118
|
+
*/
|
|
119
|
+
async append(table, data) {
|
|
120
|
+
return this.run('append', (client) => client.addDocument({ '@type': table, ...data }, undefined, undefined, `append ${table}`));
|
|
121
|
+
}
|
|
122
|
+
/** Fetch the current revision of document `<table>/<id>`. */
|
|
123
|
+
async get(table, id) {
|
|
124
|
+
return this.run('get', (client) => client.getDocument({ id: this.fullId(table, id) }));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Return the commit history for document `<table>/<id>` via a WOQL query
|
|
128
|
+
* over the commit graph. Every past revision lives in the immutable commit
|
|
129
|
+
* chain, so this surfaces the document's provenance.
|
|
130
|
+
*/
|
|
131
|
+
async history(table, id) {
|
|
132
|
+
const docId = this.fullId(table, id);
|
|
133
|
+
return this.run('history', (client) => client.query({ '@type': 'CommitHistory', document: docId }));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Verify document `<table>/<id>` by reading it back from the immutable
|
|
137
|
+
* store. Returns `{ id, exists, document }` - existence in the commit graph
|
|
138
|
+
* is the provenance guarantee (TerminusDB never mutates past commits).
|
|
139
|
+
*/
|
|
140
|
+
async verify(table, id) {
|
|
141
|
+
const docId = this.fullId(table, id);
|
|
142
|
+
const document = await this.run('verify', (client) => client.getDocument({ id: docId }).catch(() => null));
|
|
143
|
+
return { id: docId, exists: document != null, document };
|
|
144
|
+
}
|
|
145
|
+
/** Run a raw WOQL query object. */
|
|
146
|
+
async query(woql, commitMsg) {
|
|
147
|
+
return this.run('query', (client) => client.query(woql, commitMsg));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.TerminusdbStore = TerminusdbStore;
|
|
151
|
+
exports.default = TerminusdbStore;
|