@dimension-studios/ttk-proxy 1.48.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{logger as e}from"@rharkor/logger";import{program as t}from"commander";import"dotenv/config";import{fetch as n}from"undici";import r from"conf";const i=new r({projectName:`ttk-proxy`});function a(){let e=i.get(`apiUrl`),t=i.get(`apiKey`),n=i.get(`apiSecret`);if(!e||!t||!n)throw Error(`Missing configuration. Please set apiUrl, apiKey, and apiSecret using environment variables or the config command.`);return{apiUrl:e,apiKey:t,apiSecret:n}}function o(e){e.apiUrl&&i.set(`apiUrl`,e.apiUrl),e.apiKey&&i.set(`apiKey`,e.apiKey),e.apiSecret&&i.set(`apiSecret`,e.apiSecret)}function s(){let e=process.env.TTK_FETCH_API_URL,t=process.env.TTK_FETCH_API_KEY,n=process.env.TTK_FETCH_API_SECRET;e&&i.set(`apiUrl`,e),t&&i.set(`apiKey`,t),n&&i.set(`apiSecret`,n)}const c=e=>{try{return JSON.parse(e)}catch{let t=`"${e}"`;return JSON.parse(JSON.parse(t))}};async function l(t){let r=a();try{let i=c(t);e.debug(`Calling TikTok proxy API`,{url:r.apiUrl,body:i});let a=await n(`${r.apiUrl}/ttk-proxy`,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Api-Key":r.apiKey,"X-Api-Secret":r.apiSecret},body:JSON.stringify(i),signal:AbortSignal.timeout(1e4)}),o=await a.text(),s;try{s=JSON.parse(o)}catch{s=o}return{status:a.status,statusText:a.statusText,body:s}}catch(t){throw e.error(`Failed to call TikTok proxy API`,t),t}}async function u(){let t=a();try{e.debug(`Listing TikTok proxy tokens`,{url:t.apiUrl});let r=await n(`${t.apiUrl}/ttk-proxy/list`,{method:`GET`,headers:{"X-Api-Key":t.apiKey,"X-Api-Secret":t.apiSecret},signal:AbortSignal.timeout(1e4)});if(!r.ok){let e=await r.text();throw Error(`HTTP ${r.status}: ${e}`)}return await r.json()}catch(t){throw e.error(`Failed to list TikTok proxy tokens`,t),t}}async function d(t){try{e.info(`šŸš€ Calling TikTok Proxy API...`);let n=await l(t);e.success(`āœ… Status: ${n.status} ${n.statusText}`),e.info(`
2
+ import{logger as e}from"@rharkor/logger";import{program as t}from"commander";import"dotenv/config";import{fetch as n}from"undici";import r from"conf";const i=new r({projectName:`ttk-proxy`});function a(){let e=i.get(`apiUrl`),t=i.get(`apiKey`),n=i.get(`apiSecret`);if(!e||!t||!n)throw Error(`Missing configuration. Please set apiUrl, apiKey, and apiSecret using environment variables or the config command.`);return{apiUrl:e,apiKey:t,apiSecret:n}}function o(e){e.apiUrl&&i.set(`apiUrl`,e.apiUrl),e.apiKey&&i.set(`apiKey`,e.apiKey),e.apiSecret&&i.set(`apiSecret`,e.apiSecret)}function s(){let e=process.env.TTK_FETCH_API_URL,t=process.env.TTK_FETCH_API_KEY,n=process.env.TTK_FETCH_API_SECRET;e&&i.set(`apiUrl`,e),t&&i.set(`apiKey`,t),n&&i.set(`apiSecret`,n)}const c=e=>{try{return JSON.parse(e)}catch{let t=`"${e}"`;return JSON.parse(JSON.parse(t))}};async function l(t){let r=a();try{let e=c(t),i=await n(`${r.apiUrl}/ttk-proxy/get-curl`,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Api-Key":r.apiKey,"X-Api-Secret":r.apiSecret},body:JSON.stringify(e),signal:AbortSignal.timeout(1e4)});if(i.ok){let e=await i.json();console.log(`
3
+ šŸ“‹ Curl command:`),console.log(e.curl),console.log(``)}let a=await n(`${r.apiUrl}/ttk-proxy`,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Api-Key":r.apiKey,"X-Api-Secret":r.apiSecret},body:JSON.stringify(e),signal:AbortSignal.timeout(1e4)}),o=await a.text(),s;try{s=JSON.parse(o)}catch{s=o}return{status:a.status,statusText:a.statusText,body:s}}catch(t){throw e.error(`Failed to call TikTok proxy API`,t),t}}async function u(){let t=a();try{e.debug(`Listing TikTok proxy tokens`,{url:t.apiUrl});let r=await n(`${t.apiUrl}/ttk-proxy/list`,{method:`GET`,headers:{"X-Api-Key":t.apiKey,"X-Api-Secret":t.apiSecret},signal:AbortSignal.timeout(1e4)});if(!r.ok){let e=await r.text();throw Error(`HTTP ${r.status}: ${e}`)}return await r.json()}catch(t){throw e.error(`Failed to list TikTok proxy tokens`,t),t}}async function d(t){try{e.info(`šŸš€ Calling TikTok Proxy API...`);let n=await l(t);e.success(`āœ… Status: ${n.status} ${n.statusText}`),e.info(`
3
4
  šŸ“¦ Response:`),console.log(JSON.stringify(n.body,null,2))}catch(t){e.error(`āŒ Failed to call TikTok Proxy API`),t instanceof Error?e.error(t.message):e.error(String(t)),process.exit(1)}}function f(t){try{if(t.clear){i.clear(),e.success(`āœ… Configuration cleared`);return}if(t.show){let t=i.store;e.info(`šŸ“‹ Current configuration:`),console.log(JSON.stringify(t,null,2));return}s();let n=i.get(`apiUrl`),r=i.get(`apiKey`),a=i.get(`apiSecret`);(!n||!r||!a)&&(e.error(`āŒ Missing configuration`),e.info(`Please set the following environment variables:`),e.info(` - TTK_FETCH_API_URL`),e.info(` - TTK_FETCH_API_KEY`),e.info(` - TTK_FETCH_API_SECRET`),e.info(`Or manually set them using:`),e.info(` config:set apiUrl 'your-url'`),e.info(` config:set apiKey 'your-key'`),e.info(` config:set apiSecret 'your-secret'`),process.exit(1)),e.success(`āœ… Configuration loaded successfully`),e.info(`šŸ“‹ Current configuration:`),e.info(` API URL: ${n}`),e.info(` API Key: ${r}`),e.info(` API Secret: ${o(a)}`);function o(e){return!e||e.length<8?`*`.repeat(e.length):`${e.slice(0,4)}${`*`.repeat(e.length-8)}${e.slice(-4)}`}}catch(t){e.error(`āŒ Failed to manage configuration`),t instanceof Error?e.error(t.message):e.error(String(t)),process.exit(1)}}function p(t,n){try{[`apiUrl`,`apiKey`,`apiSecret`].includes(t)||(e.error(`āŒ Invalid config key: ${t}`),e.info(`Valid keys: apiUrl, apiKey, apiSecret`),process.exit(1)),o({[t]:n}),e.success(`āœ… Set ${t} successfully`)}catch(t){e.error(`āŒ Failed to set configuration`),t instanceof Error?e.error(t.message):e.error(String(t)),process.exit(1)}}async function m(){try{e.info(`šŸ” Listing TikTok Proxy tokens...`);let t=await u();if(t.length===0){e.warn(`āš ļø No tokens found`);return}e.success(`āœ… Found ${t.length} token(s)`),e.info(`
4
- šŸ“‹ Tokens:`),console.log(JSON.stringify(t,null,2))}catch(t){e.error(`āŒ Failed to list TikTok Proxy tokens`),t instanceof Error?e.error(t.message):e.error(String(t)),process.exit(1)}}await e.init(),s(),t.name(`ttk-proxy`).description(`CLI tool for TikTok Proxy API`).version(`1.0.0`),t.command(`call`).description(`Call the TikTok Proxy API with a JSON body`).argument(`<body>`,`Stringified JSON body for the request`).action(async e=>{await d(e)}),t.command(`list`).description(`List all TikTok Proxy tokens`).action(async()=>{await m()}),t.command(`config`).description(`Manage configuration`).option(`-s, --show`,`Show current configuration`).option(`-c, --clear`,`Clear all configuration`).action(e=>{f(e)}),t.command(`config:set`).description(`Set a configuration value`).argument(`<key>`,`Configuration key (apiUrl, apiKey, apiSecret)`).argument(`<value>`,`Configuration value`).action((e,t)=>{p(e,t)}),t.parse();export{};
5
- //# sourceMappingURL=index.mjs.map
5
+ šŸ“‹ Tokens:`),console.log(JSON.stringify(t,null,2))}catch(t){e.error(`āŒ Failed to list TikTok Proxy tokens`),t instanceof Error?e.error(t.message):e.error(String(t)),process.exit(1)}}await e.init(),s(),t.name(`ttk-proxy`).description(`CLI tool for TikTok Proxy API`).version(`1.0.0`),t.command(`call`).description(`Call the TikTok Proxy API with a JSON body`).argument(`<body>`,`Stringified JSON body for the request`).action(async e=>{await d(e)}),t.command(`list`).description(`List all TikTok Proxy tokens`).action(async()=>{await m()}),t.command(`config`).description(`Manage configuration`).option(`-s, --show`,`Show current configuration`).option(`-c, --clear`,`Clear all configuration`).action(e=>{f(e)}),t.command(`config:set`).description(`Set a configuration value`).argument(`<key>`,`Configuration key (apiUrl, apiKey, apiSecret)`).argument(`<value>`,`Configuration value`).action((e,t)=>{p(e,t)}),t.parse();export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dimension-studios/ttk-proxy",
3
- "version": "1.48.0",
3
+ "version": "1.49.0",
4
4
  "description": "CLI tool for TikTok proxy API",
5
5
  "keywords": [
6
6
  "tiktok",
@@ -41,16 +41,15 @@
41
41
  "prepublishOnly": "npm run build"
42
42
  },
43
43
  "dependencies": {
44
- "@dimension/typescript-config": "*",
45
44
  "@rharkor/logger": "1.3.3",
46
- "commander": "^12.1.0",
47
- "conf": "^13.1.0",
45
+ "commander": "^14.0.0",
46
+ "conf": "^15.0.0",
48
47
  "dotenv": "17.2.3",
49
48
  "tsdown": "0.16.6",
50
49
  "undici": "^7.2.2"
51
50
  },
52
51
  "devDependencies": {
53
- "@types/node": "24.10.0",
52
+ "@types/node": "24.10.1",
54
53
  "dotenv-cli": "11.0.0",
55
54
  "tsx": "4.20.6",
56
55
  "typescript": "5.9.3"
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["config","parsedResponseBody: unknown"],"sources":["../src/lib/config.ts","../src/lib/client.ts","../src/commands/call.ts","../src/commands/config.ts","../src/commands/list.ts","../src/index.ts"],"sourcesContent":["import Conf from \"conf\"\n\nexport interface TtkProxyConfig {\n apiUrl?: string\n apiKey?: string\n apiSecret?: string\n}\n\nexport const config = new Conf<TtkProxyConfig>({\n projectName: \"ttk-proxy\",\n})\n\nexport function getConfig(): Required<TtkProxyConfig> {\n const apiUrl = config.get(\"apiUrl\")\n const apiKey = config.get(\"apiKey\")\n const apiSecret = config.get(\"apiSecret\")\n\n if (!apiUrl || !apiKey || !apiSecret) {\n throw new Error(\n \"Missing configuration. Please set apiUrl, apiKey, and apiSecret using environment variables or the config command.\"\n )\n }\n\n return { apiUrl, apiKey, apiSecret }\n}\n\nexport function setConfig(partial: Partial<TtkProxyConfig>): void {\n if (partial.apiUrl) config.set(\"apiUrl\", partial.apiUrl)\n if (partial.apiKey) config.set(\"apiKey\", partial.apiKey)\n if (partial.apiSecret) config.set(\"apiSecret\", partial.apiSecret)\n}\n\nexport function loadConfigFromEnv(): void {\n // biome-ignore lint/style/noProcessEnv: CLI configuration\n const apiUrl = process.env.TTK_FETCH_API_URL\n // biome-ignore lint/style/noProcessEnv: CLI configuration\n const apiKey = process.env.TTK_FETCH_API_KEY\n // biome-ignore lint/style/noProcessEnv: CLI configuration\n const apiSecret = process.env.TTK_FETCH_API_SECRET\n\n if (apiUrl) config.set(\"apiUrl\", apiUrl)\n if (apiKey) config.set(\"apiKey\", apiKey)\n if (apiSecret) config.set(\"apiSecret\", apiSecret)\n}\n","import { logger } from \"@rharkor/logger\"\nimport { fetch } from \"undici\"\n\nimport { getConfig } from \"./config\"\n\nexport interface TtkProxyCallResponse {\n status: number\n statusText: string\n body: unknown\n}\n\nexport interface TtkProxyListItem {\n key: string\n allShops: boolean\n shops: string[]\n}\n\nconst parseBody = (body: string) => {\n try {\n return JSON.parse(body)\n } catch {\n // Try encapsulating the body in quotes then parse two times\n const quotedBody = `\"${body}\"`\n return JSON.parse(JSON.parse(quotedBody))\n }\n}\n\nexport async function callTtkProxy(body: string): Promise<TtkProxyCallResponse> {\n const config = getConfig()\n\n try {\n const parsedBody = parseBody(body)\n\n logger.debug(\"Calling TikTok proxy API\", {\n url: config.apiUrl,\n body: parsedBody,\n })\n\n const response = await fetch(`${config.apiUrl}/ttk-proxy`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key\": config.apiKey,\n \"X-Api-Secret\": config.apiSecret,\n },\n body: JSON.stringify(parsedBody),\n signal: AbortSignal.timeout(10_000),\n })\n\n const responseBody = await response.text()\n let parsedResponseBody: unknown\n\n try {\n parsedResponseBody = JSON.parse(responseBody)\n } catch {\n parsedResponseBody = responseBody\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n body: parsedResponseBody,\n }\n } catch (error) {\n logger.error(\"Failed to call TikTok proxy API\", error)\n throw error\n }\n}\n\nexport async function listTtkProxy(): Promise<TtkProxyListItem[]> {\n const config = getConfig()\n\n try {\n logger.debug(\"Listing TikTok proxy tokens\", {\n url: config.apiUrl,\n })\n\n const response = await fetch(`${config.apiUrl}/ttk-proxy/list`, {\n method: \"GET\",\n headers: {\n \"X-Api-Key\": config.apiKey,\n \"X-Api-Secret\": config.apiSecret,\n },\n signal: AbortSignal.timeout(10_000),\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`HTTP ${response.status}: ${text}`)\n }\n\n const data = (await response.json()) as TtkProxyListItem[]\n return data\n } catch (error) {\n logger.error(\"Failed to list TikTok proxy tokens\", error)\n throw error\n }\n}\n","import { logger } from \"@rharkor/logger\"\n\nimport { callTtkProxy } from \"../lib/client\"\n\nexport async function callCommand(body: string): Promise<void> {\n try {\n logger.info(\"šŸš€ Calling TikTok Proxy API...\")\n\n const response = await callTtkProxy(body)\n\n logger.success(`āœ… Status: ${response.status} ${response.statusText}`)\n\n logger.info(\"\\nšŸ“¦ Response:\")\n // biome-ignore lint/suspicious/noConsole: CLI output\n console.log(JSON.stringify(response.body, null, 2))\n } catch (error) {\n logger.error(\"āŒ Failed to call TikTok Proxy API\")\n if (error instanceof Error) {\n logger.error(error.message)\n } else {\n logger.error(String(error))\n }\n process.exit(1)\n }\n}\n","import { logger } from \"@rharkor/logger\"\n\nimport { config, loadConfigFromEnv, setConfig } from \"../lib/config\"\n\nexport function configCommand(options: { show?: boolean; clear?: boolean }): void {\n try {\n if (options.clear) {\n config.clear()\n logger.success(\"āœ… Configuration cleared\")\n return\n }\n\n if (options.show) {\n const currentConfig = config.store\n logger.info(\"šŸ“‹ Current configuration:\")\n // biome-ignore lint/suspicious/noConsole: CLI output\n console.log(JSON.stringify(currentConfig, null, 2))\n return\n }\n\n // Load from environment variables\n loadConfigFromEnv()\n\n const apiUrl = config.get(\"apiUrl\")\n const apiKey = config.get(\"apiKey\")\n const apiSecret = config.get(\"apiSecret\")\n\n if (!apiUrl || !apiKey || !apiSecret) {\n logger.error(\"āŒ Missing configuration\")\n logger.info(\"Please set the following environment variables:\")\n logger.info(\" - TTK_FETCH_API_URL\")\n logger.info(\" - TTK_FETCH_API_KEY\")\n logger.info(\" - TTK_FETCH_API_SECRET\")\n logger.info(\"Or manually set them using:\")\n logger.info(\" config:set apiUrl 'your-url'\")\n logger.info(\" config:set apiKey 'your-key'\")\n logger.info(\" config:set apiSecret 'your-secret'\")\n process.exit(1)\n }\n\n logger.success(\"āœ… Configuration loaded successfully\")\n logger.info(\"šŸ“‹ Current configuration:\")\n logger.info(` API URL: ${apiUrl}`)\n logger.info(` API Key: ${apiKey}`)\n logger.info(` API Secret: ${maskSecret(apiSecret)}`)\n\n function maskSecret(secret: string): string {\n if (!secret || secret.length < 8) {\n // If the secret is too short, obscure most of it\n return \"*\".repeat(secret.length)\n }\n return `${secret.slice(0, 4)}${\"*\".repeat(secret.length - 8)}${secret.slice(-4)}`\n }\n } catch (error) {\n logger.error(\"āŒ Failed to manage configuration\")\n if (error instanceof Error) {\n logger.error(error.message)\n } else {\n logger.error(String(error))\n }\n process.exit(1)\n }\n}\n\nexport function setConfigCommand(key: string, value: string): void {\n try {\n if (![\"apiUrl\", \"apiKey\", \"apiSecret\"].includes(key)) {\n logger.error(`āŒ Invalid config key: ${key}`)\n logger.info(\"Valid keys: apiUrl, apiKey, apiSecret\")\n process.exit(1)\n }\n\n setConfig({ [key]: value })\n logger.success(`āœ… Set ${key} successfully`)\n } catch (error) {\n logger.error(\"āŒ Failed to set configuration\")\n if (error instanceof Error) {\n logger.error(error.message)\n } else {\n logger.error(String(error))\n }\n process.exit(1)\n }\n}\n","import { logger } from \"@rharkor/logger\"\n\nimport { listTtkProxy } from \"../lib/client\"\n\nexport async function listCommand(): Promise<void> {\n try {\n logger.info(\"šŸ” Listing TikTok Proxy tokens...\")\n\n const tokens = await listTtkProxy()\n\n if (tokens.length === 0) {\n logger.warn(\"āš ļø No tokens found\")\n return\n }\n\n logger.success(`āœ… Found ${tokens.length} token(s)`)\n\n logger.info(\"\\nšŸ“‹ Tokens:\")\n // biome-ignore lint/suspicious/noConsole: CLI output\n console.log(JSON.stringify(tokens, null, 2))\n } catch (error) {\n logger.error(\"āŒ Failed to list TikTok Proxy tokens\")\n if (error instanceof Error) {\n logger.error(error.message)\n } else {\n logger.error(String(error))\n }\n process.exit(1)\n }\n}\n","#!/usr/bin/env node\n\nimport { logger } from \"@rharkor/logger\"\nimport { program } from \"commander\"\nimport \"dotenv/config\"\n\nimport { callCommand } from \"./commands/call\"\nimport { configCommand, setConfigCommand } from \"./commands/config\"\nimport { listCommand } from \"./commands/list\"\nimport { loadConfigFromEnv } from \"./lib/config\"\n\nawait logger.init()\n\n// Load configuration from environment variables\nloadConfigFromEnv()\n\nprogram.name(\"ttk-proxy\").description(\"CLI tool for TikTok Proxy API\").version(\"1.0.0\")\n\nprogram\n .command(\"call\")\n .description(\"Call the TikTok Proxy API with a JSON body\")\n .argument(\"<body>\", \"Stringified JSON body for the request\")\n .action(async (body: string) => {\n await callCommand(body)\n })\n\nprogram\n .command(\"list\")\n .description(\"List all TikTok Proxy tokens\")\n .action(async () => {\n await listCommand()\n })\n\nprogram\n .command(\"config\")\n .description(\"Manage configuration\")\n .option(\"-s, --show\", \"Show current configuration\")\n .option(\"-c, --clear\", \"Clear all configuration\")\n .action((options: { show?: boolean; clear?: boolean }) => {\n configCommand(options)\n })\n\nprogram\n .command(\"config:set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Configuration key (apiUrl, apiKey, apiSecret)\")\n .argument(\"<value>\", \"Configuration value\")\n .action((key: string, value: string) => {\n setConfigCommand(key, value)\n })\n\nprogram.parse()\n"],"mappings":"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"}