@c9up/eon 0.2.1 → 0.2.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"EonProvider.d.ts","sourceRoot":"","sources":["../src/EonProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAa,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EACN,KAAK,iBAAiB,EAEtB,KAAK,UAAU,EACf,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE;QACV,SAAS,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,EAC5D,OAAO,EAAE,MAAM,OAAO,GACpB,IAAI,CAAC;QACR;;;;WAIG;QACH,OAAO,CAAC,CACP,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC9B,CAAC;IACF,MAAM,EAAE;QAAE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,iBAAiB,CAAC;CAC/D;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAC1B,MAAM,EAAE,mBAAmB,KACvB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,qBAAa,WAAW;;gBAQX,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,YAA2B;IAKpE,QAAQ,IAAI,IAAI;IAEV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmIrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAqE/B;AAID,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"EonProvider.d.ts","sourceRoot":"","sources":["../src/EonProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAa,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EACN,KAAK,iBAAiB,EAEtB,KAAK,UAAU,EACf,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE;QACV,SAAS,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,EAC5D,OAAO,EAAE,MAAM,OAAO,GACpB,IAAI,CAAC;QACR;;;;WAIG;QACH,OAAO,CAAC,CACP,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC9B,CAAC;IACF,MAAM,EAAE;QAAE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAA;KAAE,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,iBAAiB,CAAC;CAC/D;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAC1B,MAAM,EAAE,mBAAmB,KACvB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,qBAAa,WAAW;;gBAQX,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,YAA2B;IAKpE,QAAQ,IAAI,IAAI;IAEV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmIrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAgF/B;AAID,eAAe,WAAW,CAAC"}
@@ -11,6 +11,7 @@
11
11
  * never imports `@c9up/ream`. Any context exposing `config.get(key)` and
12
12
  * `container.singleton(token, factory)` satisfies the contract.
13
13
  */
14
+ import { ensureDatabase } from "./connection/ensureDatabase.js";
14
15
  import { connectWsEon } from "./connection/websocket.js";
15
16
  import { compileStatementNative, } from "./query/native.js";
16
17
  export class EonProvider {
@@ -43,7 +44,7 @@ export class EonProvider {
43
44
  // successes from failures without leaking the already-opened ones: on any
44
45
  // failure we close every success before rethrowing (no partial-boot leak).
45
46
  const entries = Object.entries(connections);
46
- const results = await Promise.allSettled(entries.map(([, settings]) => this.#connect(settings)));
47
+ const results = await Promise.allSettled(entries.map(([, settings]) => this.#openConnection(settings)));
47
48
  const failures = [];
48
49
  const successes = [];
49
50
  results.forEach((result, i) => {
@@ -164,6 +165,15 @@ export class EonProvider {
164
165
  throw new AggregateError(errors.map((e) => e.error), `EonProvider: ${errors.length} connection(s) failed to close — ${summary}`);
165
166
  }
166
167
  }
168
+ /**
169
+ * Open one connection, creating its database first when the connection asked
170
+ * for it. Both steps go through the injected connector, so a fake exercises
171
+ * the bootstrap exactly like the real transport does.
172
+ */
173
+ async #openConnection(settings) {
174
+ await ensureDatabase(settings, this.#connect);
175
+ return this.#connect(settings);
176
+ }
167
177
  /** Normalize the config into a `{ name → EonConnectionConfig }` map + default name. */
168
178
  #resolveConnections(config) {
169
179
  if (config.connections && Object.keys(config.connections).length > 0) {
@@ -181,6 +191,7 @@ export class EonProvider {
181
191
  user: config.user,
182
192
  password: config.password,
183
193
  database: config.database,
194
+ createDatabase: config.createDatabase,
184
195
  token: config.token,
185
196
  timeoutMs: config.timeoutMs,
186
197
  connectRetries: config.connectRetries,
@@ -1 +1 @@
1
- {"version":3,"file":"EonProvider.js","sourceRoot":"","sources":["../src/EonProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EonProvider.js","sourceRoot":"","sources":["../src/EonProvider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,UAAU,QAAQ;IACjB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,SAAS,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjE"}
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,UAAU,QAAQ;IACjB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,SAAS,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BjE"}
package/dist/configure.js CHANGED
@@ -13,6 +13,12 @@ export default defineConfig({
13
13
  user: process.env.TDENGINE_USER ?? 'root',
14
14
  password: process.env.TDENGINE_PASSWORD ?? '',
15
15
  database: process.env.TDENGINE_DATABASE ?? 'ream',
16
+
17
+ // TDengine's image has no POSTGRES_DB equivalent, so nothing outside the app
18
+ // creates this database — and a connection naming a missing one is refused,
19
+ // before any migration could create it. Precision is create-only, so set it
20
+ // here rather than repairing it later.
21
+ createDatabase: { precision: 'ms' },
16
22
  })
17
23
  `);
18
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB;IACjD,MAAM,QAAQ,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACjD,MAAM,QAAQ,CAAC,UAAU,CAAC;QACzB,YAAY,EAAE,qBAAqB;QACnC,aAAa,EAAE,MAAM;QACrB,iBAAiB,EAAE,UAAU;QAC7B,iBAAiB,EAAE,MAAM;KACzB,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,SAAS,CACvB,sBAAsB,EACtB;;;;;;;;CAQD,CACC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB;IACjD,MAAM,QAAQ,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACjD,MAAM,QAAQ,CAAC,UAAU,CAAC;QACzB,YAAY,EAAE,qBAAqB;QACnC,aAAa,EAAE,MAAM;QACrB,iBAAiB,EAAE,UAAU;QAC7B,iBAAiB,EAAE,MAAM;KACzB,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,SAAS,CACvB,sBAAsB,EACtB;;;;;;;;;;;;;;CAcD,CACC,CAAC;AACH,CAAC"}
@@ -7,6 +7,7 @@
7
7
  * No env-var reading happens here: the host `config.get("timeseries")` supplies
8
8
  * the resolved object (agnostic leaf — eon never touches `process.env`).
9
9
  */
10
+ import type { EonDatabaseOptions } from "../schema/CreateStableSpec.js";
10
11
  /** One TDengine connection's settings. */
11
12
  export interface EonConnectionConfig {
12
13
  /** taosAdapter WebSocket URL, e.g. `ws://localhost:6041`. */
@@ -17,6 +18,21 @@ export interface EonConnectionConfig {
17
18
  password?: string;
18
19
  /** Default database to `USE` on connect. */
19
20
  database?: string;
21
+ /**
22
+ * Create `database` before the first connection selects it — `true` for
23
+ * TDengine's defaults, or an options object for retention / precision.
24
+ *
25
+ * A deviation from atlas, which never creates a database: Postgres and MySQL
26
+ * images create it from `POSTGRES_DB` / `MYSQL_DATABASE`, and TDengine's has
27
+ * no equivalent. Without this, the migration that would create the database
28
+ * cannot run, because connecting to it is what fails. PRECISION and DURATION
29
+ * are create-only in TDengine, so the side holding the schema is the side
30
+ * that should create it.
31
+ *
32
+ * Unset (the default) — eon behaves like atlas and expects the database to
33
+ * already exist.
34
+ */
35
+ createDatabase?: boolean | EonDatabaseOptions;
20
36
  /** Cloud / bearer token auth (taosAdapter) — alternative to user/password. */
21
37
  token?: string;
22
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/connection/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IACnC,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAU,SAAQ,mBAAmB;IACrD,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClD;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAEzD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/connection/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAExE,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IACnC,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAAC;IAC9C,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAU,SAAQ,mBAAmB;IACrD,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClD;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAEzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/connection/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC7C,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/connection/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyEH,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC7C,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Create the configured database before the first connection selects it.
3
+ *
4
+ * atlas never creates a database — Lucid does not either, because the server
5
+ * image does it: Postgres reads `POSTGRES_DB`, MySQL reads `MYSQL_DATABASE`.
6
+ * TDengine's image has no such variable, so nothing outside the application
7
+ * knows the database should exist, and a connection that names it is refused
8
+ * before any migration can run. That circle — the migration that would create
9
+ * the database cannot run until the database exists — is why eon deviates here
10
+ * and atlas does not.
11
+ *
12
+ * PRECISION and DURATION are create-only in TDengine: a database made by hand
13
+ * at the wrong precision cannot be repaired with `ALTER`. So the side that owns
14
+ * the schema is the side that should create it.
15
+ *
16
+ * Opt-in through `createDatabase` — unset, eon behaves exactly like atlas and
17
+ * expects the database to be there.
18
+ */
19
+ import type { EonConnectionConfig } from "./config.js";
20
+ import type { EonConnection } from "./EonConnection.js";
21
+ /** How `ensureDatabase` opens its short-lived admin connection. */
22
+ export type EonConnector = (config: EonConnectionConfig) => Promise<EonConnection>;
23
+ /**
24
+ * Run `CREATE DATABASE IF NOT EXISTS` on a connection that selects no database,
25
+ * then close it. A no-op unless `config.createDatabase` is set.
26
+ *
27
+ * The statement is built through {@link EonSchema} rather than string-joined
28
+ * here, so the Rust compiler stays the only place that renders and validates
29
+ * TDengine DDL — including quoting the database name.
30
+ */
31
+ export declare function ensureDatabase(config: EonConnectionConfig, connect: EonConnector): Promise<void>;
32
+ //# sourceMappingURL=ensureDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureDatabase.d.ts","sourceRoot":"","sources":["../../src/connection/ensureDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG,CAC1B,MAAM,EAAE,mBAAmB,KACvB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Create the configured database before the first connection selects it.
3
+ *
4
+ * atlas never creates a database — Lucid does not either, because the server
5
+ * image does it: Postgres reads `POSTGRES_DB`, MySQL reads `MYSQL_DATABASE`.
6
+ * TDengine's image has no such variable, so nothing outside the application
7
+ * knows the database should exist, and a connection that names it is refused
8
+ * before any migration can run. That circle — the migration that would create
9
+ * the database cannot run until the database exists — is why eon deviates here
10
+ * and atlas does not.
11
+ *
12
+ * PRECISION and DURATION are create-only in TDengine: a database made by hand
13
+ * at the wrong precision cannot be repaired with `ALTER`. So the side that owns
14
+ * the schema is the side that should create it.
15
+ *
16
+ * Opt-in through `createDatabase` — unset, eon behaves exactly like atlas and
17
+ * expects the database to be there.
18
+ */
19
+ import { EonSchema } from "../schema/EonSchema.js";
20
+ /**
21
+ * Run `CREATE DATABASE IF NOT EXISTS` on a connection that selects no database,
22
+ * then close it. A no-op unless `config.createDatabase` is set.
23
+ *
24
+ * The statement is built through {@link EonSchema} rather than string-joined
25
+ * here, so the Rust compiler stays the only place that renders and validates
26
+ * TDengine DDL — including quoting the database name.
27
+ */
28
+ export async function ensureDatabase(config, connect) {
29
+ const requested = config.createDatabase;
30
+ if (requested === undefined || requested === false)
31
+ return;
32
+ const database = config.database;
33
+ if (database === undefined || database.length === 0) {
34
+ throw new Error("[eon] `createDatabase` is set but no `database` is configured — there is nothing to create.");
35
+ }
36
+ const schema = new EonSchema();
37
+ schema.createDatabase(database, requested === true ? {} : requested);
38
+ const statements = schema.toSQL();
39
+ // The admin connection deliberately drops `database`: the database it names
40
+ // does not exist yet, so selecting it is exactly what fails. `createDatabase`
41
+ // is dropped too — otherwise this would recurse.
42
+ const admin = {
43
+ url: config.url,
44
+ user: config.user,
45
+ password: config.password,
46
+ token: config.token,
47
+ timeoutMs: config.timeoutMs,
48
+ connectRetries: config.connectRetries,
49
+ connectBackoffMs: config.connectBackoffMs,
50
+ };
51
+ const conn = await connect(admin);
52
+ try {
53
+ for (const sql of statements) {
54
+ await conn.exec(sql);
55
+ }
56
+ }
57
+ finally {
58
+ await conn.close();
59
+ }
60
+ }
61
+ //# sourceMappingURL=ensureDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureDatabase.js","sourceRoot":"","sources":["../../src/connection/ensureDatabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AASnD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAA2B,EAC3B,OAAqB;IAErB,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;IACxC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO;IAE3D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACd,6FAA6F,CAC7F,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAElC,4EAA4E;IAC5E,8EAA8E;IAC9E,iDAAiD;IACjD,MAAM,KAAK,GAAwB;QAClC,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KACzC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC;QACJ,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;YAAS,CAAC;QACV,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import "reflect-metadata";
2
2
  export { defineConfig, type EonConfig, type EonConnectionConfig, } from "./connection/config.js";
3
3
  export { type EonBindKind, type EonBoundColumn, type EonChildBatch, type EonColumnarIngest, type EonConnection, EonConnectionError, type EonLineProtocol, type EonSchemalessOptions, type EonSchemalessPrecision, } from "./connection/EonConnection.js";
4
+ export { ensureDatabase } from "./connection/ensureDatabase.js";
4
5
  export { connectWsEon, destroyEonConnector, } from "./connection/websocket.js";
5
6
  export { Column, type EonColumnMetadata, type EonColumnOptions, type EonTagMetadata, type EonTagOptions, getColumnMetadata, getSuperTableMetadata, getTagMetadata, getTimestampColumn, SuperTable, type SuperTableMetadata, Tag, Timestamp, } from "./decorators/superTable.js";
6
7
  export type { EonAppContext, EonConnector, EonService, } from "./EonProvider.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import "reflect-metadata";
2
2
  export { defineConfig, } from "./connection/config.js";
3
3
  export { EonConnectionError, } from "./connection/EonConnection.js";
4
+ export { ensureDatabase } from "./connection/ensureDatabase.js";
4
5
  export { connectWsEon, destroyEonConnector, } from "./connection/websocket.js";
5
6
  export { Column, getColumnMetadata, getSuperTableMetadata, getTagMetadata, getTimestampColumn, SuperTable, Tag, Timestamp, } from "./decorators/superTable.js";
6
7
  export { EonProvider } from "./EonProvider.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EACN,YAAY,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAMN,kBAAkB,GAIlB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,YAAY,EACZ,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,MAAM,EAKN,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,UAAU,EAEV,GAAG,EACH,SAAS,GACT,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACN,kBAAkB,GAElB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACN,mBAAmB,EAEnB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EAGZ,UAAU,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEN,sBAAsB,EAEtB,gBAAgB,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EASN,eAAe,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,oBAAoB,GAEpB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAgBN,aAAa,GACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,uBAAuB,EACvB,qBAAqB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,kBAAkB,GAGlB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACN,kBAAkB,EAElB,iBAAiB,EACjB,SAAS,EACT,aAAa,GAEb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAEN,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,gBAAgB,GAIhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EACN,YAAY,GAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAMN,kBAAkB,GAIlB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACN,YAAY,EACZ,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,MAAM,EAKN,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,UAAU,EAEV,GAAG,EACH,SAAS,GACT,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACN,kBAAkB,GAElB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACN,mBAAmB,EAEnB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EAGZ,UAAU,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEN,sBAAsB,EAEtB,gBAAgB,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EASN,eAAe,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,oBAAoB,GAEpB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAgBN,aAAa,GACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,uBAAuB,EACvB,qBAAqB,GAErB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEN,kBAAkB,GAGlB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACN,kBAAkB,EAElB,iBAAiB,EACjB,SAAS,EACT,aAAa,GAEb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAEN,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,gBAAgB,GAIhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c9up/eon",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Eon — time-series data layer for the Ream framework (TDengine-backed)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,6 +14,7 @@
14
14
 
15
15
  import type { EonConfig, EonConnectionConfig } from "./connection/config.js";
16
16
  import type { EonConnection } from "./connection/EonConnection.js";
17
+ import { ensureDatabase } from "./connection/ensureDatabase.js";
17
18
  import { connectWsEon } from "./connection/websocket.js";
18
19
  import {
19
20
  type CompiledStatement,
@@ -100,7 +101,7 @@ export class EonProvider {
100
101
  // failure we close every success before rethrowing (no partial-boot leak).
101
102
  const entries = Object.entries(connections);
102
103
  const results = await Promise.allSettled(
103
- entries.map(([, settings]) => this.#connect(settings)),
104
+ entries.map(([, settings]) => this.#openConnection(settings)),
104
105
  );
105
106
  const failures: Array<{ name: string; error: unknown }> = [];
106
107
  const successes: Array<{ name: string; conn: EonConnection }> = [];
@@ -247,6 +248,16 @@ export class EonProvider {
247
248
  }
248
249
  }
249
250
 
251
+ /**
252
+ * Open one connection, creating its database first when the connection asked
253
+ * for it. Both steps go through the injected connector, so a fake exercises
254
+ * the bootstrap exactly like the real transport does.
255
+ */
256
+ async #openConnection(settings: EonConnectionConfig): Promise<EonConnection> {
257
+ await ensureDatabase(settings, this.#connect);
258
+ return this.#connect(settings);
259
+ }
260
+
250
261
  /** Normalize the config into a `{ name → EonConnectionConfig }` map + default name. */
251
262
  #resolveConnections(config: EonConfig): {
252
263
  connections: Record<string, EonConnectionConfig>;
@@ -267,6 +278,7 @@ export class EonProvider {
267
278
  user: config.user,
268
279
  password: config.password,
269
280
  database: config.database,
281
+ createDatabase: config.createDatabase,
270
282
  token: config.token,
271
283
  timeoutMs: config.timeoutMs,
272
284
  connectRetries: config.connectRetries,
package/src/configure.ts CHANGED
@@ -32,6 +32,12 @@ export default defineConfig({
32
32
  user: process.env.TDENGINE_USER ?? 'root',
33
33
  password: process.env.TDENGINE_PASSWORD ?? '',
34
34
  database: process.env.TDENGINE_DATABASE ?? 'ream',
35
+
36
+ // TDengine's image has no POSTGRES_DB equivalent, so nothing outside the app
37
+ // creates this database — and a connection naming a missing one is refused,
38
+ // before any migration could create it. Precision is create-only, so set it
39
+ // here rather than repairing it later.
40
+ createDatabase: { precision: 'ms' },
35
41
  })
36
42
  `,
37
43
  );
@@ -8,6 +8,8 @@
8
8
  * the resolved object (agnostic leaf — eon never touches `process.env`).
9
9
  */
10
10
 
11
+ import type { EonDatabaseOptions } from "../schema/CreateStableSpec.js";
12
+
11
13
  /** One TDengine connection's settings. */
12
14
  export interface EonConnectionConfig {
13
15
  /** taosAdapter WebSocket URL, e.g. `ws://localhost:6041`. */
@@ -18,6 +20,21 @@ export interface EonConnectionConfig {
18
20
  password?: string;
19
21
  /** Default database to `USE` on connect. */
20
22
  database?: string;
23
+ /**
24
+ * Create `database` before the first connection selects it — `true` for
25
+ * TDengine's defaults, or an options object for retention / precision.
26
+ *
27
+ * A deviation from atlas, which never creates a database: Postgres and MySQL
28
+ * images create it from `POSTGRES_DB` / `MYSQL_DATABASE`, and TDengine's has
29
+ * no equivalent. Without this, the migration that would create the database
30
+ * cannot run, because connecting to it is what fails. PRECISION and DURATION
31
+ * are create-only in TDengine, so the side holding the schema is the side
32
+ * that should create it.
33
+ *
34
+ * Unset (the default) — eon behaves like atlas and expects the database to
35
+ * already exist.
36
+ */
37
+ createDatabase?: boolean | EonDatabaseOptions;
21
38
  /** Cloud / bearer token auth (taosAdapter) — alternative to user/password. */
22
39
  token?: string;
23
40
  /**
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Create the configured database before the first connection selects it.
3
+ *
4
+ * atlas never creates a database — Lucid does not either, because the server
5
+ * image does it: Postgres reads `POSTGRES_DB`, MySQL reads `MYSQL_DATABASE`.
6
+ * TDengine's image has no such variable, so nothing outside the application
7
+ * knows the database should exist, and a connection that names it is refused
8
+ * before any migration can run. That circle — the migration that would create
9
+ * the database cannot run until the database exists — is why eon deviates here
10
+ * and atlas does not.
11
+ *
12
+ * PRECISION and DURATION are create-only in TDengine: a database made by hand
13
+ * at the wrong precision cannot be repaired with `ALTER`. So the side that owns
14
+ * the schema is the side that should create it.
15
+ *
16
+ * Opt-in through `createDatabase` — unset, eon behaves exactly like atlas and
17
+ * expects the database to be there.
18
+ */
19
+
20
+ import { EonSchema } from "../schema/EonSchema.js";
21
+ import type { EonConnectionConfig } from "./config.js";
22
+ import type { EonConnection } from "./EonConnection.js";
23
+
24
+ /** How `ensureDatabase` opens its short-lived admin connection. */
25
+ export type EonConnector = (
26
+ config: EonConnectionConfig,
27
+ ) => Promise<EonConnection>;
28
+
29
+ /**
30
+ * Run `CREATE DATABASE IF NOT EXISTS` on a connection that selects no database,
31
+ * then close it. A no-op unless `config.createDatabase` is set.
32
+ *
33
+ * The statement is built through {@link EonSchema} rather than string-joined
34
+ * here, so the Rust compiler stays the only place that renders and validates
35
+ * TDengine DDL — including quoting the database name.
36
+ */
37
+ export async function ensureDatabase(
38
+ config: EonConnectionConfig,
39
+ connect: EonConnector,
40
+ ): Promise<void> {
41
+ const requested = config.createDatabase;
42
+ if (requested === undefined || requested === false) return;
43
+
44
+ const database = config.database;
45
+ if (database === undefined || database.length === 0) {
46
+ throw new Error(
47
+ "[eon] `createDatabase` is set but no `database` is configured — there is nothing to create.",
48
+ );
49
+ }
50
+
51
+ const schema = new EonSchema();
52
+ schema.createDatabase(database, requested === true ? {} : requested);
53
+ const statements = schema.toSQL();
54
+
55
+ // The admin connection deliberately drops `database`: the database it names
56
+ // does not exist yet, so selecting it is exactly what fails. `createDatabase`
57
+ // is dropped too — otherwise this would recurse.
58
+ const admin: EonConnectionConfig = {
59
+ url: config.url,
60
+ user: config.user,
61
+ password: config.password,
62
+ token: config.token,
63
+ timeoutMs: config.timeoutMs,
64
+ connectRetries: config.connectRetries,
65
+ connectBackoffMs: config.connectBackoffMs,
66
+ };
67
+
68
+ const conn = await connect(admin);
69
+ try {
70
+ for (const sql of statements) {
71
+ await conn.exec(sql);
72
+ }
73
+ } finally {
74
+ await conn.close();
75
+ }
76
+ }
package/src/index.ts CHANGED
@@ -16,6 +16,7 @@ export {
16
16
  type EonSchemalessOptions,
17
17
  type EonSchemalessPrecision,
18
18
  } from "./connection/EonConnection.js";
19
+ export { ensureDatabase } from "./connection/ensureDatabase.js";
19
20
  export {
20
21
  connectWsEon,
21
22
  destroyEonConnector,