toridb 1.0.3 → 1.0.4
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/dist/toridb.esm.js +47 -10
- package/dist/toridb.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/toridb.esm.js
CHANGED
|
@@ -215,6 +215,15 @@ class RespParser {
|
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
class ToriDBError extends Error {
|
|
219
|
+
constructor(message, code, originalError = null) {
|
|
220
|
+
super(message);
|
|
221
|
+
this.name = "ToriDBError";
|
|
222
|
+
this.code = code;
|
|
223
|
+
this.originalError = originalError;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
218
227
|
/**
|
|
219
228
|
* Main client class for interacting with ToriDB.
|
|
220
229
|
* Supports Key-Value, NoSQL structures (List, Set, Hash, JSON), and Relational modeling.
|
|
@@ -288,7 +297,9 @@ class ToriDB {
|
|
|
288
297
|
while ((response = this.parser.parseNext()) !== undefined) {
|
|
289
298
|
const req = this.pendingRequests.shift();
|
|
290
299
|
if (req) {
|
|
291
|
-
if (response instanceof Error)
|
|
300
|
+
if (response instanceof Error) {
|
|
301
|
+
req.reject(new ToriDBError(response.message, "SERVER_ERROR"));
|
|
302
|
+
}
|
|
292
303
|
else req.resolve(response);
|
|
293
304
|
}
|
|
294
305
|
}
|
|
@@ -296,12 +307,18 @@ class ToriDB {
|
|
|
296
307
|
|
|
297
308
|
this.socket.on('error', (err) => {
|
|
298
309
|
this.isConnected = false;
|
|
299
|
-
|
|
310
|
+
const wrapped = new ToriDBError(`Socket Error: ${err.message}`, "SOCKET_ERROR", err);
|
|
311
|
+
this.pendingRequests.forEach(req => req.reject(wrapped));
|
|
300
312
|
this.pendingRequests = [];
|
|
301
313
|
});
|
|
302
314
|
|
|
303
315
|
this.socket.on('close', () => {
|
|
304
316
|
this.isConnected = false;
|
|
317
|
+
if (this.pendingRequests.length > 0) {
|
|
318
|
+
const err = new ToriDBError("Connection closed unexpectedly", "CONNECTION_CLOSED");
|
|
319
|
+
this.pendingRequests.forEach(req => req.reject(err));
|
|
320
|
+
this.pendingRequests = [];
|
|
321
|
+
}
|
|
305
322
|
});
|
|
306
323
|
}
|
|
307
324
|
|
|
@@ -313,14 +330,20 @@ class ToriDB {
|
|
|
313
330
|
async connect() {
|
|
314
331
|
if (this.isConnected) return;
|
|
315
332
|
return new Promise((resolve, reject) => {
|
|
333
|
+
const onError = (err) => {
|
|
334
|
+
reject(new ToriDBError(`Connection failed: ${err.message}`, "CONNECTION_FAILED", err));
|
|
335
|
+
};
|
|
336
|
+
this.socket.once('error', onError);
|
|
337
|
+
|
|
316
338
|
this.socket.connect(this.port, this.host, async () => {
|
|
339
|
+
this.socket.removeListener('error', onError);
|
|
317
340
|
this.isConnected = true;
|
|
318
341
|
if (this.password) {
|
|
319
342
|
try {
|
|
320
343
|
await this.execute("AUTH", this.user, this.password);
|
|
321
344
|
} catch (e) {
|
|
322
345
|
this.disconnect();
|
|
323
|
-
return reject(new
|
|
346
|
+
return reject(new ToriDBError(`Authentication failed: ${e.message}`, "AUTH_FAILED", e));
|
|
324
347
|
}
|
|
325
348
|
}
|
|
326
349
|
if (this._dbToSelect) {
|
|
@@ -333,7 +356,6 @@ class ToriDB {
|
|
|
333
356
|
}
|
|
334
357
|
resolve();
|
|
335
358
|
});
|
|
336
|
-
this.socket.once('error', reject);
|
|
337
359
|
});
|
|
338
360
|
}
|
|
339
361
|
|
|
@@ -352,12 +374,16 @@ class ToriDB {
|
|
|
352
374
|
* @returns {ToriDB} This instance for chaining.
|
|
353
375
|
*/
|
|
354
376
|
dbName(name) {
|
|
355
|
-
if (this._dbToSelect && this._dbToSelect !== "data")
|
|
356
|
-
console.warn("Database already specified in URI. Programmatic selection ignored.");
|
|
357
|
-
return this;
|
|
358
|
-
}
|
|
377
|
+
if (this._dbToSelect && this._dbToSelect !== "data") ;
|
|
359
378
|
this.db = name;
|
|
360
379
|
this._dbToSelect = name;
|
|
380
|
+
|
|
381
|
+
if (this.isConnected) {
|
|
382
|
+
// Send USE command immediately to preserve order
|
|
383
|
+
this.execute("USE", name).catch(e => {
|
|
384
|
+
console.warn(`Failed to switch to database ${name}: ${e.message}`);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
361
387
|
return this;
|
|
362
388
|
}
|
|
363
389
|
|
|
@@ -367,10 +393,21 @@ class ToriDB {
|
|
|
367
393
|
* @returns {Promise<any>} The server response.
|
|
368
394
|
*/
|
|
369
395
|
async execute(...args) {
|
|
370
|
-
if (!this.isConnected)
|
|
396
|
+
if (!this.isConnected) {
|
|
397
|
+
try {
|
|
398
|
+
await this.connect();
|
|
399
|
+
} catch (e) {
|
|
400
|
+
throw e;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
371
403
|
return new Promise((resolve, reject) => {
|
|
372
404
|
this.pendingRequests.push({ resolve, reject });
|
|
373
|
-
|
|
405
|
+
try {
|
|
406
|
+
this.socket.write(RespParser.encode(args));
|
|
407
|
+
} catch (e) {
|
|
408
|
+
this.pendingRequests.pop();
|
|
409
|
+
reject(new ToriDBError(`Failed to send command: ${e.message}`, "SEND_ERROR", e));
|
|
410
|
+
}
|
|
374
411
|
});
|
|
375
412
|
}
|
|
376
413
|
|
package/dist/toridb.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toridb.esm.js","sources":["../src/compiler.js","../src/resp.js","../src/sdk.js"],"sourcesContent":["/**\r\n * Command Compiler: Translates JS Objects and Types to ToriDB DSL\r\n */\r\nclass Compiler {\r\n /**\r\n * Translates a JS Object to a ToriDB Filter string.\r\n * { age: { $gt: 18 }, status: 'active' } -> \"age > 18 AND status = 'active'\"\r\n */\r\n static compileFilter(filter) {\r\n if (!filter || typeof filter !== 'object') return \"\";\r\n\r\n const parts = [];\r\n for (const [key, value] of Object.entries(filter)) {\r\n if (key === '$or' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" OR \")})`);\r\n } else if (key === '$and' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" AND \")})`);\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Handle operators: { $gt: 10 }\r\n for (const [op, val] of Object.entries(value)) {\r\n const symbol = this._mapOperator(op);\r\n parts.push(`${key} ${symbol} ${this._escape(val)}`);\r\n }\r\n } else {\r\n // Basic equality\r\n parts.push(`${key} = ${this._escape(value)}`);\r\n }\r\n }\r\n return parts.join(\" AND \");\r\n }\r\n\r\n /**\r\n * Translates a Blueprint definition to ToriDB Table Definition format.\r\n * { id: { type: 'INT', primary: true }, user_id: { type: 'INT', references: 'users.id' } }\r\n * -> \"id:INT:pk user_id:INT:fk(users.id)\"\r\n */\r\n static compileBlueprint(name, blueprint) {\r\n const cols = [];\r\n for (const [colName, config] of Object.entries(blueprint)) {\r\n let type = typeof config === 'string' ? config : config.type;\r\n let pk = (config.primary || config.is_pk) ? \":pk\" : \"\";\r\n let fk = \"\";\r\n\r\n if (config.references) {\r\n const [refTable, refCol] = config.references.split('.');\r\n fk = `:fk(${refTable}.${refCol})`;\r\n }\r\n\r\n // Auto-map JS types if not specified as SQL types\r\n if (type === 'Number') type = 'INT';\r\n if (type === 'String') type = 'STRING';\r\n if (type === 'Object') type = 'JSON';\r\n if (type === 'Boolean') type = 'BOOL';\r\n\r\n cols.push(`${colName}:${type}${pk}${fk}`);\r\n }\r\n return `CREATE TABLE ${name} ${cols.join(\" \")}`;\r\n }\r\n\r\n /**\r\n * Maps MongoDB-style operators to ToriDB SQL operators.\r\n * @param {string} op - The operator to map (e.g., \"$gt\").\r\n * @returns {string} The corresponding SQL operator or the operator itself if no map exists.\r\n * @private\r\n */\r\n static _mapOperator(op) {\r\n const maps = {\r\n '$gt': '>', '$gte': '>=', '$lt': '<', '$lte': '<=',\r\n '$ne': '!=', '$eq': '=', '$like': 'LIKE', '$in': 'IN'\r\n };\r\n return maps[op] || op;\r\n }\r\n\r\n /**\r\n * Escapes values for safe inclusion in ToriDB queries.\r\n * Handles strings, arrays, and objects (JSON).\r\n * @param {any} val - The value to escape.\r\n * @returns {string} The escaped and formatted value string.\r\n * @private\r\n */\r\n static _escape(val) {\r\n if (typeof val === 'string') {\r\n // If it's a list for IN operator, don't wrap the whole thing in quotes\r\n // but wrap individual elements if they are strings.\r\n // However, the server's IN expects (val1,val2)\r\n return `\"${val.replace(/\"/g, '\\\\\"')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n return `(${val.map(v => this._escape(v)).join(\",\")})`;\r\n }\r\n if (typeof val === 'object' && val !== null) return `\"${JSON.stringify(val).replace(/\"/g, '\\\\\"')}\"`;\r\n return String(val);\r\n }\r\n}\r\n\r\nexport { Compiler };","/**\r\n * High-Performance RESP (REdis Serialization Protocol) Parser\r\n * Handles Simple Strings, Errors, Integers, Bulk Strings, and Nested Arrays.\r\n */\r\nclass RespParser {\r\n /**\r\n * Initializes or resets the parser state.\r\n */\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Clears the current data buffer.\r\n */\r\n reset() {\r\n this.buffer = Buffer.alloc(0);\r\n }\r\n\r\n /**\r\n * Feeds raw binary data into the parser's buffer.\r\n * @param {Buffer} data - The raw data received from the socket.\r\n */\r\n feed(data) {\r\n this.buffer = Buffer.concat([this.buffer, data]);\r\n }\r\n\r\n /**\r\n * Tries to parse the next complete RESP value from the buffer.\r\n * @returns {any | undefined} The parsed value or undefined if incomplete.\r\n */\r\n parseNext() {\r\n if (this.buffer.length === 0) return undefined;\r\n\r\n const result = this._decode(0);\r\n if (result) {\r\n this.buffer = this.buffer.slice(result.bytesRead);\r\n return result.value;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Decodes a single RESP value from the buffer starting at a given offset.\r\n * Internal recursive method for handling nested arrays and bulk strings.\r\n * @param {number} offset - The buffer offset to start parsing from.\r\n * @returns {Object|null} An object with {value, bytesRead} or null if incomplete.\r\n * @private\r\n */\r\n _decode(offset) {\r\n if (offset >= this.buffer.length) return null;\r\n\r\n const prefix = this.buffer[offset];\r\n const lineEnd = this.buffer.indexOf('\\r\\n', offset);\r\n if (lineEnd === -1) return null;\r\n\r\n const content = this.buffer.slice(offset + 1, lineEnd).toString();\r\n const bytesBeforeData = lineEnd - offset + 2;\r\n\r\n switch (prefix) {\r\n case 43: // '+' Simple String\r\n return { value: content, bytesRead: bytesBeforeData };\r\n\r\n case 45: // '-' Error\r\n return { value: new Error(content), bytesRead: bytesBeforeData };\r\n\r\n case 58: // ':' Integer\r\n return { value: parseInt(content, 10), bytesRead: bytesBeforeData };\r\n\r\n case 36: { // '$' Bulk String\r\n const length = parseInt(content, 10);\r\n if (length === -1) return { value: null, bytesRead: bytesBeforeData };\r\n \r\n const dataEnd = lineEnd + 2 + length;\r\n if (this.buffer.length < dataEnd + 2) return null;\r\n \r\n const value = this.buffer.slice(lineEnd + 2, dataEnd).toString();\r\n // Verify CRLF\r\n if (this.buffer[dataEnd] !== 13 || this.buffer[dataEnd + 1] !== 10) {\r\n throw new Error(\"Invalid Bulk String terminator\");\r\n }\r\n return { value, bytesRead: bytesBeforeData + length + 2 };\r\n }\r\n\r\n case 42: { // '*' Array\r\n const count = parseInt(content, 10);\r\n if (count === -1) return { value: null, bytesRead: bytesBeforeData };\r\n if (count === 0) return { value: [], bytesRead: bytesBeforeData };\r\n\r\n let totalRead = bytesBeforeData;\r\n const items = [];\r\n for (let i = 0; i < count; i++) {\r\n const item = this._decode(offset + totalRead);\r\n if (!item) return null;\r\n items.push(item.value);\r\n totalRead += item.bytesRead;\r\n }\r\n return { value: items, bytesRead: totalRead };\r\n }\r\n\r\n default:\r\n // Attempt to handle unexpected data as a simple string line\r\n return { value: content, bytesRead: bytesBeforeData };\r\n }\r\n }\r\n\r\n /**\r\n * Serializes a command into a RESP Array.\r\n * @param {string[]} args \r\n */\r\n static encode(args) {\r\n let res = `*${args.length}\\r\\n`;\r\n for (const arg of args) {\r\n const s = String(arg);\r\n res += `$${Buffer.byteLength(s)}\\r\\n${s}\\r\\n`;\r\n }\r\n return Buffer.from(res);\r\n }\r\n}\r\n\r\nexport { RespParser };\r\n","import net from 'net';\r\nimport { Compiler } from './compiler.js';\r\nimport { RespParser } from './resp.js';\r\n\r\n/**\r\n * Main client class for interacting with ToriDB.\r\n * Supports Key-Value, NoSQL structures (List, Set, Hash, JSON), and Relational modeling.\r\n */\r\nclass ToriDB {\r\n /**\r\n * Represents a database schema definition.\r\n */\r\n static Blueprint = class {\r\n /**\r\n * @param {Object} definition - The schema definition object.\r\n */\r\n constructor(definition) {\r\n this.definition = definition;\r\n }\r\n };\r\n\r\n /**\r\n * Creates a new ToriDB client instance.\r\n * @param {string} [uri=\"db://127.0.0.1:8569\"] - Connection URI (e.g., db://user:pass@host:port/db)\r\n */\r\n constructor(uri = \"db://127.0.0.1:8569\") {\r\n this.host = \"127.0.0.1\";\r\n this.port = 8569;\r\n this.user = \"default\";\r\n this.password = null;\r\n this.db = \"data\";\r\n this._dbToSelect = null;\r\n this._parseUri(uri);\r\n\r\n this.parser = new RespParser();\r\n this.socket = new net.Socket();\r\n this.isConnected = false;\r\n this.pendingRequests = [];\r\n\r\n this._setupSocket();\r\n\r\n // Managers\r\n this.system = new SystemManager(this);\r\n }\r\n\r\n /**\r\n * Parses the connection URI.\r\n * @param {string} uri - The connection URI to parse.\r\n * @private\r\n */\r\n _parseUri(uri) {\r\n const regex = /^db:\\/\\/(?:(?:([^:]+):([^@+]+)[@+])?)([^:/\\?]+)(?::(\\d+))?(?:(?:\\/([^?]*))?)?(?:\\?(.*))?/;\r\n const match = uri.match(regex);\r\n if (match) {\r\n this.user = match[1] || \"default\";\r\n this.password = match[2] || null;\r\n this.host = match[3];\r\n this.port = parseInt(match[4], 10) || 8569;\r\n const dbFromUri = (match[5] || \"\").replace(/\\/+$/, \"\");\r\n if (dbFromUri) {\r\n this.db = dbFromUri;\r\n this._dbToSelect = dbFromUri;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets up socket events for data handling, errors, and closure.\r\n * @private\r\n */\r\n _setupSocket() {\r\n this.socket.on('data', (data) => {\r\n this.parser.feed(data);\r\n let response;\r\n while ((response = this.parser.parseNext()) !== undefined) {\r\n const req = this.pendingRequests.shift();\r\n if (req) {\r\n if (response instanceof Error) req.reject(response);\r\n else req.resolve(response);\r\n }\r\n }\r\n });\r\n\r\n this.socket.on('error', (err) => {\r\n this.isConnected = false;\r\n this.pendingRequests.forEach(req => req.reject(err));\r\n this.pendingRequests = [];\r\n });\r\n\r\n this.socket.on('close', () => {\r\n this.isConnected = false;\r\n });\r\n }\r\n\r\n /**\r\n * Establishes a connection to the ToriDB server.\r\n * @returns {Promise<void>}\r\n * @throws {Error} If connection or authentication fails.\r\n */\r\n async connect() {\r\n if (this.isConnected) return;\r\n return new Promise((resolve, reject) => {\r\n this.socket.connect(this.port, this.host, async () => {\r\n this.isConnected = true;\r\n if (this.password) {\r\n try {\r\n await this.execute(\"AUTH\", this.user, this.password);\r\n } catch (e) {\r\n this.disconnect();\r\n return reject(new Error(`Authentication failed: ${e.message}`));\r\n }\r\n }\r\n if (this._dbToSelect) {\r\n try {\r\n await this.execute(\"USE\", this._dbToSelect);\r\n } catch (e) {\r\n // If it fails, we keep the connection but warn\r\n console.warn(`Failed to select database ${this._dbToSelect}: ${e.message}`);\r\n }\r\n }\r\n resolve();\r\n });\r\n this.socket.once('error', reject);\r\n });\r\n }\r\n\r\n /**\r\n * Disconnects from the ToriDB server.\r\n */\r\n disconnect() {\r\n this.socket.destroy();\r\n this.isConnected = false;\r\n }\r\n\r\n /**\r\n * Programmatically selects a database.\r\n * Only works if no database was specified in the connection URI.\r\n * @param {string} name - The name of the database.\r\n * @returns {ToriDB} This instance for chaining.\r\n */\r\n dbName(name) {\r\n if (this._dbToSelect && this._dbToSelect !== \"data\") {\r\n console.warn(\"Database already specified in URI. Programmatic selection ignored.\");\r\n return this;\r\n }\r\n this.db = name;\r\n this._dbToSelect = name;\r\n return this;\r\n }\r\n\r\n /**\r\n * Executes a command on the ToriDB server.\r\n * @param {...any} args - Command arguments.\r\n * @returns {Promise<any>} The server response.\r\n */\r\n async execute(...args) {\r\n if (!this.isConnected) await this.connect();\r\n return new Promise((resolve, reject) => {\r\n this.pendingRequests.push({ resolve, reject });\r\n this.socket.write(RespParser.encode(args));\r\n });\r\n }\r\n\r\n /**\r\n * Executes a raw query string.\r\n * @param {string} s - The query string.\r\n * @returns {Promise<any>}\r\n */\r\n async query(s) {\r\n return this.execute(...s.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, '')));\r\n }\r\n\r\n // --- Key-Value & TTL ---\r\n /**\r\n * Retrieves the value of a key.\r\n * @param {string} key - The key to get.\r\n * @returns {Promise<any>}\r\n */\r\n async get(key) { return this.execute(\"GET\", key); }\r\n\r\n /**\r\n * Sets the value of a key.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store (objects are JSON-stringified).\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async set(key, val) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SET\", key, s);\r\n }\r\n /**\r\n * Sets the value of a key with an expiration time.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store.\r\n * @param {number} ttl - Time to live in seconds.\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async setEx(key, val, ttl) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SETEX\", key, s, String(ttl));\r\n }\r\n /**\r\n * Gets the remaining time to live of a key.\r\n * @param {string} key - The key.\r\n * @returns {Promise<number>} TTL in seconds, or -1 if no TTL, or -2 if key doesn't exist.\r\n */\r\n async ttl(key) { return this.execute(\"TTL\", key); }\r\n\r\n /**\r\n * Increments the integer value of a key by one.\r\n * @param {string} key - The key to increment.\r\n * @returns {Promise<number>} The value after increment.\r\n */\r\n async incr(key) { return this.execute(\"INCR\", key); }\r\n\r\n /**\r\n * Decrements the integer value of a key by one.\r\n * @param {string} key - The key to decrement.\r\n * @returns {Promise<number>} The value after decrement.\r\n */\r\n async decr(key) { return this.execute(\"DECR\", key); }\r\n\r\n // --- NoSQL Structures ---\r\n /**\r\n * Accesses list operations for a given key.\r\n * @param {string} key - The list key.\r\n * @returns {Object} An object with list operations (push, rpush, pop, rpop, range).\r\n */\r\n list(key) {\r\n return {\r\n push: (...vals) => this.execute(\"LPUSH\", key, ...vals.map(String)),\r\n rpush: (...vals) => this.execute(\"RPUSH\", key, ...vals.map(String)),\r\n pop: (count = 1) => this.execute(\"LPOP\", key, String(count)),\r\n rpop: (count = 1) => this.execute(\"RPOP\", key, String(count)),\r\n range: (start, stop) => this.execute(\"LRANGE\", key, String(start), String(stop))\r\n };\r\n }\r\n\r\n /**\r\n * Accesses set operations for a given key.\r\n * @param {string} key - The set key.\r\n * @returns {Object} An object with set operations (add, members).\r\n */\r\n setOf(key) {\r\n return {\r\n add: (...members) => this.execute(\"SADD\", key, ...members.map(String)),\r\n members: () => this.execute(\"SMEMBERS\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses hash operations for a given key.\r\n * @param {string} key - The hash key.\r\n * @returns {Object} An object with hash operations (set, get, all).\r\n */\r\n hash(key) {\r\n return {\r\n set: (field, val) => this.execute(\"HSET\", key, field, String(val)),\r\n get: (field) => this.execute(\"HGET\", key, field),\r\n all: () => this.execute(\"HGETALL\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses sorted set operations for a given key.\r\n * @param {string} key - The sorted set key.\r\n * @returns {Object} An object with sorted set operations (add, range, score).\r\n */\r\n sortedSet(key) {\r\n return {\r\n add: (score, member) => this.execute(\"ZADD\", key, String(score), member),\r\n range: (start, stop) => this.execute(\"ZRANGE\", key, String(start), String(stop)),\r\n score: (member) => this.execute(\"ZSCORE\", key, member)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses JSON operations for a given key.\r\n * @param {string} key - The JSON key.\r\n * @returns {Object} An object with JSON operations (get, set).\r\n */\r\n json(key) {\r\n return {\r\n get: (path = \"$\") => this.execute(\"JSON.GET\", key, path),\r\n set: (path, val) => {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : JSON.stringify(val);\r\n return this.execute(\"JSON.SET\", key, path, s);\r\n }\r\n };\r\n }\r\n\r\n // --- Relational (Models) ---\r\n /**\r\n * Defines or accesses a model for relational-like operations.\r\n * @param {string} name - The model name (table name).\r\n * @param {ToriDB.Blueprint} blueprint - The schema definition.\r\n * @returns {Object} An object with model operations (create, find, findById, update, delete, etc.).\r\n */\r\n model(name, blueprint) {\r\n const createCmd = Compiler.compileBlueprint(name, blueprint.definition);\r\n this.execute(...createCmd.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, ''))).catch(() => { });\r\n\r\n return {\r\n create: (data) => this.execute(\"INSERT\", name, ...Object.values(data).map(v => typeof v === 'object' ? JSON.stringify(v) : String(v))),\r\n find: (filter) => new QueryBuilder(this, name, filter),\r\n findById: (id) => new QueryBuilder(this, name, { id }).execute().then(r => r[0] || null),\r\n update: (filter, data) => {\r\n const where = Compiler.compileFilter(filter);\r\n const [col, val] = Object.entries(data)[0];\r\n const sVal = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"UPDATE\", name, \"SET\", col, \"=\", sVal, \"WHERE\", where);\r\n },\r\n delete: (filter) => this.execute(\"DELETE\", \"FROM\", name, \"WHERE\", Compiler.compileFilter(filter)),\r\n createIndex: (idxName, col) => this.execute(\"CREATE\", \"INDEX\", idxName, \"ON\", name, `(${col})`),\r\n addColumn: (col, type) => this.execute(\"ALTER\", \"TABLE\", name, \"ADD\", `${col}:${type}`),\r\n dropColumn: (col) => this.execute(\"ALTER\", \"TABLE\", name, \"DROP\", col)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses a table for query operations.\r\n * @param {string} name - The table name.\r\n * @returns {Object} An object with a find method.\r\n */\r\n table(name) {\r\n return { find: (filter) => new QueryBuilder(this, name, filter) };\r\n }\r\n}\r\n\r\n/**\r\n * Manager for system-level operations (ACL, Cluster, Replication, etc.).\r\n */\r\nclass SystemManager {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n */\r\n constructor(client) { this.client = client; }\r\n\r\n /**\r\n * Retrieves server information and statistics.\r\n * @returns {Promise<string>}\r\n */\r\n async info() { return this.client.execute(\"INFO\"); }\r\n\r\n /**\r\n * Synchronously saves the dataset to disk.\r\n * @returns {Promise<string>}\r\n */\r\n async save() { return this.client.execute(\"SAVE\"); }\r\n\r\n /**\r\n * Triggers an AOF rewrite in the background.\r\n * @returns {Promise<string>}\r\n */\r\n async rewriteAof() { return this.client.execute(\"REWRITEAOF\"); }\r\n\r\n /**\r\n * Accesses ACL (Access Control List) operations.\r\n * @returns {Object} An object with ACL operations (createUser, getUser, listUsers, deleteUser).\r\n */\r\n get acl() {\r\n return {\r\n createUser: (u, p, rules) => this.client.execute(\"ACL\", \"SETUSER\", u, p, ...rules),\r\n getUser: (u) => this.client.execute(\"ACL\", \"GETUSER\", u),\r\n listUsers: () => this.client.execute(\"ACL\", \"LIST\"),\r\n deleteUser: (u) => this.client.execute(\"ACL\", \"DELUSER\", u)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses cluster management operations.\r\n * @returns {Object} An object with cluster operations (meet, slots, info).\r\n */\r\n get cluster() {\r\n return {\r\n meet: (h, p) => this.client.execute(\"CLUSTER\", \"MEET\", h, String(p)),\r\n slots: () => this.client.execute(\"CLUSTER\", \"SLOTS\"),\r\n info: () => this.client.execute(\"CLUSTER\", \"INFO\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses replication management operations.\r\n * @returns {Object} An object with replication operations (slaveOf, stop).\r\n */\r\n get replication() {\r\n return {\r\n slaveOf: (h, p) => this.client.execute(\"REPLICAOF\", h, String(p)),\r\n stop: () => this.client.execute(\"REPLICAOF\", \"NO\", \"ONE\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses client management operations.\r\n * @returns {Object} An object with client operations (list, kill).\r\n */\r\n get clients() {\r\n return {\r\n list: () => this.client.execute(\"CLIENT\", \"LIST\"),\r\n kill: (addr) => this.client.execute(\"CLIENT\", \"KILL\", addr)\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Helper class for building and executing SQL-like queries.\r\n */\r\nclass QueryBuilder {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n * @param {string} target - The table or model name.\r\n * @param {Object} [filter={}] - Initial filter object.\r\n */\r\n constructor(client, target, filter = {}) {\r\n this.client = client;\r\n this.target = target;\r\n this.params = {\r\n filter: Compiler.compileFilter(filter),\r\n limit: null,\r\n offset: null,\r\n orderBy: null,\r\n groupBy: null,\r\n select: \"*\"\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the fields to select.\r\n * @param {string|string[]|Object} fields - Fields to select.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n select(fields) {\r\n if (typeof fields === 'string') this.params.select = fields;\r\n else if (Array.isArray(fields)) this.params.select = fields.join(\", \");\r\n else if (typeof fields === 'object') {\r\n this.params.select = Object.entries(fields).map(([k, v]) => `${v} AS ${k}`).join(\", \");\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Limits the number of results.\r\n * @param {number} n - The limit count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n limit(n) { this.params.limit = n; return this; }\r\n\r\n /**\r\n * Offsets the results.\r\n * @param {number} n - The offset count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n offset(n) { this.params.offset = n; return this; }\r\n\r\n /**\r\n * Orders the results by a column.\r\n * @param {string} col - The column name.\r\n * @param {string} [dir=\"ASC\"] - Sort direction (ASC or DESC).\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n orderBy(col, dir = \"ASC\") { this.params.orderBy = `${col} ${dir.toUpperCase()}`; return this; }\r\n\r\n /**\r\n * Groups the results by columns.\r\n * @param {string|string[]} cols - The columns to group by.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n groupBy(cols) { this.params.groupBy = Array.isArray(cols) ? cols.join(\", \") : cols; return this; }\r\n\r\n /**\r\n * Compiles and executes the query.\r\n * @returns {Promise<any[]>} The query results.\r\n */\r\n async execute() {\r\n const args = [\"SELECT\", this.params.select, \"FROM\", this.target];\r\n if (this.params.filter) { args.push(\"WHERE\"); args.push(this.params.filter); }\r\n if (this.params.groupBy) { args.push(\"GROUP\"); args.push(\"BY\"); args.push(this.params.groupBy); }\r\n if (this.params.orderBy) { args.push(\"ORDER\"); args.push(\"BY\"); args.push(this.params.orderBy); }\r\n if (this.params.limit) { args.push(\"LIMIT\"); args.push(String(this.params.limit)); }\r\n if (this.params.offset) { args.push(\"OFFSET\"); args.push(String(this.params.offset)); }\r\n\r\n return this.client.execute(...args);\r\n }\r\n}\r\n\r\nexport { ToriDB };"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toridb.esm.js","sources":["../src/compiler.js","../src/resp.js","../src/sdk.js"],"sourcesContent":["/**\r\n * Command Compiler: Translates JS Objects and Types to ToriDB DSL\r\n */\r\nclass Compiler {\r\n /**\r\n * Translates a JS Object to a ToriDB Filter string.\r\n * { age: { $gt: 18 }, status: 'active' } -> \"age > 18 AND status = 'active'\"\r\n */\r\n static compileFilter(filter) {\r\n if (!filter || typeof filter !== 'object') return \"\";\r\n\r\n const parts = [];\r\n for (const [key, value] of Object.entries(filter)) {\r\n if (key === '$or' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" OR \")})`);\r\n } else if (key === '$and' && Array.isArray(value)) {\r\n parts.push(`(${value.map(f => this.compileFilter(f)).join(\" AND \")})`);\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Handle operators: { $gt: 10 }\r\n for (const [op, val] of Object.entries(value)) {\r\n const symbol = this._mapOperator(op);\r\n parts.push(`${key} ${symbol} ${this._escape(val)}`);\r\n }\r\n } else {\r\n // Basic equality\r\n parts.push(`${key} = ${this._escape(value)}`);\r\n }\r\n }\r\n return parts.join(\" AND \");\r\n }\r\n\r\n /**\r\n * Translates a Blueprint definition to ToriDB Table Definition format.\r\n * { id: { type: 'INT', primary: true }, user_id: { type: 'INT', references: 'users.id' } }\r\n * -> \"id:INT:pk user_id:INT:fk(users.id)\"\r\n */\r\n static compileBlueprint(name, blueprint) {\r\n const cols = [];\r\n for (const [colName, config] of Object.entries(blueprint)) {\r\n let type = typeof config === 'string' ? config : config.type;\r\n let pk = (config.primary || config.is_pk) ? \":pk\" : \"\";\r\n let fk = \"\";\r\n\r\n if (config.references) {\r\n const [refTable, refCol] = config.references.split('.');\r\n fk = `:fk(${refTable}.${refCol})`;\r\n }\r\n\r\n // Auto-map JS types if not specified as SQL types\r\n if (type === 'Number') type = 'INT';\r\n if (type === 'String') type = 'STRING';\r\n if (type === 'Object') type = 'JSON';\r\n if (type === 'Boolean') type = 'BOOL';\r\n\r\n cols.push(`${colName}:${type}${pk}${fk}`);\r\n }\r\n return `CREATE TABLE ${name} ${cols.join(\" \")}`;\r\n }\r\n\r\n /**\r\n * Maps MongoDB-style operators to ToriDB SQL operators.\r\n * @param {string} op - The operator to map (e.g., \"$gt\").\r\n * @returns {string} The corresponding SQL operator or the operator itself if no map exists.\r\n * @private\r\n */\r\n static _mapOperator(op) {\r\n const maps = {\r\n '$gt': '>', '$gte': '>=', '$lt': '<', '$lte': '<=',\r\n '$ne': '!=', '$eq': '=', '$like': 'LIKE', '$in': 'IN'\r\n };\r\n return maps[op] || op;\r\n }\r\n\r\n /**\r\n * Escapes values for safe inclusion in ToriDB queries.\r\n * Handles strings, arrays, and objects (JSON).\r\n * @param {any} val - The value to escape.\r\n * @returns {string} The escaped and formatted value string.\r\n * @private\r\n */\r\n static _escape(val) {\r\n if (typeof val === 'string') {\r\n // If it's a list for IN operator, don't wrap the whole thing in quotes\r\n // but wrap individual elements if they are strings.\r\n // However, the server's IN expects (val1,val2)\r\n return `\"${val.replace(/\"/g, '\\\\\"')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n return `(${val.map(v => this._escape(v)).join(\",\")})`;\r\n }\r\n if (typeof val === 'object' && val !== null) return `\"${JSON.stringify(val).replace(/\"/g, '\\\\\"')}\"`;\r\n return String(val);\r\n }\r\n}\r\n\r\nexport { Compiler };","/**\r\n * High-Performance RESP (REdis Serialization Protocol) Parser\r\n * Handles Simple Strings, Errors, Integers, Bulk Strings, and Nested Arrays.\r\n */\r\nclass RespParser {\r\n /**\r\n * Initializes or resets the parser state.\r\n */\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Clears the current data buffer.\r\n */\r\n reset() {\r\n this.buffer = Buffer.alloc(0);\r\n }\r\n\r\n /**\r\n * Feeds raw binary data into the parser's buffer.\r\n * @param {Buffer} data - The raw data received from the socket.\r\n */\r\n feed(data) {\r\n this.buffer = Buffer.concat([this.buffer, data]);\r\n }\r\n\r\n /**\r\n * Tries to parse the next complete RESP value from the buffer.\r\n * @returns {any | undefined} The parsed value or undefined if incomplete.\r\n */\r\n parseNext() {\r\n if (this.buffer.length === 0) return undefined;\r\n\r\n const result = this._decode(0);\r\n if (result) {\r\n this.buffer = this.buffer.slice(result.bytesRead);\r\n return result.value;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Decodes a single RESP value from the buffer starting at a given offset.\r\n * Internal recursive method for handling nested arrays and bulk strings.\r\n * @param {number} offset - The buffer offset to start parsing from.\r\n * @returns {Object|null} An object with {value, bytesRead} or null if incomplete.\r\n * @private\r\n */\r\n _decode(offset) {\r\n if (offset >= this.buffer.length) return null;\r\n\r\n const prefix = this.buffer[offset];\r\n const lineEnd = this.buffer.indexOf('\\r\\n', offset);\r\n if (lineEnd === -1) return null;\r\n\r\n const content = this.buffer.slice(offset + 1, lineEnd).toString();\r\n const bytesBeforeData = lineEnd - offset + 2;\r\n\r\n switch (prefix) {\r\n case 43: // '+' Simple String\r\n return { value: content, bytesRead: bytesBeforeData };\r\n\r\n case 45: // '-' Error\r\n return { value: new Error(content), bytesRead: bytesBeforeData };\r\n\r\n case 58: // ':' Integer\r\n return { value: parseInt(content, 10), bytesRead: bytesBeforeData };\r\n\r\n case 36: { // '$' Bulk String\r\n const length = parseInt(content, 10);\r\n if (length === -1) return { value: null, bytesRead: bytesBeforeData };\r\n \r\n const dataEnd = lineEnd + 2 + length;\r\n if (this.buffer.length < dataEnd + 2) return null;\r\n \r\n const value = this.buffer.slice(lineEnd + 2, dataEnd).toString();\r\n // Verify CRLF\r\n if (this.buffer[dataEnd] !== 13 || this.buffer[dataEnd + 1] !== 10) {\r\n throw new Error(\"Invalid Bulk String terminator\");\r\n }\r\n return { value, bytesRead: bytesBeforeData + length + 2 };\r\n }\r\n\r\n case 42: { // '*' Array\r\n const count = parseInt(content, 10);\r\n if (count === -1) return { value: null, bytesRead: bytesBeforeData };\r\n if (count === 0) return { value: [], bytesRead: bytesBeforeData };\r\n\r\n let totalRead = bytesBeforeData;\r\n const items = [];\r\n for (let i = 0; i < count; i++) {\r\n const item = this._decode(offset + totalRead);\r\n if (!item) return null;\r\n items.push(item.value);\r\n totalRead += item.bytesRead;\r\n }\r\n return { value: items, bytesRead: totalRead };\r\n }\r\n\r\n default:\r\n // Attempt to handle unexpected data as a simple string line\r\n return { value: content, bytesRead: bytesBeforeData };\r\n }\r\n }\r\n\r\n /**\r\n * Serializes a command into a RESP Array.\r\n * @param {string[]} args \r\n */\r\n static encode(args) {\r\n let res = `*${args.length}\\r\\n`;\r\n for (const arg of args) {\r\n const s = String(arg);\r\n res += `$${Buffer.byteLength(s)}\\r\\n${s}\\r\\n`;\r\n }\r\n return Buffer.from(res);\r\n }\r\n}\r\n\r\nexport { RespParser };\r\n","import net from 'net';\r\nimport { Compiler } from './compiler.js';\r\nimport { RespParser } from './resp.js';\r\n\r\nclass ToriDBError extends Error {\r\n constructor(message, code, originalError = null) {\r\n super(message);\r\n this.name = \"ToriDBError\";\r\n this.code = code;\r\n this.originalError = originalError;\r\n }\r\n}\r\n\r\n/**\r\n * Main client class for interacting with ToriDB.\r\n * Supports Key-Value, NoSQL structures (List, Set, Hash, JSON), and Relational modeling.\r\n */\r\nclass ToriDB {\r\n /**\r\n * Represents a database schema definition.\r\n */\r\n static Blueprint = class {\r\n /**\r\n * @param {Object} definition - The schema definition object.\r\n */\r\n constructor(definition) {\r\n this.definition = definition;\r\n }\r\n };\r\n\r\n /**\r\n * Creates a new ToriDB client instance.\r\n * @param {string} [uri=\"db://127.0.0.1:8569\"] - Connection URI (e.g., db://user:pass@host:port/db)\r\n */\r\n constructor(uri = \"db://127.0.0.1:8569\") {\r\n this.host = \"127.0.0.1\";\r\n this.port = 8569;\r\n this.user = \"default\";\r\n this.password = null;\r\n this.db = \"data\";\r\n this._dbToSelect = null;\r\n this._parseUri(uri);\r\n\r\n this.parser = new RespParser();\r\n this.socket = new net.Socket();\r\n this.isConnected = false;\r\n this.pendingRequests = [];\r\n\r\n this._setupSocket();\r\n\r\n // Managers\r\n this.system = new SystemManager(this);\r\n }\r\n\r\n /**\r\n * Parses the connection URI.\r\n * @param {string} uri - The connection URI to parse.\r\n * @private\r\n */\r\n _parseUri(uri) {\r\n const regex = /^db:\\/\\/(?:(?:([^:]+):([^@+]+)[@+])?)([^:/\\?]+)(?::(\\d+))?(?:(?:\\/([^?]*))?)?(?:\\?(.*))?/;\r\n const match = uri.match(regex);\r\n if (match) {\r\n this.user = match[1] || \"default\";\r\n this.password = match[2] || null;\r\n this.host = match[3];\r\n this.port = parseInt(match[4], 10) || 8569;\r\n const dbFromUri = (match[5] || \"\").replace(/\\/+$/, \"\");\r\n if (dbFromUri) {\r\n this.db = dbFromUri;\r\n this._dbToSelect = dbFromUri;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets up socket events for data handling, errors, and closure.\r\n * @private\r\n */\r\n _setupSocket() {\r\n this.socket.on('data', (data) => {\r\n this.parser.feed(data);\r\n let response;\r\n while ((response = this.parser.parseNext()) !== undefined) {\r\n const req = this.pendingRequests.shift();\r\n if (req) {\r\n if (response instanceof Error) {\r\n req.reject(new ToriDBError(response.message, \"SERVER_ERROR\"));\r\n }\r\n else req.resolve(response);\r\n }\r\n }\r\n });\r\n\r\n this.socket.on('error', (err) => {\r\n this.isConnected = false;\r\n const wrapped = new ToriDBError(`Socket Error: ${err.message}`, \"SOCKET_ERROR\", err);\r\n this.pendingRequests.forEach(req => req.reject(wrapped));\r\n this.pendingRequests = [];\r\n });\r\n\r\n this.socket.on('close', () => {\r\n this.isConnected = false;\r\n if (this.pendingRequests.length > 0) {\r\n const err = new ToriDBError(\"Connection closed unexpectedly\", \"CONNECTION_CLOSED\");\r\n this.pendingRequests.forEach(req => req.reject(err));\r\n this.pendingRequests = [];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Establishes a connection to the ToriDB server.\r\n * @returns {Promise<void>}\r\n * @throws {Error} If connection or authentication fails.\r\n */\r\n async connect() {\r\n if (this.isConnected) return;\r\n return new Promise((resolve, reject) => {\r\n const onError = (err) => {\r\n reject(new ToriDBError(`Connection failed: ${err.message}`, \"CONNECTION_FAILED\", err));\r\n };\r\n this.socket.once('error', onError);\r\n\r\n this.socket.connect(this.port, this.host, async () => {\r\n this.socket.removeListener('error', onError);\r\n this.isConnected = true;\r\n if (this.password) {\r\n try {\r\n await this.execute(\"AUTH\", this.user, this.password);\r\n } catch (e) {\r\n this.disconnect();\r\n return reject(new ToriDBError(`Authentication failed: ${e.message}`, \"AUTH_FAILED\", e));\r\n }\r\n }\r\n if (this._dbToSelect) {\r\n try {\r\n await this.execute(\"USE\", this._dbToSelect);\r\n } catch (e) {\r\n // If it fails, we keep the connection but warn\r\n console.warn(`Failed to select database ${this._dbToSelect}: ${e.message}`);\r\n }\r\n }\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Disconnects from the ToriDB server.\r\n */\r\n disconnect() {\r\n this.socket.destroy();\r\n this.isConnected = false;\r\n }\r\n\r\n /**\r\n * Programmatically selects a database.\r\n * Only works if no database was specified in the connection URI.\r\n * @param {string} name - The name of the database.\r\n * @returns {ToriDB} This instance for chaining.\r\n */\r\n dbName(name) {\r\n if (this._dbToSelect && this._dbToSelect !== \"data\") {\r\n // Warn but facilitate the switch if connected, or update preference\r\n // console.warn(\"Database already specified...\"); // Removed strict warning to allow switching\r\n }\r\n this.db = name;\r\n this._dbToSelect = name;\r\n\r\n if (this.isConnected) {\r\n // Send USE command immediately to preserve order\r\n this.execute(\"USE\", name).catch(e => {\r\n console.warn(`Failed to switch to database ${name}: ${e.message}`);\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Executes a command on the ToriDB server.\r\n * @param {...any} args - Command arguments.\r\n * @returns {Promise<any>} The server response.\r\n */\r\n async execute(...args) {\r\n if (!this.isConnected) {\r\n try {\r\n await this.connect();\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n return new Promise((resolve, reject) => {\r\n this.pendingRequests.push({ resolve, reject });\r\n try {\r\n this.socket.write(RespParser.encode(args));\r\n } catch (e) {\r\n this.pendingRequests.pop();\r\n reject(new ToriDBError(`Failed to send command: ${e.message}`, \"SEND_ERROR\", e));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Executes a raw query string.\r\n * @param {string} s - The query string.\r\n * @returns {Promise<any>}\r\n */\r\n async query(s) {\r\n return this.execute(...s.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, '')));\r\n }\r\n\r\n // --- Key-Value & TTL ---\r\n /**\r\n * Retrieves the value of a key.\r\n * @param {string} key - The key to get.\r\n * @returns {Promise<any>}\r\n */\r\n async get(key) { return this.execute(\"GET\", key); }\r\n\r\n /**\r\n * Sets the value of a key.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store (objects are JSON-stringified).\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async set(key, val) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SET\", key, s);\r\n }\r\n /**\r\n * Sets the value of a key with an expiration time.\r\n * @param {string} key - The key to set.\r\n * @param {any} val - The value to store.\r\n * @param {number} ttl - Time to live in seconds.\r\n * @returns {Promise<string>} OK on success.\r\n */\r\n async setEx(key, val, ttl) {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"SETEX\", key, s, String(ttl));\r\n }\r\n /**\r\n * Gets the remaining time to live of a key.\r\n * @param {string} key - The key.\r\n * @returns {Promise<number>} TTL in seconds, or -1 if no TTL, or -2 if key doesn't exist.\r\n */\r\n async ttl(key) { return this.execute(\"TTL\", key); }\r\n\r\n /**\r\n * Increments the integer value of a key by one.\r\n * @param {string} key - The key to increment.\r\n * @returns {Promise<number>} The value after increment.\r\n */\r\n async incr(key) { return this.execute(\"INCR\", key); }\r\n\r\n /**\r\n * Decrements the integer value of a key by one.\r\n * @param {string} key - The key to decrement.\r\n * @returns {Promise<number>} The value after decrement.\r\n */\r\n async decr(key) { return this.execute(\"DECR\", key); }\r\n\r\n // --- NoSQL Structures ---\r\n /**\r\n * Accesses list operations for a given key.\r\n * @param {string} key - The list key.\r\n * @returns {Object} An object with list operations (push, rpush, pop, rpop, range).\r\n */\r\n list(key) {\r\n return {\r\n push: (...vals) => this.execute(\"LPUSH\", key, ...vals.map(String)),\r\n rpush: (...vals) => this.execute(\"RPUSH\", key, ...vals.map(String)),\r\n pop: (count = 1) => this.execute(\"LPOP\", key, String(count)),\r\n rpop: (count = 1) => this.execute(\"RPOP\", key, String(count)),\r\n range: (start, stop) => this.execute(\"LRANGE\", key, String(start), String(stop))\r\n };\r\n }\r\n\r\n /**\r\n * Accesses set operations for a given key.\r\n * @param {string} key - The set key.\r\n * @returns {Object} An object with set operations (add, members).\r\n */\r\n setOf(key) {\r\n return {\r\n add: (...members) => this.execute(\"SADD\", key, ...members.map(String)),\r\n members: () => this.execute(\"SMEMBERS\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses hash operations for a given key.\r\n * @param {string} key - The hash key.\r\n * @returns {Object} An object with hash operations (set, get, all).\r\n */\r\n hash(key) {\r\n return {\r\n set: (field, val) => this.execute(\"HSET\", key, field, String(val)),\r\n get: (field) => this.execute(\"HGET\", key, field),\r\n all: () => this.execute(\"HGETALL\", key)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses sorted set operations for a given key.\r\n * @param {string} key - The sorted set key.\r\n * @returns {Object} An object with sorted set operations (add, range, score).\r\n */\r\n sortedSet(key) {\r\n return {\r\n add: (score, member) => this.execute(\"ZADD\", key, String(score), member),\r\n range: (start, stop) => this.execute(\"ZRANGE\", key, String(start), String(stop)),\r\n score: (member) => this.execute(\"ZSCORE\", key, member)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses JSON operations for a given key.\r\n * @param {string} key - The JSON key.\r\n * @returns {Object} An object with JSON operations (get, set).\r\n */\r\n json(key) {\r\n return {\r\n get: (path = \"$\") => this.execute(\"JSON.GET\", key, path),\r\n set: (path, val) => {\r\n const s = typeof val === 'object' ? JSON.stringify(val) : JSON.stringify(val);\r\n return this.execute(\"JSON.SET\", key, path, s);\r\n }\r\n };\r\n }\r\n\r\n // --- Relational (Models) ---\r\n /**\r\n * Defines or accesses a model for relational-like operations.\r\n * @param {string} name - The model name (table name).\r\n * @param {ToriDB.Blueprint} blueprint - The schema definition.\r\n * @returns {Object} An object with model operations (create, find, findById, update, delete, etc.).\r\n */\r\n model(name, blueprint) {\r\n const createCmd = Compiler.compileBlueprint(name, blueprint.definition);\r\n this.execute(...createCmd.match(/(?:[^\\s\"]+|\"[^\"]*\")+/g).map(p => p.replace(/\"/g, ''))).catch(() => { });\r\n\r\n return {\r\n create: (data) => this.execute(\"INSERT\", name, ...Object.values(data).map(v => typeof v === 'object' ? JSON.stringify(v) : String(v))),\r\n find: (filter) => new QueryBuilder(this, name, filter),\r\n findById: (id) => new QueryBuilder(this, name, { id }).execute().then(r => r[0] || null),\r\n update: (filter, data) => {\r\n const where = Compiler.compileFilter(filter);\r\n const [col, val] = Object.entries(data)[0];\r\n const sVal = typeof val === 'object' ? JSON.stringify(val) : String(val);\r\n return this.execute(\"UPDATE\", name, \"SET\", col, \"=\", sVal, \"WHERE\", where);\r\n },\r\n delete: (filter) => this.execute(\"DELETE\", \"FROM\", name, \"WHERE\", Compiler.compileFilter(filter)),\r\n createIndex: (idxName, col) => this.execute(\"CREATE\", \"INDEX\", idxName, \"ON\", name, `(${col})`),\r\n addColumn: (col, type) => this.execute(\"ALTER\", \"TABLE\", name, \"ADD\", `${col}:${type}`),\r\n dropColumn: (col) => this.execute(\"ALTER\", \"TABLE\", name, \"DROP\", col)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses a table for query operations.\r\n * @param {string} name - The table name.\r\n * @returns {Object} An object with a find method.\r\n */\r\n table(name) {\r\n return { find: (filter) => new QueryBuilder(this, name, filter) };\r\n }\r\n}\r\n\r\n/**\r\n * Manager for system-level operations (ACL, Cluster, Replication, etc.).\r\n */\r\nclass SystemManager {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n */\r\n constructor(client) { this.client = client; }\r\n\r\n /**\r\n * Retrieves server information and statistics.\r\n * @returns {Promise<string>}\r\n */\r\n async info() { return this.client.execute(\"INFO\"); }\r\n\r\n /**\r\n * Synchronously saves the dataset to disk.\r\n * @returns {Promise<string>}\r\n */\r\n async save() { return this.client.execute(\"SAVE\"); }\r\n\r\n /**\r\n * Triggers an AOF rewrite in the background.\r\n * @returns {Promise<string>}\r\n */\r\n async rewriteAof() { return this.client.execute(\"REWRITEAOF\"); }\r\n\r\n /**\r\n * Accesses ACL (Access Control List) operations.\r\n * @returns {Object} An object with ACL operations (createUser, getUser, listUsers, deleteUser).\r\n */\r\n get acl() {\r\n return {\r\n createUser: (u, p, rules) => this.client.execute(\"ACL\", \"SETUSER\", u, p, ...rules),\r\n getUser: (u) => this.client.execute(\"ACL\", \"GETUSER\", u),\r\n listUsers: () => this.client.execute(\"ACL\", \"LIST\"),\r\n deleteUser: (u) => this.client.execute(\"ACL\", \"DELUSER\", u)\r\n };\r\n }\r\n\r\n /**\r\n * Accesses cluster management operations.\r\n * @returns {Object} An object with cluster operations (meet, slots, info).\r\n */\r\n get cluster() {\r\n return {\r\n meet: (h, p) => this.client.execute(\"CLUSTER\", \"MEET\", h, String(p)),\r\n slots: () => this.client.execute(\"CLUSTER\", \"SLOTS\"),\r\n info: () => this.client.execute(\"CLUSTER\", \"INFO\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses replication management operations.\r\n * @returns {Object} An object with replication operations (slaveOf, stop).\r\n */\r\n get replication() {\r\n return {\r\n slaveOf: (h, p) => this.client.execute(\"REPLICAOF\", h, String(p)),\r\n stop: () => this.client.execute(\"REPLICAOF\", \"NO\", \"ONE\")\r\n };\r\n }\r\n\r\n /**\r\n * Accesses client management operations.\r\n * @returns {Object} An object with client operations (list, kill).\r\n */\r\n get clients() {\r\n return {\r\n list: () => this.client.execute(\"CLIENT\", \"LIST\"),\r\n kill: (addr) => this.client.execute(\"CLIENT\", \"KILL\", addr)\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Helper class for building and executing SQL-like queries.\r\n */\r\nclass QueryBuilder {\r\n /**\r\n * @param {ToriDB} client - The ToriDB client instance.\r\n * @param {string} target - The table or model name.\r\n * @param {Object} [filter={}] - Initial filter object.\r\n */\r\n constructor(client, target, filter = {}) {\r\n this.client = client;\r\n this.target = target;\r\n this.params = {\r\n filter: Compiler.compileFilter(filter),\r\n limit: null,\r\n offset: null,\r\n orderBy: null,\r\n groupBy: null,\r\n select: \"*\"\r\n };\r\n }\r\n\r\n /**\r\n * Specifies the fields to select.\r\n * @param {string|string[]|Object} fields - Fields to select.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n select(fields) {\r\n if (typeof fields === 'string') this.params.select = fields;\r\n else if (Array.isArray(fields)) this.params.select = fields.join(\", \");\r\n else if (typeof fields === 'object') {\r\n this.params.select = Object.entries(fields).map(([k, v]) => `${v} AS ${k}`).join(\", \");\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Limits the number of results.\r\n * @param {number} n - The limit count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n limit(n) { this.params.limit = n; return this; }\r\n\r\n /**\r\n * Offsets the results.\r\n * @param {number} n - The offset count.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n offset(n) { this.params.offset = n; return this; }\r\n\r\n /**\r\n * Orders the results by a column.\r\n * @param {string} col - The column name.\r\n * @param {string} [dir=\"ASC\"] - Sort direction (ASC or DESC).\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n orderBy(col, dir = \"ASC\") { this.params.orderBy = `${col} ${dir.toUpperCase()}`; return this; }\r\n\r\n /**\r\n * Groups the results by columns.\r\n * @param {string|string[]} cols - The columns to group by.\r\n * @returns {QueryBuilder} This instance for chaining.\r\n */\r\n groupBy(cols) { this.params.groupBy = Array.isArray(cols) ? cols.join(\", \") : cols; return this; }\r\n\r\n /**\r\n * Compiles and executes the query.\r\n * @returns {Promise<any[]>} The query results.\r\n */\r\n async execute() {\r\n const args = [\"SELECT\", this.params.select, \"FROM\", this.target];\r\n if (this.params.filter) { args.push(\"WHERE\"); args.push(this.params.filter); }\r\n if (this.params.groupBy) { args.push(\"GROUP\"); args.push(\"BY\"); args.push(this.params.groupBy); }\r\n if (this.params.orderBy) { args.push(\"ORDER\"); args.push(\"BY\"); args.push(this.params.orderBy); }\r\n if (this.params.limit) { args.push(\"LIMIT\"); args.push(String(this.params.limit)); }\r\n if (this.params.offset) { args.push(\"OFFSET\"); args.push(String(this.params.offset)); }\r\n\r\n return this.client.execute(...args);\r\n }\r\n}\r\n\r\nexport { ToriDB };"],"names":[],"mappings":"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"}
|