@osaas/client-db 0.4.6 → 0.5.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/README.md CHANGED
@@ -15,20 +15,22 @@ npm install --save @osaas/client-db
15
15
  Example code creating a Valkey database and use a Redis client to connect with it
16
16
 
17
17
  ```javascript
18
- import { Context, Log } from '@osaas/client-core';
19
- import { ValkeyDb } from '@osaas/client-db';
18
+ import { setupDatabase } from '@osaas/client-db';
20
19
  import Redis from 'ioredis';
21
20
 
22
21
  async function main() {
23
- const context = new Context();
22
+ const dbUrl = await setupDatabase('valkey', 'myvalkey', {
23
+ password: 'secret'
24
+ });
25
+ const client = new Redis(dbUrl);
24
26
  try {
25
- const db = new ValkeyDb({ context, name: 'mydb' });
26
- await db.init();
27
- const redisUrl = await db.getRedisUrl();
28
-
29
- const client = new Redis({ host: redisUrl.hostname, port: redisUrl.port });
27
+ await client.subscribe('messages');
28
+ console.log('Waiting for messages...');
29
+ client.on('message', (channel, message) => {
30
+ console.log(`Received message: ${message} from ${channel}`);
31
+ });
30
32
  } catch (err) {
31
- Log().error(err);
33
+ console.error('Error:', err);
32
34
  }
33
35
  }
34
36
 
package/lib/index.d.ts CHANGED
@@ -1,3 +1,46 @@
1
1
  /** @module @osaas/client-db */
2
2
  export { ValkeyDb } from './valkey';
3
+ export type DatabaseType = 'valkey' | 'postgres' | 'mariadb' | 'clickhouse' | 'couchdb';
4
+ export declare const DatabaseTypeToServiceId: Record<DatabaseType, string>;
5
+ export declare const DatabaseTypeToPort: Record<DatabaseType, number>;
6
+ export declare const DatabaseTypeToProtocol: Record<DatabaseType, string>;
7
+ export interface DatabaseOpts {
8
+ username?: string;
9
+ password?: string;
10
+ rootPassword?: string;
11
+ database?: string;
12
+ }
13
+ /**
14
+ * @typedef {object} DatabaseOpts
15
+ * @property {string} [username] - The username for the database
16
+ * @property {string} [password] - The password for the database
17
+ * @property {string} [rootPassword] - The root password for the database
18
+ * @property {string} [database] - The database name
19
+ */
20
+ /**
21
+ * Create a database instance if it does not exists
22
+ * and return the connection URL.
23
+ *
24
+ * @param {DatabaseType} type The type of the database.
25
+ * @param {string} name The name of the database instance.
26
+ * @param {DatabaseOpts} opts The options for the database.
27
+ * @returns The connection URL for the database.
28
+ *
29
+ * @example
30
+ * import { setupDatabase } from '@osaas/client-db';
31
+ * import Redis from 'ioredis';
32
+ *
33
+ * const dbUrl = await setupDatabase('valkey', 'myvalkey', { password: 'secret' });
34
+ * const client = new Redis(dbUrl);
35
+ * try {
36
+ * await client.subscribe('messages');
37
+ * console.log('Waiting for messages...');
38
+ * client.on('message', (channel, message) => {
39
+ * console.log(`Received message: ${message} from ${channel}`);
40
+ * });
41
+ * } catch (err) {
42
+ * console.error('Error:', err);
43
+ * }
44
+ */
45
+ export declare function setupDatabase(type: DatabaseType, name: string, opts: DatabaseOpts): Promise<string>;
3
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAqB/B,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,UAAU,GACV,SAAS,GACT,YAAY,GACZ,SAAS,CAAC;AAEd,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAMhE,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAM3D,CAAC;AACF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAM/D,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,mBA+HnB"}
package/lib/index.js CHANGED
@@ -1,7 +1,175 @@
1
1
  "use strict";
2
2
  /** @module @osaas/client-db */
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.ValkeyDb = void 0;
4
+ exports.setupDatabase = exports.DatabaseTypeToProtocol = exports.DatabaseTypeToPort = exports.DatabaseTypeToServiceId = exports.ValkeyDb = void 0;
5
+ const client_core_1 = require("@osaas/client-core");
6
+ const client_services_1 = require("@osaas/client-services");
5
7
  var valkey_1 = require("./valkey");
6
8
  Object.defineProperty(exports, "ValkeyDb", { enumerable: true, get: function () { return valkey_1.ValkeyDb; } });
9
+ exports.DatabaseTypeToServiceId = {
10
+ valkey: 'valkey-io-valkey',
11
+ postgres: 'birme-osc-postgresql',
12
+ mariadb: 'linuxserver-docker-mariadb',
13
+ clickhouse: 'clickhouse-clickhouse',
14
+ couchdb: 'apache-couchdb'
15
+ };
16
+ exports.DatabaseTypeToPort = {
17
+ valkey: 6379,
18
+ postgres: 5432,
19
+ mariadb: 3306,
20
+ clickhouse: 9000,
21
+ couchdb: 5984
22
+ };
23
+ exports.DatabaseTypeToProtocol = {
24
+ valkey: 'redis',
25
+ postgres: 'postgres',
26
+ mariadb: 'mysql',
27
+ clickhouse: 'clickhouse',
28
+ couchdb: 'https'
29
+ };
30
+ /**
31
+ * @typedef {object} DatabaseOpts
32
+ * @property {string} [username] - The username for the database
33
+ * @property {string} [password] - The password for the database
34
+ * @property {string} [rootPassword] - The root password for the database
35
+ * @property {string} [database] - The database name
36
+ */
37
+ /**
38
+ * Create a database instance if it does not exists
39
+ * and return the connection URL.
40
+ *
41
+ * @param {DatabaseType} type The type of the database.
42
+ * @param {string} name The name of the database instance.
43
+ * @param {DatabaseOpts} opts The options for the database.
44
+ * @returns The connection URL for the database.
45
+ *
46
+ * @example
47
+ * import { setupDatabase } from '@osaas/client-db';
48
+ * import Redis from 'ioredis';
49
+ *
50
+ * const dbUrl = await setupDatabase('valkey', 'myvalkey', { password: 'secret' });
51
+ * const client = new Redis(dbUrl);
52
+ * try {
53
+ * await client.subscribe('messages');
54
+ * console.log('Waiting for messages...');
55
+ * client.on('message', (channel, message) => {
56
+ * console.log(`Received message: ${message} from ${channel}`);
57
+ * });
58
+ * } catch (err) {
59
+ * console.error('Error:', err);
60
+ * }
61
+ */
62
+ async function setupDatabase(type, name, opts) {
63
+ const ctx = new client_core_1.Context();
64
+ let instance;
65
+ switch (type) {
66
+ case 'valkey':
67
+ instance = await (0, client_services_1.getValkeyIoValkeyInstance)(ctx, name);
68
+ break;
69
+ case 'postgres':
70
+ instance = await (0, client_services_1.getBirmeOscPostgresqlInstance)(ctx, name);
71
+ break;
72
+ case 'mariadb':
73
+ instance = await (0, client_services_1.getLinuxserverDockerMariadbInstance)(ctx, name);
74
+ break;
75
+ case 'clickhouse':
76
+ instance = await (0, client_services_1.getClickhouseClickhouseInstance)(ctx, name);
77
+ break;
78
+ case 'couchdb':
79
+ instance = await (0, client_services_1.getApacheCouchdbInstance)(ctx, name);
80
+ break;
81
+ default:
82
+ throw new Error(`Unsupported database type: ${type}`);
83
+ }
84
+ if (!instance) {
85
+ switch (type) {
86
+ case 'valkey':
87
+ {
88
+ const options = {
89
+ name,
90
+ Password: opts.password
91
+ };
92
+ instance = await (0, client_services_1.createValkeyIoValkeyInstance)(ctx, options);
93
+ }
94
+ break;
95
+ case 'postgres':
96
+ {
97
+ if (!opts.password) {
98
+ throw new Error('Password is required for postgres');
99
+ }
100
+ const options = {
101
+ name,
102
+ PostgresUser: opts.username,
103
+ PostgresPassword: opts.password,
104
+ PostgresDb: opts.database
105
+ };
106
+ instance = await (0, client_services_1.createBirmeOscPostgresqlInstance)(ctx, options);
107
+ }
108
+ break;
109
+ case 'mariadb':
110
+ {
111
+ if (!opts.rootPassword) {
112
+ throw new Error('Root password is required for mariadb');
113
+ }
114
+ const options = {
115
+ name,
116
+ RootPassword: opts.rootPassword,
117
+ Database: opts.database,
118
+ User: opts.username,
119
+ Password: opts.password
120
+ };
121
+ instance = await (0, client_services_1.createLinuxserverDockerMariadbInstance)(ctx, options);
122
+ }
123
+ break;
124
+ case 'clickhouse':
125
+ {
126
+ const options = {
127
+ name,
128
+ Password: opts.password,
129
+ User: opts.username,
130
+ Db: opts.database
131
+ };
132
+ instance = await (0, client_services_1.createClickhouseClickhouseInstance)(ctx, options);
133
+ }
134
+ break;
135
+ case 'couchdb':
136
+ {
137
+ if (!opts.rootPassword) {
138
+ throw new Error('Root password is required for couchdb');
139
+ }
140
+ const options = {
141
+ name,
142
+ AdminPassword: opts.rootPassword
143
+ };
144
+ instance = await (0, client_services_1.createApacheCouchdbInstance)(ctx, options);
145
+ }
146
+ break;
147
+ default:
148
+ throw new Error(`Unsupported database type: ${type}`);
149
+ }
150
+ }
151
+ switch (type) {
152
+ case 'valkey':
153
+ case 'postgres':
154
+ case 'mariadb':
155
+ case 'clickhouse': {
156
+ const token = await ctx.getServiceAccessToken(exports.DatabaseTypeToServiceId[type]);
157
+ const ports = await (0, client_core_1.getPortsForInstance)(ctx, exports.DatabaseTypeToServiceId[type], name, token);
158
+ const port = ports.find((p) => p.internalPort === exports.DatabaseTypeToPort[type]);
159
+ if (port) {
160
+ return `${exports.DatabaseTypeToProtocol[type]}://${opts.username || 'default'}${opts.password ? ':' + opts.password : ''}@${port.externalIp}:${port.externalPort}`;
161
+ }
162
+ throw new Error('Failed to get connection URL for database');
163
+ }
164
+ case 'couchdb': {
165
+ const url = new URL(instance.url);
166
+ url.password = instance.AdminPassword;
167
+ url.username = 'admin';
168
+ return url.toString();
169
+ }
170
+ default:
171
+ throw new Error(`Unsupported database type: ${type}`);
172
+ }
173
+ }
174
+ exports.setupDatabase = setupDatabase;
7
175
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,+BAA+B;;;AAE/B,mCAAoC;AAA3B,kGAAA,QAAQ,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@osaas/client-db",
3
- "version": "0.4.6",
3
+ "version": "0.5.0",
4
4
  "description": "Open Source Cloud Client SDK database library",
5
5
  "author": "Eyevinn Open Source Cloud <osc@eyevinn.se>",
6
6
  "homepage": "https://www.osaas.io",
@@ -26,11 +26,12 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@osaas/client-core": "^0.15.1",
29
- "@osaas/client-services": "^0.8.0",
30
- "chalk": "4.1.2"
29
+ "@osaas/client-services": "^0.9.0",
30
+ "chalk": "4.1.2",
31
+ "ioredis": "^5.5.0"
31
32
  },
32
33
  "publishConfig": {
33
34
  "access": "public"
34
35
  },
35
- "gitHead": "b41a58bd9be9c7c6b54ffd69f59ea36179792748"
36
+ "gitHead": "4413b4785d4361bf7e3d82908e9b81683d41eca9"
36
37
  }