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.
Files changed (310) hide show
  1. package/CHANGELOG.md +1111 -0
  2. package/LICENSE +21 -0
  3. package/README.md +573 -0
  4. package/dist/audit/history-query.js +180 -0
  5. package/dist/audit/index.js +23 -0
  6. package/dist/audit/logger.js +236 -0
  7. package/dist/cache/cache-manager.js +84 -0
  8. package/dist/cache/index.js +16 -0
  9. package/dist/cache/redis-cluster-cache.js +557 -0
  10. package/dist/cli.js +2200 -0
  11. package/dist/compliance/audit-trail.js +68 -0
  12. package/dist/compliance/backup-verification.js +685 -0
  13. package/dist/compliance/breach-detector.js +505 -0
  14. package/dist/compliance/consent-record.js +227 -0
  15. package/dist/compliance/consent-versioning.js +331 -0
  16. package/dist/compliance/cross-border-log.js +530 -0
  17. package/dist/compliance/data-classifier.js +258 -0
  18. package/dist/compliance/data-lineage.js +565 -0
  19. package/dist/compliance/data-masker.js +303 -0
  20. package/dist/compliance/data-portability.js +265 -0
  21. package/dist/compliance/data-retention.js +195 -0
  22. package/dist/compliance/dsar-workflow.js +342 -0
  23. package/dist/compliance/field-encryption.js +223 -0
  24. package/dist/compliance/immutable-record.js +148 -0
  25. package/dist/compliance/index.js +260 -0
  26. package/dist/compliance/privacy-impact-assessment.js +364 -0
  27. package/dist/compliance/pseudonymization.js +269 -0
  28. package/dist/compliance/query-firewall.js +1182 -0
  29. package/dist/compliance/rate-limiter.js +580 -0
  30. package/dist/compliance/right-to-erasure.js +117 -0
  31. package/dist/compliance/row-level-security.js +246 -0
  32. package/dist/compliance/security-decorator.js +574 -0
  33. package/dist/compliance/security-monitor.js +525 -0
  34. package/dist/compliance/sensitive-data-discovery.js +476 -0
  35. package/dist/compliance/session-isolation.js +472 -0
  36. package/dist/compliance/tls-enforcer.js +108 -0
  37. package/dist/compliance/worm-storage.js +712 -0
  38. package/dist/connection-manager.js +198 -0
  39. package/dist/connection-pool.js +519 -0
  40. package/dist/decorators/audit.js +136 -0
  41. package/dist/decorators/belongs-to-many.js +115 -0
  42. package/dist/decorators/belongs-to.js +115 -0
  43. package/dist/decorators/check.js +435 -0
  44. package/dist/decorators/collate.js +329 -0
  45. package/dist/decorators/comment.js +205 -0
  46. package/dist/decorators/database-settings.js +236 -0
  47. package/dist/decorators/default.js +244 -0
  48. package/dist/decorators/encryption.js +235 -0
  49. package/dist/decorators/engine.js +97 -0
  50. package/dist/decorators/fk-constraints.js +594 -0
  51. package/dist/decorators/foreign-table.js +136 -0
  52. package/dist/decorators/generated.js +274 -0
  53. package/dist/decorators/has-many.js +127 -0
  54. package/dist/decorators/has-one.js +116 -0
  55. package/dist/decorators/hstore.js +129 -0
  56. package/dist/decorators/index.js +355 -0
  57. package/dist/decorators/json-column.js +83 -0
  58. package/dist/decorators/jsonb.js +101 -0
  59. package/dist/decorators/orm-decorators.js +425 -0
  60. package/dist/decorators/permissions.js +294 -0
  61. package/dist/decorators/procedure.js +210 -0
  62. package/dist/decorators/query-options.js +556 -0
  63. package/dist/decorators/range.js +167 -0
  64. package/dist/decorators/set-column.js +83 -0
  65. package/dist/decorators/spatial.js +114 -0
  66. package/dist/decorators/storage.js +580 -0
  67. package/dist/decorators/timezone.js +512 -0
  68. package/dist/decorators/trigger.js +90 -0
  69. package/dist/decorators/uuid.js +135 -0
  70. package/dist/decorators/view.js +258 -0
  71. package/dist/diagrams/chen-diagram.js +354 -0
  72. package/dist/diagrams/class-diagram.js +384 -0
  73. package/dist/diagrams/dependency-diagram.js +432 -0
  74. package/dist/diagrams/er-diagram.js +605 -0
  75. package/dist/diagrams/flow-diagram.js +394 -0
  76. package/dist/diagrams/gantt-diagram.js +411 -0
  77. package/dist/diagrams/index-diagram.js +353 -0
  78. package/dist/diagrams/index.js +184 -0
  79. package/dist/diagrams/migration-diagram.js +316 -0
  80. package/dist/diagrams/model-diagram.js +616 -0
  81. package/dist/diagrams/package-diagram.js +376 -0
  82. package/dist/diagrams/palette.js +85 -0
  83. package/dist/diagrams/relational-diagram.js +455 -0
  84. package/dist/diagrams/schemadoc-diagram.js +309 -0
  85. package/dist/diagrams/sequence-diagram.js +307 -0
  86. package/dist/diagrams/state-diagram.js +344 -0
  87. package/dist/diagrams/svg-dom.js +111 -0
  88. package/dist/diagrams/tree-diagram.js +250 -0
  89. package/dist/dialects/clickhouse/index.js +1742 -0
  90. package/dist/dialects/cockroachdb/index.js +4677 -0
  91. package/dist/dialects/cratedb/index.js +441 -0
  92. package/dist/dialects/databricks/index.js +517 -0
  93. package/dist/dialects/db2/index.js +2225 -0
  94. package/dist/dialects/dialect.js +720 -0
  95. package/dist/dialects/duckdb/index.js +2014 -0
  96. package/dist/dialects/exasol/index.js +357 -0
  97. package/dist/dialects/firebird/index.js +495 -0
  98. package/dist/dialects/greenplum/index.js +457 -0
  99. package/dist/dialects/hana/index.js +1741 -0
  100. package/dist/dialects/mariadb/index.js +3590 -0
  101. package/dist/dialects/mssql/index.js +2296 -0
  102. package/dist/dialects/mysql/index.js +4058 -0
  103. package/dist/dialects/oracle/index.js +2999 -0
  104. package/dist/dialects/postgres/index.js +5319 -0
  105. package/dist/dialects/query-stream-helper.js +152 -0
  106. package/dist/dialects/questdb/index.js +433 -0
  107. package/dist/dialects/redshift/index.js +2277 -0
  108. package/dist/dialects/singlestore/index.js +354 -0
  109. package/dist/dialects/snowflake/index.js +2082 -0
  110. package/dist/dialects/spanner/index.js +1768 -0
  111. package/dist/dialects/sqlite/index.js +3382 -0
  112. package/dist/dialects/tidb/index.js +377 -0
  113. package/dist/dialects/timescaledb/index.js +164 -0
  114. package/dist/dialects/trino/index.js +420 -0
  115. package/dist/dialects/turso/index.js +227 -0
  116. package/dist/dialects/vertica/index.js +317 -0
  117. package/dist/dialects/yugabytedb/index.js +424 -0
  118. package/dist/errors/index.js +472 -0
  119. package/dist/errors/utils.js +340 -0
  120. package/dist/errors.js +21 -0
  121. package/dist/extensions/catalog/cloud-warehouse-features.js +207 -0
  122. package/dist/extensions/catalog/mssql-features.js +147 -0
  123. package/dist/extensions/catalog/mysql-mariadb-plugins.js +229 -0
  124. package/dist/extensions/catalog/oracle-db2-features.js +196 -0
  125. package/dist/extensions/catalog/postgres-extensions.js +516 -0
  126. package/dist/extensions/index.js +71 -0
  127. package/dist/extensions/types.js +13 -0
  128. package/dist/foreign-data.js +173 -0
  129. package/dist/hooks/hooks-manager.js +350 -0
  130. package/dist/hooks/index.js +37 -0
  131. package/dist/index.js +463 -0
  132. package/dist/logging.js +335 -0
  133. package/dist/migrations/index.js +40 -0
  134. package/dist/migrations/migration.js +196 -0
  135. package/dist/migrations/migrator.js +411 -0
  136. package/dist/migrations/prormmigration.js +275 -0
  137. package/dist/migrations/query-interface.js +435 -0
  138. package/dist/migrations/seeder.js +353 -0
  139. package/dist/models/associations.js +852 -0
  140. package/dist/models/constraints.js +288 -0
  141. package/dist/models/data-types.js +2518 -0
  142. package/dist/models/decorators.js +445 -0
  143. package/dist/models/index.js +33 -0
  144. package/dist/models/indexes.js +531 -0
  145. package/dist/models/methods.js +382 -0
  146. package/dist/models/model-manager.js +103 -0
  147. package/dist/models/model.js +5349 -0
  148. package/dist/models/operators.js +67 -0
  149. package/dist/models/scopes.js +189 -0
  150. package/dist/models/typescript-types.js +26 -0
  151. package/dist/nosql/aerospike/index.js +205 -0
  152. package/dist/nosql/allegrograph/index.js +169 -0
  153. package/dist/nosql/arangodb/index.js +364 -0
  154. package/dist/nosql/azure-blob/index.js +206 -0
  155. package/dist/nosql/beanstalkd/index.js +231 -0
  156. package/dist/nosql/beequeue/index.js +210 -0
  157. package/dist/nosql/bigchaindb/index.js +195 -0
  158. package/dist/nosql/bigtable/index.js +224 -0
  159. package/dist/nosql/blazegraph/index.js +173 -0
  160. package/dist/nosql/bullmq/index.js +191 -0
  161. package/dist/nosql/cassandra/index.js +174 -0
  162. package/dist/nosql/chroma/index.js +190 -0
  163. package/dist/nosql/cloudflare-kv/index.js +220 -0
  164. package/dist/nosql/coherence/index.js +200 -0
  165. package/dist/nosql/cosmosdb/index.js +157 -0
  166. package/dist/nosql/couchbase/index.js +213 -0
  167. package/dist/nosql/dax/index.js +212 -0
  168. package/dist/nosql/deno-kv/index.js +206 -0
  169. package/dist/nosql/dgraph/index.js +171 -0
  170. package/dist/nosql/doris/index.js +169 -0
  171. package/dist/nosql/druid/index.js +162 -0
  172. package/dist/nosql/dynamodb/index.js +937 -0
  173. package/dist/nosql/elasticsearch/index.js +377 -0
  174. package/dist/nosql/etcd/index.js +502 -0
  175. package/dist/nosql/eventhubs/index.js +213 -0
  176. package/dist/nosql/eventstore/index.js +254 -0
  177. package/dist/nosql/faunadb/index.js +188 -0
  178. package/dist/nosql/firestore/index.js +177 -0
  179. package/dist/nosql/fluree/index.js +148 -0
  180. package/dist/nosql/fuseki/index.js +170 -0
  181. package/dist/nosql/gcs/index.js +172 -0
  182. package/dist/nosql/gearman/index.js +160 -0
  183. package/dist/nosql/geode/index.js +196 -0
  184. package/dist/nosql/graphdb/index.js +169 -0
  185. package/dist/nosql/graylog/index.js +188 -0
  186. package/dist/nosql/gridgain/index.js +171 -0
  187. package/dist/nosql/hazelcast/index.js +162 -0
  188. package/dist/nosql/hbase/index.js +230 -0
  189. package/dist/nosql/ignite/index.js +173 -0
  190. package/dist/nosql/immudb/index.js +184 -0
  191. package/dist/nosql/index.js +232 -0
  192. package/dist/nosql/infinispan/index.js +200 -0
  193. package/dist/nosql/influxdb/index.js +0 -0
  194. package/dist/nosql/kafka/index.js +234 -0
  195. package/dist/nosql/keyspaces/index.js +189 -0
  196. package/dist/nosql/kinesis/index.js +253 -0
  197. package/dist/nosql/leveldb/index.js +153 -0
  198. package/dist/nosql/lmdb/index.js +160 -0
  199. package/dist/nosql/loki/index.js +201 -0
  200. package/dist/nosql/marklogic/index.js +204 -0
  201. package/dist/nosql/materialize/index.js +145 -0
  202. package/dist/nosql/meilisearch/index.js +154 -0
  203. package/dist/nosql/memcached/index.js +223 -0
  204. package/dist/nosql/milvus/index.js +410 -0
  205. package/dist/nosql/minio/index.js +265 -0
  206. package/dist/nosql/momento/index.js +179 -0
  207. package/dist/nosql/mongodb/index.js +461 -0
  208. package/dist/nosql/nats/index.js +247 -0
  209. package/dist/nosql/nedb/index.js +164 -0
  210. package/dist/nosql/neo4j/index.js +450 -0
  211. package/dist/nosql/neptune/index.js +470 -0
  212. package/dist/nosql/nsq/index.js +200 -0
  213. package/dist/nosql/opensearch/index.js +186 -0
  214. package/dist/nosql/orientdb/index.js +175 -0
  215. package/dist/nosql/papertrail/index.js +200 -0
  216. package/dist/nosql/pinecone/index.js +0 -0
  217. package/dist/nosql/pinot/index.js +133 -0
  218. package/dist/nosql/pouchdb/index.js +172 -0
  219. package/dist/nosql/prometheus/index.js +174 -0
  220. package/dist/nosql/provendb/index.js +147 -0
  221. package/dist/nosql/pubsub/index.js +187 -0
  222. package/dist/nosql/pulsar/index.js +232 -0
  223. package/dist/nosql/qdrant/index.js +295 -0
  224. package/dist/nosql/qldb/index.js +192 -0
  225. package/dist/nosql/r2/index.js +281 -0
  226. package/dist/nosql/rabbitmq/index.js +237 -0
  227. package/dist/nosql/ravendb/index.js +175 -0
  228. package/dist/nosql/redis/index.js +607 -0
  229. package/dist/nosql/redpanda/index.js +237 -0
  230. package/dist/nosql/resque/index.js +203 -0
  231. package/dist/nosql/rethinkdb/index.js +232 -0
  232. package/dist/nosql/rocksdb/index.js +152 -0
  233. package/dist/nosql/rockset/index.js +126 -0
  234. package/dist/nosql/s3/index.js +298 -0
  235. package/dist/nosql/scylladb/index.js +178 -0
  236. package/dist/nosql/signoz/index.js +227 -0
  237. package/dist/nosql/sns/index.js +201 -0
  238. package/dist/nosql/solr/index.js +231 -0
  239. package/dist/nosql/splunk/index.js +227 -0
  240. package/dist/nosql/sqs/index.js +246 -0
  241. package/dist/nosql/stardog/index.js +169 -0
  242. package/dist/nosql/starrocks/index.js +170 -0
  243. package/dist/nosql/store.js +2 -0
  244. package/dist/nosql/sumologic/index.js +213 -0
  245. package/dist/nosql/surrealdb/index.js +179 -0
  246. package/dist/nosql/terminusdb/index.js +151 -0
  247. package/dist/nosql/tigergraph/index.js +469 -0
  248. package/dist/nosql/typesense/index.js +148 -0
  249. package/dist/nosql/unqlite/index.js +157 -0
  250. package/dist/nosql/upstash/index.js +167 -0
  251. package/dist/nosql/vercel-kv/index.js +166 -0
  252. package/dist/nosql/victoriametrics/index.js +213 -0
  253. package/dist/nosql/virtuoso/index.js +169 -0
  254. package/dist/nosql/weaviate/index.js +276 -0
  255. package/dist/operators/index.js +108 -0
  256. package/dist/operators.js +2690 -0
  257. package/dist/prisma-migrate/index.js +38 -0
  258. package/dist/prisma-migrate/migration-generator.js +125 -0
  259. package/dist/prisma-migrate/model-generator.js +172 -0
  260. package/dist/prisma-migrate/relations.js +100 -0
  261. package/dist/prisma-migrate/schema-parser.js +167 -0
  262. package/dist/prisma-migrate/type-mapper.js +40 -0
  263. package/dist/prorm.js +6832 -0
  264. package/dist/query-builders/cte-builder.js +80 -0
  265. package/dist/query-builders/functions/aggregate.js +390 -0
  266. package/dist/query-builders/functions/conditional.js +503 -0
  267. package/dist/query-builders/functions/datetime.js +695 -0
  268. package/dist/query-builders/functions/fulltext.js +439 -0
  269. package/dist/query-builders/functions/index.js +93 -0
  270. package/dist/query-builders/functions/json.js +427 -0
  271. package/dist/query-builders/functions/math.js +399 -0
  272. package/dist/query-builders/functions/string.js +518 -0
  273. package/dist/query-builders/functions/window.js +328 -0
  274. package/dist/query-builders/include-builder.js +323 -0
  275. package/dist/query-builders/index-expression-builder.js +242 -0
  276. package/dist/query-builders/index.js +161 -0
  277. package/dist/query-builders/insert-builder.js +164 -0
  278. package/dist/query-builders/model-helpers.js +38 -0
  279. package/dist/query-builders/order-limit-builder.js +239 -0
  280. package/dist/query-builders/sql-compiler.js +2040 -0
  281. package/dist/query-builders/subquery-builder.js +152 -0
  282. package/dist/query-builders/update-builder.js +182 -0
  283. package/dist/query-builders/view-builder.js +218 -0
  284. package/dist/query-builders/where-builder.js +1532 -0
  285. package/dist/query-interface.js +622 -0
  286. package/dist/query-optimizers/batch-optimizer.js +426 -0
  287. package/dist/query-optimizers/explain-plans.js +415 -0
  288. package/dist/query-optimizers/index.js +51 -0
  289. package/dist/query-optimizers/prepared-statement-cache.js +423 -0
  290. package/dist/query-optimizers/query-hints.js +438 -0
  291. package/dist/query-optimizers/query-optimizer.js +278 -0
  292. package/dist/query-optimizers/slow-query-logger.js +271 -0
  293. package/dist/replica-manager.js +507 -0
  294. package/dist/schema/index.js +15 -0
  295. package/dist/schema/migration-generator.js +374 -0
  296. package/dist/schema/schema-differ.js +549 -0
  297. package/dist/schema/types.js +6 -0
  298. package/dist/sql-constants.js +300 -0
  299. package/dist/sqlite-advanced.js +1047 -0
  300. package/dist/streams/index.js +12 -0
  301. package/dist/streams/transforms.js +178 -0
  302. package/dist/transaction.js +456 -0
  303. package/dist/types/index.js +180 -0
  304. package/dist/user-management.js +127 -0
  305. package/dist/utils/date.js +300 -0
  306. package/dist/utils/index.js +1079 -0
  307. package/dist/utils/string.js +161 -0
  308. package/dist/validators/index.js +19 -0
  309. package/dist/validators/validator.js +911 -0
  310. 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;