@skaile/connector-redis 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @skaile/connector-redis
2
2
 
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#99](https://github.com/skaile-ai/workspaces/pull/99) [`fb76100`](https://github.com/skaile-ai/workspaces/commit/fb76100d1524784ccfafb52520280e1764e0c38a) Thanks [@peteralbert](https://github.com/peteralbert)! - Make `disconnect` robust: `client.quit()` is now guarded so a rejection falls back
8
+ to `disconnect()` and the handle status is always set to `disconnected`, preventing
9
+ a stuck status and a background reconnect loop on a broken socket.
10
+
3
11
  ## 0.1.0
4
12
 
5
13
  ### Minor Changes
package/dist/index.js CHANGED
@@ -79,8 +79,13 @@ var RedisConnector = class extends AbstractConnector {
79
79
  async disconnect(handle) {
80
80
  this.log.info("disconnect");
81
81
  const { client } = handle.state;
82
- await client.quit();
83
- handle.status = "disconnected";
82
+ try {
83
+ await client.quit();
84
+ } catch {
85
+ client.disconnect?.();
86
+ } finally {
87
+ handle.status = "disconnected";
88
+ }
84
89
  }
85
90
  client(handle) {
86
91
  return handle.state.client;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/target.ts","../src/index.ts"],"sourcesContent":["/**\n * RedisConnector — Redis/KeyDB/Valkey key-value store resource.\n * Not mountable. Custom operations: get, set, keys, del, ttl, info.\n *\n * Requires `ioredis` (a runtime dependency of this package).\n */\n\nimport { resolveAuth, AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type { ConnectorTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\n\ninterface RedisState {\n client: any; // ioredis instance\n namespace: string;\n}\n\n/**\n * Connector for Redis, KeyDB, and Valkey key-value stores.\n * Provides get, set, keys, del, ttl, and info operations. Requires the `ioredis` package.\n */\nexport class RedisConnector extends AbstractConnector {\n readonly name = \"redis\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n write: (handle, path, content) => this._write(handle, path, content),\n delete: (handle, path) => this._delete(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query, options) => this._search(handle, query, options),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"url\",\n label: \"Redis URL\",\n description: \"Redis connection URL (e.g. redis://localhost:6379)\",\n type: \"url\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n ];\n }\n\n private _describeSkill(\n _handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const url = String(declaration.options?.url ?? \"\");\n let hostLabel = declaration.id;\n try {\n hostLabel = new URL(url).hostname;\n } catch {}\n return {\n id: declaration.id,\n name: `Redis — ${hostLabel}`,\n description: `Key-value store at ${hostLabel}`,\n category: \"kv\",\n access: declaration.access,\n toolNames: [\"get\", \"keys\", \"ttl\", \"info\"],\n };\n }\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const started = Date.now();\n const url =\n ctx.resolvedFields?.url ??\n resolveAuth(declaration.auth, ctx.secrets) ??\n String(declaration.options?.url ?? \"\");\n if (!url) {\n this.log.error(\"connect failed: missing url\", undefined);\n throw new Error(\"RedisAdapter requires auth (URL) or options.url\");\n }\n\n let host = \"(unknown)\";\n try {\n host = new URL(url).hostname;\n } catch {}\n this.log.info(\"connect start\", { host });\n\n try {\n const ioredisPkg = \"ioredis\";\n const mod = (await import(/* @vite-ignore */ ioredisPkg)) as any;\n const Redis = mod.default ?? mod.Redis ?? mod;\n const client = new Redis(url, { lazyConnect: true, maxRetriesPerRequest: 2 });\n await client.connect();\n\n const namespace = String(declaration.options?.namespace ?? \"\");\n\n this.log.info(\"connect ok\", { host, durationMs: Date.now() - started });\n return this.makeHandle(declaration, { client, namespace } satisfies RedisState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { host });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { client } = handle.state as RedisState;\n await client.quit();\n handle.status = \"disconnected\";\n }\n\n private client(handle: ConnectorHandle): any {\n return (handle.state as RedisState).client;\n }\n\n private nsKey(handle: ConnectorHandle, key: string): string {\n const ns = (handle.state as RedisState).namespace;\n return ns ? `${ns}:${key}` : key;\n }\n\n private stripNs(handle: ConnectorHandle, key: string): string {\n const ns = (handle.state as RedisState).namespace;\n return ns && key.startsWith(`${ns}:`) ? key.slice(ns.length + 1) : key;\n }\n\n private async _read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const value = await this.client(handle).get(this.nsKey(handle, path));\n if (value === null) return null;\n return { data: value, contentType: \"application/json\" };\n }\n\n private async _write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n const data = typeof content.data === \"string\" ? content.data : content.data.toString(\"utf-8\");\n await this.client(handle).set(this.nsKey(handle, path), data);\n }\n\n private async _delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const count = await this.client(handle).del(this.nsKey(handle, path));\n return count > 0;\n }\n\n private async _list(\n handle: ConnectorHandle,\n path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const ns = (handle.state as RedisState).namespace;\n const pattern = path\n ? this.nsKey(handle, path.endsWith(\"*\") ? path : `${path}*`)\n : ns\n ? `${ns}:*`\n : \"*\";\n\n const keys: string[] = [];\n let cursor = \"0\";\n const limit = options?.limit ?? 1000;\n\n do {\n const [next, batch] = await this.client(handle).scan(cursor, \"MATCH\", pattern, \"COUNT\", 100);\n cursor = next;\n keys.push(...batch);\n if (keys.length >= limit) break;\n } while (cursor !== \"0\");\n\n return keys.slice(0, limit).map((k) => ({\n name: this.stripNs(handle, k),\n path: this.stripNs(handle, k),\n type: \"key\" as const,\n }));\n }\n\n private async _search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n // SCAN + GET for matching values (expensive but functional)\n const entries = await this._list(handle, undefined, { limit: options?.maxResults ?? 100 });\n const results: SearchResult[] = [];\n\n for (const entry of entries) {\n if (options?.maxResults && results.length >= options.maxResults) break;\n if (entry.name.includes(query)) {\n results.push({ path: entry.name });\n continue;\n }\n const value = await this.client(handle).get(this.nsKey(handle, entry.name));\n if (value?.includes(query)) {\n results.push({ path: entry.name, snippet: value.slice(0, 200) });\n }\n }\n return results;\n }\n\n private _describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get\",\n description: \"Get value by key.\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Redis key\" }],\n examples: ['get --key \"config:theme\"'],\n },\n {\n name: \"keys\",\n description: \"List keys matching a glob pattern.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"pattern\",\n type: \"string\",\n required: false,\n description: \"Glob pattern (default: *)\",\n },\n ],\n examples: [\"keys\", 'keys --pattern \"user:*\"'],\n },\n {\n name: \"ttl\",\n description:\n \"Get remaining time-to-live for a key (seconds, -1 if no expiry, -2 if key does not exist).\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Redis key\" }],\n },\n {\n name: \"info\",\n description: \"Get Redis server info (memory, clients, keyspace stats).\",\n accessLevel: \"read\",\n args: [\n {\n name: \"section\",\n type: \"string\",\n required: false,\n description: \"Info section (memory, clients, keyspace, all)\",\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"set\",\n description: \"Set a key-value pair with optional TTL.\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Redis key\" },\n { name: \"value\", type: \"string\", required: true, description: \"Value to store\" },\n { name: \"ttl\", type: \"number\", required: false, description: \"Expiry in seconds\" },\n ],\n examples: [\n 'set --key \"status\" --value \"running\"',\n 'set --key \"cache:token\" --value \"abc\" --ttl 3600',\n ],\n },\n {\n name: \"del\",\n description: \"Delete one or more keys.\",\n accessLevel: \"write\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key to delete\" }],\n examples: ['del --key \"temp:session\"'],\n },\n );\n }\n\n return ops;\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const client = this.client(handle);\n\n switch (operation) {\n case \"get\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const value = await client.get(this.nsKey(handle, key));\n return value ?? \"\";\n }\n case \"set\": {\n const key = String(args.key ?? \"\");\n const value = String(args.value ?? \"\");\n const fullKey = this.nsKey(handle, key);\n if (args.ttl) {\n await client.set(fullKey, value, \"EX\", Number(args.ttl));\n } else {\n await client.set(fullKey, value);\n }\n return \"OK\";\n }\n case \"keys\": {\n const pattern = args.pattern ? String(args.pattern) : \"*\";\n const entries = await this._list(handle, pattern.endsWith(\"*\") ? pattern : `${pattern}*`);\n return JSON.stringify(entries.map((e) => e.name));\n }\n case \"del\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const count = await client.del(this.nsKey(handle, key));\n return count > 0 ? \"Deleted\" : \"Not found\";\n }\n case \"ttl\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const ttl = await client.ttl(this.nsKey(handle, key));\n return String(ttl);\n }\n case \"info\": {\n const section = args.section ? String(args.section) : undefined;\n const info = section ? await client.info(section) : await client.info();\n return info;\n }\n default:\n throw new Error(`RedisAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new RedisConnector instance.\n * @returns Configured RedisConnector ready to be registered in the connector registry.\n */\nexport function createConnector(): RedisConnector {\n return new RedisConnector();\n}\n\n/**\n * Plugin-registry target wrapping the Redis connector factory. Connectors take\n * no construct-time config, so `configSchema` is a passthrough and `create()`\n * returns a fresh instance; lifecycle config arrives via `Connector.connect()`.\n */\nexport const redisConnectorTarget: ConnectorTarget = {\n id: \"redis\",\n displayName: \"Redis\",\n apiVersion: 1,\n configSchema: z.unknown(),\n create: (_config, _ctx) => new RedisConnector(),\n};\n","/**\n * `@skaile/connector-redis` — Redis connector for `@skaile/workspaces`.\n *\n * Install via `skaile plugin install @skaile/connector-redis`; the plugin\n * loader calls `register(pluginRegistry)` at startup so `redis` becomes\n * resolvable as a connector driver.\n */\n\nimport type { PluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport { redisConnectorTarget } from \"./target.js\";\n\nexport { redisConnectorTarget, RedisConnector, createConnector } from \"./target.js\";\n\n/** Register this plugin's connector target with a registry. */\nexport function register(registry: PluginRegistry): void {\n registry.register(\"connector\", redisConnectorTarget);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/target.ts","../src/index.ts"],"sourcesContent":["/**\n * RedisConnector — Redis/KeyDB/Valkey key-value store resource.\n * Not mountable. Custom operations: get, set, keys, del, ttl, info.\n *\n * Requires `ioredis` (a runtime dependency of this package).\n */\n\nimport { resolveAuth, AbstractConnector } from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectContext,\n ConnectorDeclaration,\n ConnectorFieldSpec,\n ConnectorHandle,\n OperationDescriptor,\n RuntimeSkillDescriptor,\n ToolFace,\n} from \"@skaile/workspaces/connectors\";\nimport type {\n ConnectorContent,\n ConnectorEntry,\n ListOptions,\n SearchOptions,\n SearchResult,\n} from \"@skaile/workspaces/connectors\";\nimport type { ConnectorTarget } from \"@skaile/workspaces/plugin-registry\";\nimport * as z from \"zod\";\n\ninterface RedisState {\n client: any; // ioredis instance\n namespace: string;\n}\n\n/**\n * Connector for Redis, KeyDB, and Valkey key-value stores.\n * Provides get, set, keys, del, ttl, and info operations. Requires the `ioredis` package.\n */\nexport class RedisConnector extends AbstractConnector {\n readonly name = \"redis\";\n\n tools: ToolFace;\n\n constructor() {\n super();\n this.tools = {\n read: (handle, path) => this._read(handle, path),\n write: (handle, path, content) => this._write(handle, path, content),\n delete: (handle, path) => this._delete(handle, path),\n list: (handle, path, options) => this._list(handle, path, options),\n search: (handle, query, options) => this._search(handle, query, options),\n describeOperations: (handle) => this._describeOperations(handle),\n executeOp: (handle, operation, args) => this._executeOp(handle, operation, args),\n describeSkill: (handle, declaration) => this._describeSkill(handle, declaration),\n };\n }\n\n describeFields(): ConnectorFieldSpec[] {\n return [\n {\n key: \"url\",\n label: \"Redis URL\",\n description: \"Redis connection URL (e.g. redis://localhost:6379)\",\n type: \"url\",\n required: true,\n sensitive: true,\n group: \"Authentication\",\n },\n ];\n }\n\n private _describeSkill(\n _handle: ConnectorHandle,\n declaration: ConnectorDeclaration,\n ): RuntimeSkillDescriptor {\n const url = String(declaration.options?.url ?? \"\");\n let hostLabel = declaration.id;\n try {\n hostLabel = new URL(url).hostname;\n } catch {}\n return {\n id: declaration.id,\n name: `Redis — ${hostLabel}`,\n description: `Key-value store at ${hostLabel}`,\n category: \"kv\",\n access: declaration.access,\n toolNames: [\"get\", \"keys\", \"ttl\", \"info\"],\n };\n }\n\n async connect(declaration: ConnectorDeclaration, ctx: ConnectContext): Promise<ConnectorHandle> {\n const started = Date.now();\n const url =\n ctx.resolvedFields?.url ??\n resolveAuth(declaration.auth, ctx.secrets) ??\n String(declaration.options?.url ?? \"\");\n if (!url) {\n this.log.error(\"connect failed: missing url\", undefined);\n throw new Error(\"RedisAdapter requires auth (URL) or options.url\");\n }\n\n let host = \"(unknown)\";\n try {\n host = new URL(url).hostname;\n } catch {}\n this.log.info(\"connect start\", { host });\n\n try {\n const ioredisPkg = \"ioredis\";\n const mod = (await import(/* @vite-ignore */ ioredisPkg)) as any;\n const Redis = mod.default ?? mod.Redis ?? mod;\n const client = new Redis(url, { lazyConnect: true, maxRetriesPerRequest: 2 });\n await client.connect();\n\n const namespace = String(declaration.options?.namespace ?? \"\");\n\n this.log.info(\"connect ok\", { host, durationMs: Date.now() - started });\n return this.makeHandle(declaration, { client, namespace } satisfies RedisState);\n } catch (err) {\n this.log.error(\"connect failed\", err, { host });\n throw err;\n }\n }\n\n async disconnect(handle: ConnectorHandle): Promise<void> {\n this.log.info(\"disconnect\");\n const { client } = handle.state as RedisState;\n // Always mark disconnected and tear down the socket so ioredis stops\n // reconnecting even if a graceful quit() rejects.\n try {\n await client.quit();\n } catch {\n client.disconnect?.();\n } finally {\n handle.status = \"disconnected\";\n }\n }\n\n private client(handle: ConnectorHandle): any {\n return (handle.state as RedisState).client;\n }\n\n private nsKey(handle: ConnectorHandle, key: string): string {\n const ns = (handle.state as RedisState).namespace;\n return ns ? `${ns}:${key}` : key;\n }\n\n private stripNs(handle: ConnectorHandle, key: string): string {\n const ns = (handle.state as RedisState).namespace;\n return ns && key.startsWith(`${ns}:`) ? key.slice(ns.length + 1) : key;\n }\n\n private async _read(handle: ConnectorHandle, path: string): Promise<ConnectorContent | null> {\n const value = await this.client(handle).get(this.nsKey(handle, path));\n if (value === null) return null;\n return { data: value, contentType: \"application/json\" };\n }\n\n private async _write(\n handle: ConnectorHandle,\n path: string,\n content: ConnectorContent,\n ): Promise<void> {\n const data = typeof content.data === \"string\" ? content.data : content.data.toString(\"utf-8\");\n await this.client(handle).set(this.nsKey(handle, path), data);\n }\n\n private async _delete(handle: ConnectorHandle, path: string): Promise<boolean> {\n const count = await this.client(handle).del(this.nsKey(handle, path));\n return count > 0;\n }\n\n private async _list(\n handle: ConnectorHandle,\n path?: string,\n options?: ListOptions,\n ): Promise<ConnectorEntry[]> {\n const ns = (handle.state as RedisState).namespace;\n const pattern = path\n ? this.nsKey(handle, path.endsWith(\"*\") ? path : `${path}*`)\n : ns\n ? `${ns}:*`\n : \"*\";\n\n const keys: string[] = [];\n let cursor = \"0\";\n const limit = options?.limit ?? 1000;\n\n do {\n const [next, batch] = await this.client(handle).scan(cursor, \"MATCH\", pattern, \"COUNT\", 100);\n cursor = next;\n keys.push(...batch);\n if (keys.length >= limit) break;\n } while (cursor !== \"0\");\n\n return keys.slice(0, limit).map((k) => ({\n name: this.stripNs(handle, k),\n path: this.stripNs(handle, k),\n type: \"key\" as const,\n }));\n }\n\n private async _search(\n handle: ConnectorHandle,\n query: string,\n options?: SearchOptions,\n ): Promise<SearchResult[]> {\n // SCAN + GET for matching values (expensive but functional)\n const entries = await this._list(handle, undefined, { limit: options?.maxResults ?? 100 });\n const results: SearchResult[] = [];\n\n for (const entry of entries) {\n if (options?.maxResults && results.length >= options.maxResults) break;\n if (entry.name.includes(query)) {\n results.push({ path: entry.name });\n continue;\n }\n const value = await this.client(handle).get(this.nsKey(handle, entry.name));\n if (value?.includes(query)) {\n results.push({ path: entry.name, snippet: value.slice(0, 200) });\n }\n }\n return results;\n }\n\n private _describeOperations(handle: ConnectorHandle): OperationDescriptor[] {\n const ops: OperationDescriptor[] = [\n {\n name: \"get\",\n description: \"Get value by key.\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Redis key\" }],\n examples: ['get --key \"config:theme\"'],\n },\n {\n name: \"keys\",\n description: \"List keys matching a glob pattern.\",\n accessLevel: \"read\",\n args: [\n {\n name: \"pattern\",\n type: \"string\",\n required: false,\n description: \"Glob pattern (default: *)\",\n },\n ],\n examples: [\"keys\", 'keys --pattern \"user:*\"'],\n },\n {\n name: \"ttl\",\n description:\n \"Get remaining time-to-live for a key (seconds, -1 if no expiry, -2 if key does not exist).\",\n accessLevel: \"read\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Redis key\" }],\n },\n {\n name: \"info\",\n description: \"Get Redis server info (memory, clients, keyspace stats).\",\n accessLevel: \"read\",\n args: [\n {\n name: \"section\",\n type: \"string\",\n required: false,\n description: \"Info section (memory, clients, keyspace, all)\",\n },\n ],\n },\n ];\n\n if (handle.access === \"read-write\") {\n ops.push(\n {\n name: \"set\",\n description: \"Set a key-value pair with optional TTL.\",\n accessLevel: \"write\",\n args: [\n { name: \"key\", type: \"string\", required: true, description: \"Redis key\" },\n { name: \"value\", type: \"string\", required: true, description: \"Value to store\" },\n { name: \"ttl\", type: \"number\", required: false, description: \"Expiry in seconds\" },\n ],\n examples: [\n 'set --key \"status\" --value \"running\"',\n 'set --key \"cache:token\" --value \"abc\" --ttl 3600',\n ],\n },\n {\n name: \"del\",\n description: \"Delete one or more keys.\",\n accessLevel: \"write\",\n args: [{ name: \"key\", type: \"string\", required: true, description: \"Key to delete\" }],\n examples: ['del --key \"temp:session\"'],\n },\n );\n }\n\n return ops;\n }\n\n private async _executeOp(\n handle: ConnectorHandle,\n operation: string,\n args: Record<string, unknown>,\n ): Promise<string> {\n const client = this.client(handle);\n\n switch (operation) {\n case \"get\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const value = await client.get(this.nsKey(handle, key));\n return value ?? \"\";\n }\n case \"set\": {\n const key = String(args.key ?? \"\");\n const value = String(args.value ?? \"\");\n const fullKey = this.nsKey(handle, key);\n if (args.ttl) {\n await client.set(fullKey, value, \"EX\", Number(args.ttl));\n } else {\n await client.set(fullKey, value);\n }\n return \"OK\";\n }\n case \"keys\": {\n const pattern = args.pattern ? String(args.pattern) : \"*\";\n const entries = await this._list(handle, pattern.endsWith(\"*\") ? pattern : `${pattern}*`);\n return JSON.stringify(entries.map((e) => e.name));\n }\n case \"del\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const count = await client.del(this.nsKey(handle, key));\n return count > 0 ? \"Deleted\" : \"Not found\";\n }\n case \"ttl\": {\n const key = String(args.key ?? args._positional ?? \"\");\n const ttl = await client.ttl(this.nsKey(handle, key));\n return String(ttl);\n }\n case \"info\": {\n const section = args.section ? String(args.section) : undefined;\n const info = section ? await client.info(section) : await client.info();\n return info;\n }\n default:\n throw new Error(`RedisAdapter has no operation: ${operation}`);\n }\n }\n}\n\n/**\n * Creates a new RedisConnector instance.\n * @returns Configured RedisConnector ready to be registered in the connector registry.\n */\nexport function createConnector(): RedisConnector {\n return new RedisConnector();\n}\n\n/**\n * Plugin-registry target wrapping the Redis connector factory. Connectors take\n * no construct-time config, so `configSchema` is a passthrough and `create()`\n * returns a fresh instance; lifecycle config arrives via `Connector.connect()`.\n */\nexport const redisConnectorTarget: ConnectorTarget = {\n id: \"redis\",\n displayName: \"Redis\",\n apiVersion: 1,\n configSchema: z.unknown(),\n create: (_config, _ctx) => new RedisConnector(),\n};\n","/**\n * `@skaile/connector-redis` — Redis connector for `@skaile/workspaces`.\n *\n * Install via `skaile plugin install @skaile/connector-redis`; the plugin\n * loader calls `register(pluginRegistry)` at startup so `redis` becomes\n * resolvable as a connector driver.\n */\n\nimport type { PluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport { redisConnectorTarget } from \"./target.js\";\n\nexport { redisConnectorTarget, RedisConnector, createConnector } from \"./target.js\";\n\n/** Register this plugin's connector target with a registry. */\nexport function register(registry: PluginRegistry): void {\n registry.register(\"connector\", redisConnectorTarget);\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skaile/connector-redis",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Redis connector for @skaile/workspaces",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "@skaile/workspaces": ">=0.22.0-0"
26
26
  },
27
27
  "devDependencies": {
28
- "@skaile/workspaces": "^0.22.0"
28
+ "@skaile/workspaces": "^0.26.0"
29
29
  },
30
30
  "scripts": {
31
31
  "build": "tsup",