@thyme-sh/sdk 0.3.0 → 0.3.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/dist/index.d.ts +61 -1
- package/dist/index.js +70 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,14 +12,72 @@ interface DecompressResult {
|
|
|
12
12
|
/**
|
|
13
13
|
* Compress source and bundle into a ZIP archive
|
|
14
14
|
* Uses fflate for fast, modern compression
|
|
15
|
+
* Uses SHA-256 for cryptographically secure checksum
|
|
15
16
|
*/
|
|
16
17
|
declare function compressTask(source: string, bundle: string): CompressResult;
|
|
17
18
|
/**
|
|
18
19
|
* Decompress ZIP archive and extract source and bundle files
|
|
19
20
|
* Uses fflate for fast decompression
|
|
21
|
+
* Includes ZIP bomb protection
|
|
20
22
|
*/
|
|
21
23
|
declare function decompressTask(zipBuffer: Uint8Array | ArrayBuffer): DecompressResult;
|
|
22
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Log entry with type and message
|
|
27
|
+
*/
|
|
28
|
+
interface LogEntry {
|
|
29
|
+
type: 'info' | 'warn' | 'error';
|
|
30
|
+
message: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Logger for Thyme tasks
|
|
34
|
+
*
|
|
35
|
+
* Use this logger to output messages that will be captured and displayed
|
|
36
|
+
* in the Thyme dashboard. Regular console.log calls will not be captured.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* export default defineTask({
|
|
41
|
+
* schema: z.object({ ... }),
|
|
42
|
+
* async run(ctx) {
|
|
43
|
+
* ctx.logger.info('Starting task execution')
|
|
44
|
+
* ctx.logger.warn('Low balance detected')
|
|
45
|
+
* ctx.logger.error('Failed to fetch price')
|
|
46
|
+
* return { canExec: false, message: 'Error occurred' }
|
|
47
|
+
* }
|
|
48
|
+
* })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
declare class Logger {
|
|
52
|
+
private logs;
|
|
53
|
+
private static readonly LOG_PREFIX;
|
|
54
|
+
/**
|
|
55
|
+
* Log an info message
|
|
56
|
+
*/
|
|
57
|
+
info(message: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Log a warning message
|
|
60
|
+
*/
|
|
61
|
+
warn(message: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Log an error message
|
|
64
|
+
*/
|
|
65
|
+
error(message: string): void;
|
|
66
|
+
private log;
|
|
67
|
+
/**
|
|
68
|
+
* Get all collected logs
|
|
69
|
+
*/
|
|
70
|
+
getLogs(): LogEntry[];
|
|
71
|
+
/**
|
|
72
|
+
* Clear all collected logs
|
|
73
|
+
*/
|
|
74
|
+
clear(): void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create a new logger instance
|
|
78
|
+
*/
|
|
79
|
+
declare function createLogger(): Logger;
|
|
80
|
+
|
|
23
81
|
/**
|
|
24
82
|
* Extended Zod with Ethereum address validation
|
|
25
83
|
*/
|
|
@@ -233,6 +291,8 @@ interface ThymeContext<TArgs> {
|
|
|
233
291
|
args: TArgs;
|
|
234
292
|
/** Viem public client for reading blockchain data */
|
|
235
293
|
client: PublicClient;
|
|
294
|
+
/** Logger for outputting messages to the Thyme dashboard */
|
|
295
|
+
logger: Logger;
|
|
236
296
|
}
|
|
237
297
|
/**
|
|
238
298
|
* A call to be executed on-chain
|
|
@@ -307,4 +367,4 @@ interface TaskDefinition<TSchema extends z.ZodType> {
|
|
|
307
367
|
*/
|
|
308
368
|
declare function defineTask<TSchema extends z.ZodType>(definition: TaskDefinition<TSchema>): TaskDefinition<TSchema>;
|
|
309
369
|
|
|
310
|
-
export { type Call, type CompressResult, type DecompressResult, type FailResult, type InferSchema, type SuccessResult, type TaskDefinition, type TaskResult, type ThymeContext, compressTask, decompressTask, defineTask, zodExtended as z };
|
|
370
|
+
export { type Call, type CompressResult, type DecompressResult, type FailResult, type InferSchema, type LogEntry, Logger, type SuccessResult, type TaskDefinition, type TaskResult, type ThymeContext, compressTask, createLogger, decompressTask, defineTask, zodExtended as z };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
// src/archive.ts
|
|
2
|
+
import { createHash } from "crypto";
|
|
2
3
|
import { strFromU8, strToU8, unzipSync, zipSync } from "fflate";
|
|
4
|
+
var MAX_ZIP_SIZE = 10 * 1024 * 1024;
|
|
5
|
+
var MAX_DECOMPRESSED_SIZE = 50 * 1024 * 1024;
|
|
6
|
+
function calculateSha256(data) {
|
|
7
|
+
return createHash("sha256").update(data).digest("hex");
|
|
8
|
+
}
|
|
3
9
|
function compressTask(source, bundle) {
|
|
4
10
|
const files = {
|
|
5
11
|
"source.ts": strToU8(source),
|
|
@@ -9,15 +15,7 @@ function compressTask(source, bundle) {
|
|
|
9
15
|
level: 6
|
|
10
16
|
// Balanced compression
|
|
11
17
|
});
|
|
12
|
-
|
|
13
|
-
for (let i = 0; i < compressed.length; i++) {
|
|
14
|
-
const byte = compressed[i];
|
|
15
|
-
if (byte !== void 0) {
|
|
16
|
-
hash = (hash << 5) - hash + byte;
|
|
17
|
-
hash = hash & hash;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
const checksum = Math.abs(hash).toString(16);
|
|
18
|
+
const checksum = calculateSha256(compressed);
|
|
21
19
|
return {
|
|
22
20
|
zipBuffer: compressed,
|
|
23
21
|
checksum
|
|
@@ -25,7 +23,24 @@ function compressTask(source, bundle) {
|
|
|
25
23
|
}
|
|
26
24
|
function decompressTask(zipBuffer) {
|
|
27
25
|
const uint8Array = zipBuffer instanceof ArrayBuffer ? new Uint8Array(zipBuffer) : zipBuffer;
|
|
26
|
+
if (uint8Array.length > MAX_ZIP_SIZE) {
|
|
27
|
+
throw new Error(
|
|
28
|
+
`ZIP file too large: ${uint8Array.length} bytes (max: ${MAX_ZIP_SIZE})`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
28
31
|
const decompressed = unzipSync(uint8Array);
|
|
32
|
+
let totalDecompressedSize = 0;
|
|
33
|
+
for (const key of Object.keys(decompressed)) {
|
|
34
|
+
const file = decompressed[key];
|
|
35
|
+
if (file) {
|
|
36
|
+
totalDecompressedSize += file.length;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (totalDecompressedSize > MAX_DECOMPRESSED_SIZE) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`Decompressed content too large: ${totalDecompressedSize} bytes (max: ${MAX_DECOMPRESSED_SIZE})`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
29
44
|
const sourceBytes = decompressed["source.ts"];
|
|
30
45
|
const bundleBytes = decompressed["bundle.js"];
|
|
31
46
|
if (!sourceBytes) {
|
|
@@ -42,6 +57,50 @@ function decompressTask(zipBuffer) {
|
|
|
42
57
|
};
|
|
43
58
|
}
|
|
44
59
|
|
|
60
|
+
// src/logger.ts
|
|
61
|
+
var Logger = class _Logger {
|
|
62
|
+
logs = [];
|
|
63
|
+
static LOG_PREFIX = "__THYME_LOG__";
|
|
64
|
+
/**
|
|
65
|
+
* Log an info message
|
|
66
|
+
*/
|
|
67
|
+
info(message) {
|
|
68
|
+
this.log("info", message);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Log a warning message
|
|
72
|
+
*/
|
|
73
|
+
warn(message) {
|
|
74
|
+
this.log("warn", message);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Log an error message
|
|
78
|
+
*/
|
|
79
|
+
error(message) {
|
|
80
|
+
this.log("error", message);
|
|
81
|
+
}
|
|
82
|
+
log(type, message) {
|
|
83
|
+
const entry = { type, message };
|
|
84
|
+
this.logs.push(entry);
|
|
85
|
+
console.log(`${_Logger.LOG_PREFIX}${JSON.stringify(entry)}`);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get all collected logs
|
|
89
|
+
*/
|
|
90
|
+
getLogs() {
|
|
91
|
+
return [...this.logs];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Clear all collected logs
|
|
95
|
+
*/
|
|
96
|
+
clear() {
|
|
97
|
+
this.logs = [];
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
function createLogger() {
|
|
101
|
+
return new Logger();
|
|
102
|
+
}
|
|
103
|
+
|
|
45
104
|
// src/schema.ts
|
|
46
105
|
import { getAddress, isAddress } from "viem";
|
|
47
106
|
import { z } from "zod";
|
|
@@ -70,7 +129,9 @@ function defineTask(definition) {
|
|
|
70
129
|
return definition;
|
|
71
130
|
}
|
|
72
131
|
export {
|
|
132
|
+
Logger,
|
|
73
133
|
compressTask,
|
|
134
|
+
createLogger,
|
|
74
135
|
decompressTask,
|
|
75
136
|
defineTask,
|
|
76
137
|
zodExtended as z
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/archive.ts","../src/schema.ts","../src/task.ts"],"sourcesContent":["import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\n\nexport interface CompressResult {\n\tzipBuffer: Uint8Array\n\tchecksum: string\n}\n\nexport interface DecompressResult {\n\tsource: string\n\tbundle: string\n}\n\n/**\n * Compress source and bundle into a ZIP archive\n * Uses fflate for fast, modern compression\n */\nexport function compressTask(source: string, bundle: string): CompressResult {\n\t// Create ZIP archive with both files\n\tconst files = {\n\t\t'source.ts': strToU8(source),\n\t\t'bundle.js': strToU8(bundle),\n\t}\n\n\tconst compressed = zipSync(files, {\n\t\tlevel: 6, // Balanced compression\n\t})\n\n\t// Calculate
|
|
1
|
+
{"version":3,"sources":["../src/archive.ts","../src/logger.ts","../src/schema.ts","../src/task.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\n\nexport interface CompressResult {\n\tzipBuffer: Uint8Array\n\tchecksum: string\n}\n\nexport interface DecompressResult {\n\tsource: string\n\tbundle: string\n}\n\n// Maximum sizes for ZIP bomb protection\nconst MAX_ZIP_SIZE = 10 * 1024 * 1024 // 10MB compressed\nconst MAX_DECOMPRESSED_SIZE = 50 * 1024 * 1024 // 50MB decompressed\n\n/**\n * Calculate SHA-256 checksum of data\n */\nfunction calculateSha256(data: Uint8Array): string {\n\treturn createHash('sha256').update(data).digest('hex')\n}\n\n/**\n * Compress source and bundle into a ZIP archive\n * Uses fflate for fast, modern compression\n * Uses SHA-256 for cryptographically secure checksum\n */\nexport function compressTask(source: string, bundle: string): CompressResult {\n\t// Create ZIP archive with both files\n\tconst files = {\n\t\t'source.ts': strToU8(source),\n\t\t'bundle.js': strToU8(bundle),\n\t}\n\n\tconst compressed = zipSync(files, {\n\t\tlevel: 6, // Balanced compression\n\t})\n\n\t// Calculate SHA-256 checksum\n\tconst checksum = calculateSha256(compressed)\n\n\treturn {\n\t\tzipBuffer: compressed,\n\t\tchecksum,\n\t}\n}\n\n/**\n * Decompress ZIP archive and extract source and bundle files\n * Uses fflate for fast decompression\n * Includes ZIP bomb protection\n */\nexport function decompressTask(\n\tzipBuffer: Uint8Array | ArrayBuffer,\n): DecompressResult {\n\t// Convert ArrayBuffer to Uint8Array if needed\n\tconst uint8Array =\n\t\tzipBuffer instanceof ArrayBuffer ? new Uint8Array(zipBuffer) : zipBuffer\n\n\t// ZIP bomb protection: check compressed size\n\tif (uint8Array.length > MAX_ZIP_SIZE) {\n\t\tthrow new Error(\n\t\t\t`ZIP file too large: ${uint8Array.length} bytes (max: ${MAX_ZIP_SIZE})`,\n\t\t)\n\t}\n\n\t// Decompress ZIP\n\tconst decompressed = unzipSync(uint8Array)\n\n\t// ZIP bomb protection: check total decompressed size\n\tlet totalDecompressedSize = 0\n\tfor (const key of Object.keys(decompressed)) {\n\t\tconst file = decompressed[key]\n\t\tif (file) {\n\t\t\ttotalDecompressedSize += file.length\n\t\t}\n\t}\n\n\tif (totalDecompressedSize > MAX_DECOMPRESSED_SIZE) {\n\t\tthrow new Error(\n\t\t\t`Decompressed content too large: ${totalDecompressedSize} bytes (max: ${MAX_DECOMPRESSED_SIZE})`,\n\t\t)\n\t}\n\n\t// Extract files\n\tconst sourceBytes = decompressed['source.ts']\n\tconst bundleBytes = decompressed['bundle.js']\n\n\tif (!sourceBytes) {\n\t\tthrow new Error('source.ts not found in ZIP archive')\n\t}\n\n\tif (!bundleBytes) {\n\t\tthrow new Error('bundle.js not found in ZIP archive')\n\t}\n\n\t// Convert bytes to strings\n\tconst source = strFromU8(sourceBytes)\n\tconst bundle = strFromU8(bundleBytes)\n\n\treturn {\n\t\tsource,\n\t\tbundle,\n\t}\n}\n","// Declare console for environments that don't have DOM types\ndeclare const console: {\n\tlog: (...args: unknown[]) => void\n}\n\n/**\n * Log entry with type and message\n */\nexport interface LogEntry {\n\ttype: 'info' | 'warn' | 'error'\n\tmessage: string\n}\n\n/**\n * Logger for Thyme tasks\n *\n * Use this logger to output messages that will be captured and displayed\n * in the Thyme dashboard. Regular console.log calls will not be captured.\n *\n * @example\n * ```typescript\n * export default defineTask({\n * schema: z.object({ ... }),\n * async run(ctx) {\n * ctx.logger.info('Starting task execution')\n * ctx.logger.warn('Low balance detected')\n * ctx.logger.error('Failed to fetch price')\n * return { canExec: false, message: 'Error occurred' }\n * }\n * })\n * ```\n */\nexport class Logger {\n\tprivate logs: LogEntry[] = []\n\tprivate static readonly LOG_PREFIX = '__THYME_LOG__'\n\n\t/**\n\t * Log an info message\n\t */\n\tinfo(message: string): void {\n\t\tthis.log('info', message)\n\t}\n\n\t/**\n\t * Log a warning message\n\t */\n\twarn(message: string): void {\n\t\tthis.log('warn', message)\n\t}\n\n\t/**\n\t * Log an error message\n\t */\n\terror(message: string): void {\n\t\tthis.log('error', message)\n\t}\n\n\tprivate log(type: LogEntry['type'], message: string): void {\n\t\tconst entry: LogEntry = { type, message }\n\t\tthis.logs.push(entry)\n\t\t// Output with special prefix so it can be captured by the runner\n\t\tconsole.log(`${Logger.LOG_PREFIX}${JSON.stringify(entry)}`)\n\t}\n\n\t/**\n\t * Get all collected logs\n\t */\n\tgetLogs(): LogEntry[] {\n\t\treturn [...this.logs]\n\t}\n\n\t/**\n\t * Clear all collected logs\n\t */\n\tclear(): void {\n\t\tthis.logs = []\n\t}\n}\n\n/**\n * Create a new logger instance\n */\nexport function createLogger(): Logger {\n\treturn new Logger()\n}\n","import { type Address, getAddress, isAddress } from 'viem'\nimport { z } from 'zod'\n\n/**\n * Extended Zod with Ethereum address validation\n */\nexport const zodExtended = {\n\t...z,\n\t/**\n\t * Validates an Ethereum address and returns viem's Address type\n\t * Accepts both checksummed and non-checksummed addresses\n\t *\n\t * @example\n\t * ```typescript\n\t * import { zodExtended as z } from '@thyme-sh/sdk'\n\t *\n\t * const schema = z.object({\n\t * targetAddress: z.address(),\n\t * })\n\t * ```\n\t */\n\taddress: () =>\n\t\tz\n\t\t\t.string()\n\t\t\t.refine((val): val is Address => isAddress(val), {\n\t\t\t\tmessage: 'Invalid Ethereum address',\n\t\t\t})\n\t\t\t.transform((val) => getAddress(val)),\n}\n\n/**\n * Type helper to infer the schema type\n */\nexport type InferSchema<T extends z.ZodType> = z.infer<T>\n","import type { z } from 'zod'\nimport type { TaskDefinition } from './types'\n\n/**\n * Define a Web3 automation task\n *\n * @example\n * ```typescript\n * import { defineTask, z } from '@thyme-sh/sdk'\n * import { encodeFunctionData } from 'viem'\n *\n * const abi = [\n * 'function transfer(address to, uint256 amount) returns (bool)',\n * ] as const\n *\n * export default defineTask({\n * schema: z.object({\n * targetAddress: z.address(),\n * }),\n * async run(ctx) {\n * return {\n * canExec: true,\n * calls: [{\n * to: ctx.args.targetAddress,\n * data: encodeFunctionData({\n * abi,\n * functionName: 'transfer',\n * args: [recipientAddress, 1000n],\n * }),\n * }]\n * }\n * }\n * })\n * ```\n */\nexport function defineTask<TSchema extends z.ZodType>(\n\tdefinition: TaskDefinition<TSchema>,\n): TaskDefinition<TSchema> {\n\treturn definition\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thyme-sh/sdk",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "SDK for authoring Web3 automation tasks",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"zod": "^3.24.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
+
"@types/node": "^22.10.2",
|
|
46
47
|
"tsup": "^8.3.5",
|
|
47
48
|
"typescript": "^5.7.2"
|
|
48
49
|
}
|