From 885abd8c4630cc18d567eb772a2755db704dc1f4 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Sat, 21 Feb 2026 02:09:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B3=200.0.53=EF=BC=8C=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=20query-login-node=20=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E9=85=8D=E7=BD=AE=EF=BC=8C=E4=BC=98=E5=8C=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=93=8D=E4=BD=9C=E5=90=8C=E6=AD=A5=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.config.ts | 8 ++ bun.lock | 143 ++++++++++++++++++++++++++ package.json | 13 +-- query/query-login/login-node-cache.ts | 81 ++++++++++----- query/query-login/query-login-node.ts | 11 +- query/query-login/query-login.ts | 3 + 6 files changed, 222 insertions(+), 37 deletions(-) create mode 100644 bun.lock diff --git a/bun.config.ts b/bun.config.ts index 454749f..6b35ca3 100644 --- a/bun.config.ts +++ b/bun.config.ts @@ -30,4 +30,12 @@ await buildWithBun({ meta: import.meta, target: 'node', dts: true, +}) + +await buildWithBun({ + naming: 'query-login-node', + entry: 'query/query-login/query-login-node.ts', + meta: import.meta, + target: 'node', + dts: true, }) \ No newline at end of file diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..5d85590 --- /dev/null +++ b/bun.lock @@ -0,0 +1,143 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "@kevisual/api", + "dependencies": { + "@kevisual/context": "^0.0.8", + "@kevisual/js-filter": "^0.0.5", + "@kevisual/load": "^0.0.6", + "@paralleldrive/cuid2": "^3.3.0", + "es-toolkit": "^1.44.0", + "eventemitter3": "^5.0.4", + "fuse.js": "^7.1.0", + "nanoid": "^5.1.6", + "path-browserify-esm": "^1.0.6", + "sonner": "^2.0.7", + "spark-md5": "^3.0.2", + "zustand": "^5.0.11", + }, + "devDependencies": { + "@kevisual/cache": "^0.0.5", + "@kevisual/code-builder": "^0.0.6", + "@kevisual/query": "^0.0.49", + "@kevisual/remote-app": "^0.0.4", + "@kevisual/router": "^0.0.83", + "@kevisual/types": "^0.0.12", + "@kevisual/use-config": "^1.0.30", + "@types/bun": "^1.3.9", + "@types/node": "^25.3.0", + "@types/spark-md5": "^3.0.5", + "dotenv": "^17.3.1", + "fast-glob": "^3.3.3", + "ws": "npm:@kevisual/ws", + }, + }, + }, + "packages": { + "@kevisual/cache": ["@kevisual/cache@0.0.5", "", { "dependencies": { "idb-keyval": "^6.2.2", "lru-cache": "^11.2.4", "nanoid": "^5.1.6" } }, "sha512-fgtUYGUUq/DY0KFV4CkWszNqvQUaA8XvMTUjoR9ZXRpau5IIDolD/Wen2TFsZ7G3Rfy+lef5dnaiZVDkZwdVKg=="], + + "@kevisual/code-builder": ["@kevisual/code-builder@0.0.6", "", { "bin": { "code-builder": "bin/code.js", "builder": "bin/code.js" } }, "sha512-0aqATB31/yw4k4s5/xKnfr4DKbUnx8e3Z3BmKbiXTrc+CqWiWTdlGe9bKI9dZ2Df+xNp6g11W4xM2NICNyyCCw=="], + + "@kevisual/context": ["@kevisual/context@0.0.8", "", {}, "sha512-DTJpyHI34NE76B7g6f+QlIqiCCyqI2qkBMQE736dzeRDGxOjnbe2iQY9W+Rt2PE6kmymM3qyOmSfNovyWyWrkA=="], + + "@kevisual/js-filter": ["@kevisual/js-filter@0.0.5", "", {}, "sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw=="], + + "@kevisual/load": ["@kevisual/load@0.0.6", "", { "dependencies": { "eventemitter3": "^5.0.1" } }, "sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA=="], + + "@kevisual/query": ["@kevisual/query@0.0.49", "", {}, "sha512-GrWW+QlBO5lkiqvb7PjOstNtpTQVSR74EHHWjm7YoL9UdT1wuPQXGUApZHmMBSh3NIWCf0AL2G1hPWZMC7YeOQ=="], + + "@kevisual/remote-app": ["@kevisual/remote-app@0.0.4", "", {}, "sha512-2yIlWY98pLCcxG+DJsqXXkd5YYEgymuOsyElH+31AoEPb7mlNREnYS81zN0KM9nvdSmU2G51vV4UVirJlYBZCQ=="], + + "@kevisual/router": ["@kevisual/router@0.0.83", "", { "dependencies": { "es-toolkit": "^1.44.0" } }, "sha512-CVazzM1rXVyvU7QcMQr0/EuqacRNEGalThDDLGQcvKEVHyduJ9yWddn6kezgWFCpNlPKhzSCKkIFuZVixNVxDQ=="], + + "@kevisual/types": ["@kevisual/types@0.0.12", "", {}, "sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q=="], + + "@kevisual/use-config": ["@kevisual/use-config@1.0.30", "", { "dependencies": { "@kevisual/load": "^0.0.6" }, "peerDependencies": { "dotenv": "^17" } }, "sha512-kPdna0FW/X7D600aMdiZ5UTjbCo6d8d4jjauSc8RMmBwUU6WliFDSPUNKVpzm2BsDX5Nth1IXFPYMqH+wxqAmw=="], + + "@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@paralleldrive/cuid2": ["@paralleldrive/cuid2@3.3.0", "", { "dependencies": { "@noble/hashes": "^2.0.1", "bignumber.js": "^9.3.1", "error-causes": "^3.0.2" }, "bin": { "cuid2": "bin/cuid2.js" } }, "sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw=="], + + "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], + + "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="], + + "@types/spark-md5": ["@types/spark-md5@3.0.5", "", {}, "sha512-lWf05dnD42DLVKQJZrDHtWFidcLrHuip01CtnC2/S6AMhX4t9ZlEUj4iuRlAnts0PQk7KESOqKxeGE/b6sIPGg=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="], + + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], + + "error-causes": ["error-causes@3.0.2", "", {}, "sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw=="], + + "es-toolkit": ["es-toolkit@1.44.0", "", {}, "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="], + + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "idb-keyval": ["idb-keyval@6.2.2", "", {}, "sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], + + "path-browserify-esm": ["path-browserify-esm@1.0.6", "", {}, "sha512-9nUwYvvu/yq1PYrUyYCihNWmpzacaRYF6gGbjLWErrZ4MRDWyfPN7RpE8E7tsw8eqBU/rr7mcoTXbS+Vih8uUA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="], + + "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], + + "spark-md5": ["spark-md5@3.0.2", "", {}, "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], + + "ws": ["@kevisual/ws@8.19.0", "", {}, "sha512-jLsL80wBBKkrJZrfk3SQpJ9JA/zREdlUROj7eCkmzqduAWKSI0wVcXuCKf+mLFCHB0Q0Tkh2rgzjSlurt3JQgw=="], + + "zustand": ["zustand@5.0.11", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg=="], + } +} diff --git a/package.json b/package.json index 4f25ef7..eaacde1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/api", - "version": "0.0.52", + "version": "0.0.54", "description": "", "main": "mod.ts", "scripts": { @@ -18,25 +18,25 @@ "keywords": [], "author": "abearxiong (https://www.xiongxiao.me)", "license": "MIT", - "packageManager": "pnpm@10.30.0", + "packageManager": "pnpm@10.30.1", "type": "module", "devDependencies": { "@kevisual/cache": "^0.0.5", "@kevisual/code-builder": "^0.0.6", - "@kevisual/query": "^0.0.47", + "@kevisual/query": "^0.0.49", "@kevisual/remote-app": "^0.0.4", - "@kevisual/router": "^0.0.75", + "@kevisual/router": "^0.0.83", "@kevisual/types": "^0.0.12", "@kevisual/use-config": "^1.0.30", "@types/bun": "^1.3.9", - "@types/node": "^25.2.3", + "@types/node": "^25.3.0", "@types/spark-md5": "^3.0.5", "dotenv": "^17.3.1", "fast-glob": "^3.3.3", "ws": "npm:@kevisual/ws" }, "dependencies": { - "@kevisual/context": "^0.0.6", + "@kevisual/context": "^0.0.8", "@kevisual/js-filter": "^0.0.5", "@kevisual/load": "^0.0.6", "@paralleldrive/cuid2": "^3.3.0", @@ -58,6 +58,7 @@ "./secret": "./query/query-secret/index.ts", "./resources": "./query/query-resources/index.ts", "./utils-node": "./dist/utils-node.js", + "./query-login-node": "./dist/query-login-node.js", "./utils": "./dist/utils.js", "./query-secret": "./dist/query-secret.js", "./query-mark": "./dist/query-mark.js", diff --git a/query/query-login/login-node-cache.ts b/query/query-login/login-node-cache.ts index a0e2b26..e71438d 100644 --- a/query/query-login/login-node-cache.ts +++ b/query/query-login/login-node-cache.ts @@ -2,9 +2,8 @@ import { Cache } from './login-cache.ts'; import { homedir } from 'node:os'; import { join, dirname } from 'node:path'; import fs from 'node:fs'; -import { readFileSync, writeFileSync, accessSync } from 'node:fs'; -import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; -export const fileExists = async ( +import { readFileSync, writeFileSync, accessSync, unlinkSync, mkdirSync } from 'node:fs'; +export const fileExists = ( filePath: string, { createIfNotExists = true, isFile = true, isDir = false }: { createIfNotExists?: boolean; isFile?: boolean; isDir?: boolean } = {}, ) => { @@ -13,10 +12,10 @@ export const fileExists = async ( return true; } catch (error) { if (createIfNotExists && isDir) { - await mkdir(filePath, { recursive: true }); + mkdirSync(filePath, { recursive: true }); return true; } else if (createIfNotExists && isFile) { - await mkdir(dirname(filePath), { recursive: true }); + mkdirSync(dirname(filePath), { recursive: true }); return false; } return false; @@ -34,32 +33,53 @@ export const readConfigFile = (filePath: string) => { export const writeConfigFile = (filePath: string, data: any) => { writeFileSync(filePath, JSON.stringify(data, null, 2)); }; -export const getHostName = () => { +/** + * 获取主机名, + * 例如:https://kevisual.cn 返回 kevisual.cn + * 这里是读取默认的配置文件 ~/.config/envision/config.json 中的 baseURL 字段来获取主机名的,如果没有配置 baseURL 则默认使用 https://kevisual.cn + * @returns 主机名 + */ +export const getHostName = (baseURL?: string) => { const configDir = join(homedir(), '.config', 'envision'); const configFile = join(configDir, 'config.json'); const config = readConfigFile(configFile); - const baseURL = config.baseURL || 'https://kevisual.cn'; - const hostname = new URL(baseURL).hostname; + const _baseURL = baseURL || config.baseURL || 'https://kevisual.cn'; + const hostname = new URL(_baseURL).hostname; return hostname; }; export class StorageNode implements Storage { cacheData: any; - filePath: string; - constructor() { + filePath: string = ''; + hostname: string = ''; + isLoaded: boolean = false; + constructor(opts?: { baseURL?: string, load?: boolean }) { this.cacheData = {}; - const configDir = join(homedir(), '.config', 'envision'); - const hostname = getHostName(); - this.filePath = join(configDir, 'config', `${hostname}-storage.json`); - fileExists(this.filePath, { isFile: true }); + const hostname = getHostName(opts?.baseURL); + this.setHostName(hostname, { load: opts?.load }); } - async loadCache() { + setHostName(hostname: string, opts?: { load?: boolean }) { + const load = opts?.load ?? false; + if (hostname.startsWith('http')) { + hostname = new URL(hostname).hostname; + } + const configDir = join(homedir(), '.config', 'envision'); + this.filePath = join(configDir, 'config', `${hostname}-storage.json`); + this.hostname = hostname; + fileExists(this.filePath, { isFile: true }); + if (load) { + this.loadCache(); + } + } + loadCache(force?: boolean) { + if (this.isLoaded && !force) return; const filePath = this.filePath; try { - const data = await readConfigFile(filePath); + const data = readConfigFile(filePath); this.cacheData = data; + this.isLoaded = true; } catch (error) { this.cacheData = {}; - await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); + writeFileSync(filePath, JSON.stringify(this.cacheData, null, 2)); } } get length() { @@ -70,15 +90,15 @@ export class StorageNode implements Storage { } setItem(key: string, value: any) { this.cacheData[key] = value; - writeFile(this.filePath, JSON.stringify(this.cacheData, null, 2)); + writeFileSync(this.filePath, JSON.stringify(this.cacheData, null, 2)); } removeItem(key: string) { delete this.cacheData[key]; - writeFile(this.filePath, JSON.stringify(this.cacheData, null, 2)); + writeFileSync(this.filePath, JSON.stringify(this.cacheData, null, 2)); } clear() { this.cacheData = {}; - writeFile(this.filePath, JSON.stringify(this.cacheData, null, 2)); + writeFileSync(this.filePath, JSON.stringify(this.cacheData, null, 2)); } key(index: number) { return Object.keys(this.cacheData)[index]; @@ -86,10 +106,13 @@ export class StorageNode implements Storage { } export class LoginNodeCache implements Cache { filepath: string; - - constructor(filepath?: string) { - this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); + isLoaded: boolean = false; + constructor(opts?: { baseURL?: string, load?: boolean }) { + this.filepath = join(homedir(), '.config', 'envision', 'config', `${getHostName(opts?.baseURL)}-login.json`); fileExists(this.filepath, { isFile: true }); + if (opts?.load) { + this.loadCache(this.filepath); + } } async get(_key: string) { try { @@ -111,12 +134,14 @@ export class LoginNodeCache implements Cache { } } async del() { - await unlink(this.filepath); + unlinkSync(this.filepath); } - async loadCache(filePath: string) { + loadCache(filePath: string, force?: boolean) { + if (this.isLoaded && !force) return; try { - const data = await readFile(filePath, 'utf-8'); + const data = readFileSync(filePath, 'utf-8'); const jsonData = JSON.parse(data); + this.isLoaded = true; return jsonData; } catch (error) { // console.log('loadCache error', error); @@ -126,7 +151,7 @@ export class LoginNodeCache implements Cache { return defaultData; } } - async init() { - return await this.loadCache(this.filepath); + init() { + return this.loadCache(this.filepath); } } diff --git a/query/query-login/query-login-node.ts b/query/query-login/query-login-node.ts index 5cb6527..9ca5cd1 100644 --- a/query/query-login/query-login-node.ts +++ b/query/query-login/query-login-node.ts @@ -1,14 +1,19 @@ import { QueryLogin, QueryLoginOpts } from './query-login.ts'; import { LoginNodeCache, StorageNode } from './login-node-cache.ts'; type QueryLoginNodeOptsWithoutCache = Omit; -export const storage = new StorageNode(); -await storage.loadCache(); +export { StorageNode } +export const cache = new LoginNodeCache(); export class QueryLoginNode extends QueryLogin { + declare storage: StorageNode; constructor(opts: QueryLoginNodeOptsWithoutCache) { + const baseURL = opts?.query?.baseURL; + const storage = new StorageNode({ baseURL, load: true }); + const cache = new LoginNodeCache({ baseURL, load: true }); super({ ...opts, + isBrowser: false, storage, - cache: new LoginNodeCache(), + cache, }); } } diff --git a/query/query-login/query-login.ts b/query/query-login/query-login.ts index 8101b33..f9d7fb7 100644 --- a/query/query-login/query-login.ts +++ b/query/query-login/query-login.ts @@ -39,6 +39,9 @@ export class QueryLogin extends BaseQuery { this.init(); this.onLoad = opts?.onLoad; this.storage = opts?.storage || globalThis?.localStorage; + if (!this.storage) { + throw new Error('storage is required'); + } } setQuery(query: Query) { this.query = query;