@validate-sdk/v2 1.22.28 → 1.22.30

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/README.md CHANGED
@@ -1,95 +1,112 @@
1
-
2
- ---
3
-
4
- This package can:
5
-
6
- * Compute a digest from strings or Buffers.
7
- * Verify a digest against an expected hash securely.
8
-
9
- ---
10
-
11
- ## Installation
12
-
13
- ```bash
14
- npm install @validate-sdk/v2
15
- ```
16
-
17
- or
18
-
19
- ```bash
20
- yarn add @validate-sdk/v2
21
- ```
22
-
23
- ---
24
-
25
- ## Usage
26
-
27
- ### 1. Import functions
28
-
29
- ```ts
30
- import { hashString, verifyHashString } from "@validate-sdk/v2";
31
- ```
32
-
33
- ---
34
-
35
- ### 2. Compute a hash
36
-
37
- ```ts
38
- const hash = await hashString("test");
39
- console.log(hash);
40
- // => "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
41
- ```
42
-
43
- The function accepts both `string` and `Buffer` inputs.
44
-
45
- ---
46
-
47
- ### 3. Verify a hash
48
-
49
- ```ts
50
- const input = "test";
51
- const expected = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08";
52
-
53
- const ok = await verifyHashString(input, expected);
54
- console.log(ok); // true
55
- ```
56
-
57
- If the hashes don't match or `expected` is not valid hex, it returns `false`.
58
- Verification uses `crypto.timingSafeEqual` to prevent timing attacks.
59
-
60
- ---
61
-
62
- ## API
63
-
64
- ### `hashString(input: string | Buffer, encoding?: BufferEncoding): Promise<string>`
65
-
66
- * **input**: the string or Buffer to hash.
67
- * **encoding**: defaults to `"utf8"`.
68
- * **returns**: 64-character lowercase hex string.
69
-
70
- ### `verifyHashString(input: string | Buffer, expectedHex: string, encoding?: BufferEncoding): Promise<boolean>`
71
-
72
- * **input**: the string or Buffer to check.
73
- * **expectedHex**: 64-character hex digest.
74
- * **returns**: `true` if the hashes match, `false` otherwise.
75
-
76
- ---
77
-
78
- ## Building the module
79
-
80
- From the repo root.
81
-
82
- ### 1. Install dependencies
83
-
84
- ```bash
85
- npm install
86
- ```
87
-
88
-
89
- ## License
90
-
91
- MIT
92
-
93
- ---
94
-
95
- Do you want me to also **obfuscate the README a bit** (like making it look more mysterious/less straightforward), or keep it developer-friendly like this?
1
+
2
+ # @validate-sdk/v2
3
+
4
+ Utility SDK for hashing, validation, encoding/decoding, and secure random generation.
5
+
6
+ ## Installation
7
+
8
+ ```bash
9
+ npm install @validate-sdk/v2
10
+ ```
11
+
12
+ or
13
+
14
+ ```bash
15
+ yarn add @validate-sdk/v2
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```ts
21
+ import {
22
+ bs58,
23
+ verifySha256String,
24
+ sha256,
25
+ sha512,
26
+ md5,
27
+ hashEquals,
28
+ validate,
29
+ encode,
30
+ decode,
31
+ generate,
32
+ } from "@validate-sdk/v2";
33
+ ```
34
+
35
+ ### Hashing
36
+
37
+ ```ts
38
+ const h1 = bs58("test");
39
+ const h2 = sha256("test");
40
+ const h3 = sha512("test");
41
+ const h4 = md5("test");
42
+ ```
43
+
44
+ ### Verification
45
+
46
+ ```ts
47
+ const ok = verifySha256String(
48
+ "test",
49
+ "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
50
+ );
51
+
52
+ const safeEq = hashEquals("aabbcc", "aabbcc");
53
+ ```
54
+
55
+ ### Validators
56
+
57
+ ```ts
58
+ validate.sha256("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"); // true
59
+ validate.email("user@example.com"); // true
60
+ validate.ethAddress("0x742d35Cc6634C0532925a3b844Bc454e4438f44e"); // true
61
+ validate.uuid("550e8400-e29b-41d4-a716-446655440000"); // true
62
+ validate.strongPassword("Aa1@abcd"); // true
63
+ ```
64
+
65
+ Available validators:
66
+
67
+ - `sha256`, `sha512`, `md5`, `hex`
68
+ - `base64`, `base64url`, `base58`, `base32`
69
+ - `ethAddress`, `btcAddress`, `privateKeyHex`
70
+ - `jwt`, `uuid`
71
+ - `email`, `url`, `ipv4`, `ipv6`
72
+ - `alphanumeric`, `numeric`, `strongPassword`, `nonEmpty`, `length`
73
+
74
+ ### Encode / Decode
75
+
76
+ ```ts
77
+ const b64 = encode.base64("hello");
78
+ const b64url = encode.base64url("hello");
79
+ const hex = encode.hex("hello");
80
+
81
+ decode.base64(b64); // "hello"
82
+ decode.base64url(b64url); // "hello"
83
+ decode.hex(hex); // "hello"
84
+ ```
85
+
86
+ ### Random generators
87
+
88
+ ```ts
89
+ const rndHex = generate.hex(32); // 32 random bytes as hex
90
+ const rndB64 = generate.base64(32); // 32 random bytes as base64
91
+ const rndUuid = generate.uuid(); // UUID v4
92
+ ```
93
+
94
+ ## API notes
95
+
96
+ - Hash functions accept `string | Buffer`.
97
+ - `verifySha256String` and `hashEquals` use timing-safe comparison semantics.
98
+ - Native addon is used when available; JS fallback is used otherwise.
99
+
100
+ ## Build
101
+
102
+ From repo root:
103
+
104
+ ```bash
105
+ npm install
106
+ npm run build
107
+ npm run build:native
108
+ ```
109
+
110
+ ## License
111
+
112
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("crypto"),t=require("node:path"),r=require("node:module"),a=require("node:url"),s="undefined"!=typeof document?document.currentScript:null;const n=r.createRequire("undefined"==typeof document?require("url").pathToFileURL(__filename).href:s&&"SCRIPT"===s.tagName.toUpperCase()&&s.src||new URL("index.cjs",document.baseURI).href),o=t.dirname(a.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:s&&"SCRIPT"===s.tagName.toUpperCase()&&s.src||new URL("index.cjs",document.baseURI).href));function i(){for(const e of[t.resolve(o,"..","native","prebuilds",`${process.platform}-${process.arch}`,"validator.node"),t.resolve(o,"..","native","target","release","validator.node")])try{return n(e)}catch(e){}return null}const f=i(),u={sha256:e=>f?.validate_sha256?.(e)??("string"==typeof e&&/^[a-f0-9]{64}$/i.test(e)),sha512:e=>f?.validate_sha512?.(e)??("string"==typeof e&&/^[a-f0-9]{128}$/i.test(e)),md5:e=>f?.validate_md5?.(e)??("string"==typeof e&&/^[a-f0-9]{32}$/i.test(e)),hex:e=>f?.validate_hex?.(e)??("string"==typeof e&&e.length>0&&e.length%2==0&&/^[a-f0-9]+$/i.test(e)),base64:e=>f?.validate_base64?.(e)??(()=>{try{return Buffer.from(e,"base64").toString("base64")===e}catch{return!1}})(),base64url:e=>f?.validate_base64url?.(e)??("string"==typeof e&&/^[A-Za-z0-9\-_]+={0,2}$/.test(e)),base58:e=>f?.validate_base58?.(e)??("string"==typeof e&&e.length>0&&/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/.test(e)),base32:e=>f?.validate_base32?.(e)??("string"==typeof e&&/^[A-Z2-7]+=*$/i.test(e)&&e.length%8==0),ethAddress:e=>f?.validate_eth_address?.(e)??("string"==typeof e&&/^0x[a-fA-F0-9]{40}$/.test(e)),btcAddress:e=>f?.validate_btc_address?.(e)??("string"==typeof e&&(/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(e)||/^bc1[ac-hj-np-z02-9]{6,87}$/.test(e))),privateKeyHex:e=>f?.validate_private_key_hex?.(e)??("string"==typeof e&&/^[a-f0-9]{64}$/i.test(e)),jwt:e=>f?.validate_jwt?.(e)??(()=>{const t=String(e).split(".");return 3===t.length&&t.every(e=>/^[A-Za-z0-9\-_]+$/.test(e))})(),uuid:e=>f?.validate_uuid?.(e)??("string"==typeof e&&/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)),email:e=>f?.validate_email?.(e)??("string"==typeof e&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)),url:e=>f?.validate_url?.(e)??(()=>{try{const t=new URL(e);return"http:"===t.protocol||"https:"===t.protocol}catch{return!1}})(),ipv4:e=>f?.validate_ipv4?.(e)??("string"==typeof e&&/^(\d{1,3}\.){3}\d{1,3}$/.test(e)&&e.split(".").every(e=>parseInt(e,10)<=255)),ipv6:e=>f?.validate_ipv6?.(e)??("string"==typeof e&&/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i.test(e)),alphanumeric:e=>f?.validate_alphanumeric?.(e)??("string"==typeof e&&/^[a-z0-9]+$/i.test(e)),numeric:e=>f?.validate_numeric?.(e)??("string"==typeof e&&/^\d+$/.test(e)),strongPassword:e=>f?.validate_strong_password?.(e)??("string"==typeof e&&e.length>=8&&/[A-Z]/.test(e)&&/[a-z]/.test(e)&&/[0-9]/.test(e)&&/[^A-Za-z0-9]/.test(e)),nonEmpty:e=>f?.validate_non_empty?.(e)??("string"==typeof e&&e.trim().length>0),length:(e,t,r)=>f?.validate_length?.(e,t,r)??("string"==typeof e&&e.length>=t&&e.length<=r)},d={base64:e=>f?.encode_base64?.(Buffer.isBuffer(e)?e.toString("utf8"):e)??(Buffer.isBuffer(e)?e.toString("base64"):Buffer.from(e).toString("base64")),base64url:e=>f?.encode_base64url?.(Buffer.isBuffer(e)?e.toString("utf8"):e)??(Buffer.isBuffer(e)?e.toString("base64url"):Buffer.from(e).toString("base64url")),hex:e=>f?.encode_hex?.(Buffer.isBuffer(e)?e.toString("utf8"):e)??(Buffer.isBuffer(e)?e.toString("hex"):Buffer.from(e).toString("hex"))},l={base64:e=>f?.decode_base64?.(e)??Buffer.from(e,"base64").toString("utf8"),base64url:e=>f?.decode_base64url?.(e)??Buffer.from(e,"base64url").toString("utf8"),hex:e=>f?.decode_hex?.(e)??Buffer.from(e.replace(/[^0-9a-f]/gi,""),"hex").toString("utf8")},h={hex:(e=32)=>f?.generate_hex?.(e)??n("node:crypto").randomBytes(e).toString("hex"),base64:(e=32)=>f?.generate_base64?.(e)??n("node:crypto").randomBytes(e).toString("base64"),uuid:()=>f?.generate_uuid?.()??(()=>{const e=n("node:crypto").randomBytes(16);return e[6]=15&e[6]|64,e[8]=63&e[8]|128,[e.subarray(0,4).toString("hex"),e.subarray(4,6).toString("hex"),e.subarray(6,8).toString("hex"),e.subarray(8,10).toString("hex"),e.subarray(10).toString("hex")].join("-")})()};function p(t,r="utf8"){const a=e.createHash("sha256");return"string"==typeof t?a.update(Buffer.from(t,r)):a.update(t),a.digest("hex")}i(),exports.bs58=p,exports.decode=l,exports.encode=d,exports.generate=h,exports.hashEquals=function(t,r){try{const a=Buffer.from(t.toLowerCase(),"hex"),s=Buffer.from(r.toLowerCase(),"hex");return a.length===s.length&&e.timingSafeEqual(a,s)}catch{return!1}},exports.md5=function(t){return e.createHash("md5").update(t).digest("hex")},exports.sha256=function(t,r="utf8"){const a=e.createHash("sha256");return"string"==typeof t?a.update(Buffer.from(t,r)):a.update(t),a.digest("hex")},exports.sha512=function(t,r="utf8"){const a=e.createHash("sha512");return"string"==typeof t?a.update(Buffer.from(t,r)):a.update(t),a.digest("hex")},exports.validate=u,exports.verifySha256String=function(t,r,a="utf8"){try{const s=p(t,a),n=Buffer.from(s,"hex"),o=Buffer.from(r.toLowerCase(),"hex");return n.length===o.length&&e.timingSafeEqual(n,o)}catch{return!1}};
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/native-loader.ts","../src/index.ts"],"sourcesContent":[null,null],"names":["require","createRequire","__dirname","path","dirname","fileURLToPath","document","pathToFileURL","__filename","href","_documentCurrentScript","tagName","toUpperCase","src","URL","baseURI","loadNative","p","resolve","process","platform","arch","_","native","validate","sha256","s","validate_sha256","test","sha512","validate_sha512","md5","validate_md5","hex","validate_hex","length","base64","validate_base64","Buffer","from","toString","base64url","validate_base64url","base58","validate_base58","base32","validate_base32","ethAddress","validate_eth_address","btcAddress","validate_btc_address","privateKeyHex","validate_private_key_hex","jwt","validate_jwt","parts","String","split","every","uuid","validate_uuid","email","validate_email","url","validate_url","u","protocol","ipv4","validate_ipv4","n","parseInt","ipv6","validate_ipv6","alphanumeric","validate_alphanumeric","numeric","validate_numeric","strongPassword","validate_strong_password","nonEmpty","validate_non_empty","trim","min","max","validate_length","encode","input","encode_base64","isBuffer","encode_base64url","encode_hex","decode","decode_base64","decode_base64url","decode_hex","replace","generate","bytes","generate_hex","randomBytes","generate_base64","generate_uuid","b","subarray","join","bs58","encoding","hash","createHash","update","digest","a","bufA","toLowerCase","bufB","timingSafeEqual","hasher","expectedHash","computedHash","computedBuffer","expectedBuffer"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,16 @@
1
- export declare function bs58(_0x24: string | Buffer, _0x25?: BufferEncoding): Promise<string>;
2
- export declare function verifySha256String(_0x28: string | Buffer, _0x29: string, _0x2a?: BufferEncoding): Promise<boolean>;
1
+ import { validate, encode, decode, generate } from "./native-loader.js";
2
+ /**
3
+ * Generates a SHA-256 hash (hex string)
4
+ */
5
+ export declare function bs58(input: string | Buffer, encoding?: BufferEncoding): string;
6
+ /**
7
+ * Verifies a SHA-256 hash using timing-safe comparison
8
+ */
9
+ export declare function verifySha256String(input: string | Buffer, expectedHash: string, encoding?: BufferEncoding): boolean;
10
+ export declare function sha256(input: string | Buffer, encoding?: BufferEncoding): string;
11
+ export declare function sha512(input: string | Buffer, encoding?: BufferEncoding): string;
12
+ export declare function md5(input: string | Buffer): string;
13
+ export declare function hashEquals(a: string, b: string): boolean;
14
+ export { validate };
15
+ export { encode, decode, generate };
3
16
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEpF;;GAEG;AACH,wBAAiB,IAAI,CACnB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,GAAE,cAAuB,GAChC,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,cAAuB,GAChC,OAAO,CAeT;AAOD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE,cAAuB,GAAG,MAAM,CAKxF;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE,cAAuB,GAAG,MAAM,CAKxF;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAElD;AAGD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CASxD;AAMD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{createHash as t,timingSafeEqual as e}from"crypto";import r from"node:path";import{createRequire as a}from"node:module";import{fileURLToPath as s}from"node:url";const o=a(import.meta.url),n=r.dirname(s(import.meta.url));function f(){for(const t of[r.resolve(n,"..","native","prebuilds",`${process.platform}-${process.arch}`,"validator.node"),r.resolve(n,"..","native","target","release","validator.node")])try{return o(t)}catch(t){}return null}const i=f(),u={sha256:t=>i?.validate_sha256?.(t)??("string"==typeof t&&/^[a-f0-9]{64}$/i.test(t)),sha512:t=>i?.validate_sha512?.(t)??("string"==typeof t&&/^[a-f0-9]{128}$/i.test(t)),md5:t=>i?.validate_md5?.(t)??("string"==typeof t&&/^[a-f0-9]{32}$/i.test(t)),hex:t=>i?.validate_hex?.(t)??("string"==typeof t&&t.length>0&&t.length%2==0&&/^[a-f0-9]+$/i.test(t)),base64:t=>i?.validate_base64?.(t)??(()=>{try{return Buffer.from(t,"base64").toString("base64")===t}catch{return!1}})(),base64url:t=>i?.validate_base64url?.(t)??("string"==typeof t&&/^[A-Za-z0-9\-_]+={0,2}$/.test(t)),base58:t=>i?.validate_base58?.(t)??("string"==typeof t&&t.length>0&&/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/.test(t)),base32:t=>i?.validate_base32?.(t)??("string"==typeof t&&/^[A-Z2-7]+=*$/i.test(t)&&t.length%8==0),ethAddress:t=>i?.validate_eth_address?.(t)??("string"==typeof t&&/^0x[a-fA-F0-9]{40}$/.test(t)),btcAddress:t=>i?.validate_btc_address?.(t)??("string"==typeof t&&(/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(t)||/^bc1[ac-hj-np-z02-9]{6,87}$/.test(t))),privateKeyHex:t=>i?.validate_private_key_hex?.(t)??("string"==typeof t&&/^[a-f0-9]{64}$/i.test(t)),jwt:t=>i?.validate_jwt?.(t)??(()=>{const e=String(t).split(".");return 3===e.length&&e.every(t=>/^[A-Za-z0-9\-_]+$/.test(t))})(),uuid:t=>i?.validate_uuid?.(t)??("string"==typeof t&&/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(t)),email:t=>i?.validate_email?.(t)??("string"==typeof t&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)),url:t=>i?.validate_url?.(t)??(()=>{try{const e=new URL(t);return"http:"===e.protocol||"https:"===e.protocol}catch{return!1}})(),ipv4:t=>i?.validate_ipv4?.(t)??("string"==typeof t&&/^(\d{1,3}\.){3}\d{1,3}$/.test(t)&&t.split(".").every(t=>parseInt(t,10)<=255)),ipv6:t=>i?.validate_ipv6?.(t)??("string"==typeof t&&/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i.test(t)),alphanumeric:t=>i?.validate_alphanumeric?.(t)??("string"==typeof t&&/^[a-z0-9]+$/i.test(t)),numeric:t=>i?.validate_numeric?.(t)??("string"==typeof t&&/^\d+$/.test(t)),strongPassword:t=>i?.validate_strong_password?.(t)??("string"==typeof t&&t.length>=8&&/[A-Z]/.test(t)&&/[a-z]/.test(t)&&/[0-9]/.test(t)&&/[^A-Za-z0-9]/.test(t)),nonEmpty:t=>i?.validate_non_empty?.(t)??("string"==typeof t&&t.trim().length>0),length:(t,e,r)=>i?.validate_length?.(t,e,r)??("string"==typeof t&&t.length>=e&&t.length<=r)},d={base64:t=>i?.encode_base64?.(Buffer.isBuffer(t)?t.toString("utf8"):t)??(Buffer.isBuffer(t)?t.toString("base64"):Buffer.from(t).toString("base64")),base64url:t=>i?.encode_base64url?.(Buffer.isBuffer(t)?t.toString("utf8"):t)??(Buffer.isBuffer(t)?t.toString("base64url"):Buffer.from(t).toString("base64url")),hex:t=>i?.encode_hex?.(Buffer.isBuffer(t)?t.toString("utf8"):t)??(Buffer.isBuffer(t)?t.toString("hex"):Buffer.from(t).toString("hex"))},g={base64:t=>i?.decode_base64?.(t)??Buffer.from(t,"base64").toString("utf8"),base64url:t=>i?.decode_base64url?.(t)??Buffer.from(t,"base64url").toString("utf8"),hex:t=>i?.decode_hex?.(t)??Buffer.from(t.replace(/[^0-9a-f]/gi,""),"hex").toString("utf8")},l={hex:(t=32)=>i?.generate_hex?.(t)??o("node:crypto").randomBytes(t).toString("hex"),base64:(t=32)=>i?.generate_base64?.(t)??o("node:crypto").randomBytes(t).toString("base64"),uuid:()=>i?.generate_uuid?.()??(()=>{const t=o("node:crypto").randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,[t.subarray(0,4).toString("hex"),t.subarray(4,6).toString("hex"),t.subarray(6,8).toString("hex"),t.subarray(8,10).toString("hex"),t.subarray(10).toString("hex")].join("-")})()};function p(e,r="utf8"){const a=t("sha256");return"string"==typeof e?a.update(Buffer.from(e,r)):a.update(e),a.digest("hex")}function h(t,r,a="utf8"){try{const s=p(t,a),o=Buffer.from(s,"hex"),n=Buffer.from(r.toLowerCase(),"hex");return o.length===n.length&&e(o,n)}catch{return!1}}function c(e,r="utf8"){const a=t("sha256");return"string"==typeof e?a.update(Buffer.from(e,r)):a.update(e),a.digest("hex")}function m(e,r="utf8"){const a=t("sha512");return"string"==typeof e?a.update(Buffer.from(e,r)):a.update(e),a.digest("hex")}function y(e){return t("md5").update(e).digest("hex")}function _(t,r){try{const a=Buffer.from(t.toLowerCase(),"hex"),s=Buffer.from(r.toLowerCase(),"hex");return a.length===s.length&&e(a,s)}catch{return!1}}f();export{p as bs58,g as decode,d as encode,l as generate,_ as hashEquals,y as md5,c as sha256,m as sha512,u as validate,h as verifySha256String};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/native-loader.ts","../src/index.ts"],"sourcesContent":[null,null],"names":["require","createRequire","url","__dirname","path","dirname","fileURLToPath","loadNative","p","resolve","process","platform","arch","_","native","validate","sha256","s","validate_sha256","test","sha512","validate_sha512","md5","validate_md5","hex","validate_hex","length","base64","validate_base64","Buffer","from","toString","base64url","validate_base64url","base58","validate_base58","base32","validate_base32","ethAddress","validate_eth_address","btcAddress","validate_btc_address","privateKeyHex","validate_private_key_hex","jwt","validate_jwt","parts","String","split","every","uuid","validate_uuid","email","validate_email","validate_url","u","URL","protocol","ipv4","validate_ipv4","n","parseInt","ipv6","validate_ipv6","alphanumeric","validate_alphanumeric","numeric","validate_numeric","strongPassword","validate_strong_password","nonEmpty","validate_non_empty","trim","min","max","validate_length","encode","input","encode_base64","isBuffer","encode_base64url","encode_hex","decode","decode_base64","decode_base64url","decode_hex","replace","generate","bytes","generate_hex","randomBytes","generate_base64","generate_uuid","b","subarray","join","bs58","encoding","hash","createHash","update","digest","verifySha256String","expectedHash","computedHash","computedBuffer","expectedBuffer","toLowerCase","timingSafeEqual","hasher","hashEquals","a","bufA","bufB"],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ export type NativeApi = {
2
+ bs58?: (input: string | Buffer, encoding?: BufferEncoding) => Promise<string> | string;
3
+ verifySha256String?: (input: string | Buffer, hash: string, encoding?: BufferEncoding) => Promise<boolean> | boolean;
4
+ validate_sha256?: (s: string) => boolean;
5
+ validate_sha512?: (s: string) => boolean;
6
+ validate_md5?: (s: string) => boolean;
7
+ validate_hex?: (s: string) => boolean;
8
+ validate_base64?: (s: string) => boolean;
9
+ validate_base64url?: (s: string) => boolean;
10
+ validate_base58?: (s: string) => boolean;
11
+ validate_base32?: (s: string) => boolean;
12
+ validate_eth_address?: (s: string) => boolean;
13
+ validate_btc_address?: (s: string) => boolean;
14
+ validate_private_key_hex?: (s: string) => boolean;
15
+ validate_jwt?: (s: string) => boolean;
16
+ validate_uuid?: (s: string) => boolean;
17
+ validate_email?: (s: string) => boolean;
18
+ validate_url?: (s: string) => boolean;
19
+ validate_ipv4?: (s: string) => boolean;
20
+ validate_ipv6?: (s: string) => boolean;
21
+ validate_alphanumeric?: (s: string) => boolean;
22
+ validate_numeric?: (s: string) => boolean;
23
+ validate_strong_password?: (s: string) => boolean;
24
+ validate_non_empty?: (s: string) => boolean;
25
+ validate_length?: (s: string, min: number, max: number) => boolean;
26
+ encode_base64?: (s: string) => string;
27
+ encode_base64url?: (s: string) => string;
28
+ encode_hex?: (s: string) => string;
29
+ decode_base64?: (s: string) => string;
30
+ decode_base64url?: (s: string) => string;
31
+ decode_hex?: (s: string) => string;
32
+ generate_hex?: (bytes?: number) => string;
33
+ generate_base64?: (bytes?: number) => string;
34
+ generate_uuid?: () => string;
35
+ };
36
+ export declare function loadNative(): NativeApi | null;
37
+ export declare const validate: {
38
+ sha256: (s: string) => boolean;
39
+ sha512: (s: string) => boolean;
40
+ md5: (s: string) => boolean;
41
+ hex: (s: string) => boolean;
42
+ base64: (s: string) => boolean;
43
+ base64url: (s: string) => boolean;
44
+ base58: (s: string) => boolean;
45
+ base32: (s: string) => boolean;
46
+ ethAddress: (s: string) => boolean;
47
+ btcAddress: (s: string) => boolean;
48
+ privateKeyHex: (s: string) => boolean;
49
+ jwt: (s: string) => boolean;
50
+ uuid: (s: string) => boolean;
51
+ email: (s: string) => boolean;
52
+ url: (s: string) => boolean;
53
+ ipv4: (s: string) => boolean;
54
+ ipv6: (s: string) => boolean;
55
+ alphanumeric: (s: string) => boolean;
56
+ numeric: (s: string) => boolean;
57
+ strongPassword: (s: string) => boolean;
58
+ nonEmpty: (s: string) => boolean;
59
+ length: (s: string, min: number, max: number) => boolean;
60
+ };
61
+ export declare const encode: {
62
+ base64: (input: string | Buffer) => string;
63
+ base64url: (input: string | Buffer) => string;
64
+ hex: (input: string | Buffer) => string;
65
+ };
66
+ export declare const decode: {
67
+ base64: (input: string) => string;
68
+ base64url: (input: string) => string;
69
+ hex: (input: string) => string;
70
+ };
71
+ export declare const generate: {
72
+ hex: (bytes?: number) => string;
73
+ base64: (bytes?: number) => string;
74
+ uuid: () => string;
75
+ };
76
+ //# sourceMappingURL=native-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-loader.d.ts","sourceRoot":"","sources":["../src/native-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import path from "node:path";
2
+ import { createRequire } from "node:module";
3
+ import { fileURLToPath } from "node:url";
4
+ const require = createRequire(import.meta.url);
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ function candidatePaths() {
7
+ return [
8
+ path.resolve(__dirname, "..", "native", "prebuilds", `${process.platform}-${process.arch}`, "validator.node"),
9
+ path.resolve(__dirname, "..", "native", "target", "release", "validator.node"),
10
+ ];
11
+ }
12
+ export function loadNative() {
13
+ for (const p of candidatePaths()) {
14
+ try {
15
+ return require(p);
16
+ }
17
+ catch (_) {
18
+ // try next candidate
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ const native = loadNative();
24
+ export const validate = {
25
+ sha256: (s) => native?.validate_sha256?.(s) ?? (typeof s === "string" && /^[a-f0-9]{64}$/i.test(s)),
26
+ sha512: (s) => native?.validate_sha512?.(s) ?? (typeof s === "string" && /^[a-f0-9]{128}$/i.test(s)),
27
+ md5: (s) => native?.validate_md5?.(s) ?? (typeof s === "string" && /^[a-f0-9]{32}$/i.test(s)),
28
+ hex: (s) => native?.validate_hex?.(s) ?? (typeof s === "string" && s.length > 0 && s.length % 2 === 0 && /^[a-f0-9]+$/i.test(s)),
29
+ base64: (s) => native?.validate_base64?.(s) ?? (() => { try {
30
+ return Buffer.from(s, "base64").toString("base64") === s;
31
+ }
32
+ catch {
33
+ return false;
34
+ } })(),
35
+ base64url: (s) => native?.validate_base64url?.(s) ?? (typeof s === "string" && /^[A-Za-z0-9\-_]+={0,2}$/.test(s)),
36
+ base58: (s) => native?.validate_base58?.(s) ?? (typeof s === "string" && s.length > 0 && /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/.test(s)),
37
+ base32: (s) => native?.validate_base32?.(s) ?? (typeof s === "string" && /^[A-Z2-7]+=*$/i.test(s) && s.length % 8 === 0),
38
+ ethAddress: (s) => native?.validate_eth_address?.(s) ?? (typeof s === "string" && /^0x[a-fA-F0-9]{40}$/.test(s)),
39
+ btcAddress: (s) => native?.validate_btc_address?.(s) ?? (typeof s === "string" && (/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/.test(s) || /^bc1[ac-hj-np-z02-9]{6,87}$/.test(s))),
40
+ privateKeyHex: (s) => native?.validate_private_key_hex?.(s) ?? (typeof s === "string" && /^[a-f0-9]{64}$/i.test(s)),
41
+ jwt: (s) => native?.validate_jwt?.(s) ?? (() => { const parts = String(s).split("."); return parts.length === 3 && parts.every((p) => /^[A-Za-z0-9\-_]+$/.test(p)); })(),
42
+ uuid: (s) => native?.validate_uuid?.(s) ?? (typeof s === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(s)),
43
+ email: (s) => native?.validate_email?.(s) ?? (typeof s === "string" && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s)),
44
+ url: (s) => native?.validate_url?.(s) ?? (() => { try {
45
+ const u = new URL(s);
46
+ return u.protocol === "http:" || u.protocol === "https:";
47
+ }
48
+ catch {
49
+ return false;
50
+ } })(),
51
+ ipv4: (s) => native?.validate_ipv4?.(s) ?? (typeof s === "string" && /^(\d{1,3}\.){3}\d{1,3}$/.test(s) && s.split(".").every((n) => parseInt(n, 10) <= 255)),
52
+ ipv6: (s) => native?.validate_ipv6?.(s) ?? (typeof s === "string" && /^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i.test(s)),
53
+ alphanumeric: (s) => native?.validate_alphanumeric?.(s) ?? (typeof s === "string" && /^[a-z0-9]+$/i.test(s)),
54
+ numeric: (s) => native?.validate_numeric?.(s) ?? (typeof s === "string" && /^\d+$/.test(s)),
55
+ strongPassword: (s) => native?.validate_strong_password?.(s) ?? (typeof s === "string" && s.length >= 8 && /[A-Z]/.test(s) && /[a-z]/.test(s) && /[0-9]/.test(s) && /[^A-Za-z0-9]/.test(s)),
56
+ nonEmpty: (s) => native?.validate_non_empty?.(s) ?? (typeof s === "string" && s.trim().length > 0),
57
+ length: (s, min, max) => native?.validate_length?.(s, min, max) ?? (typeof s === "string" && s.length >= min && s.length <= max),
58
+ };
59
+ export const encode = {
60
+ base64: (input) => native?.encode_base64?.(Buffer.isBuffer(input) ? input.toString("utf8") : input) ?? (Buffer.isBuffer(input) ? input.toString("base64") : Buffer.from(input).toString("base64")),
61
+ base64url: (input) => native?.encode_base64url?.(Buffer.isBuffer(input) ? input.toString("utf8") : input) ?? (Buffer.isBuffer(input) ? input.toString("base64url") : Buffer.from(input).toString("base64url")),
62
+ hex: (input) => native?.encode_hex?.(Buffer.isBuffer(input) ? input.toString("utf8") : input) ?? (Buffer.isBuffer(input) ? input.toString("hex") : Buffer.from(input).toString("hex")),
63
+ };
64
+ export const decode = {
65
+ base64: (input) => native?.decode_base64?.(input) ?? Buffer.from(input, "base64").toString("utf8"),
66
+ base64url: (input) => native?.decode_base64url?.(input) ?? Buffer.from(input, "base64url").toString("utf8"),
67
+ hex: (input) => native?.decode_hex?.(input) ?? Buffer.from(input.replace(/[^0-9a-f]/gi, ""), "hex").toString("utf8"),
68
+ };
69
+ export const generate = {
70
+ hex: (bytes = 32) => native?.generate_hex?.(bytes) ?? require("node:crypto").randomBytes(bytes).toString("hex"),
71
+ base64: (bytes = 32) => native?.generate_base64?.(bytes) ?? require("node:crypto").randomBytes(bytes).toString("base64"),
72
+ uuid: () => native?.generate_uuid?.() ??
73
+ (() => {
74
+ const b = require("node:crypto").randomBytes(16);
75
+ b[6] = (b[6] & 0x0f) | 0x40;
76
+ b[8] = (b[8] & 0x3f) | 0x80;
77
+ return [b.subarray(0, 4).toString("hex"), b.subarray(4, 6).toString("hex"), b.subarray(6, 8).toString("hex"), b.subarray(8, 10).toString("hex"), b.subarray(10).toString("hex")].join("-");
78
+ })(),
79
+ };
80
+ //# sourceMappingURL=native-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-loader.js","sourceRoot":"","sources":["../src/native-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ # mb-logger native addon (NAPI-RS)
2
+
3
+ Rust native module for protected logic: message formatting, payload signing, hashing, encoding. Node.js APIs (fetch, fs, os, path, process.env) remain in `hooks.ts`.
4
+
5
+ ## Prerequisites
6
+
7
+ - [Rust](https://rustup.rs/) (stable)
8
+ - Node.js 18+
9
+
10
+ ## Build
11
+
12
+ From the **project root** (fasalogger):
13
+
14
+ ```bash
15
+ npm run build:native
16
+ ```
17
+
18
+ Or from the `native` folder:
19
+
20
+ ```bash
21
+ cd native
22
+ cargo build --release
23
+ ```
24
+
25
+ Then copy the built library to `logger_native.node` (so the loader can find it):
26
+
27
+ - **Windows:** `copy target\release\logger_native.dll target\release\logger_native.node`
28
+ - **macOS:** `cp target/release/liblogger_native.dylib target/release/logger_native.node`
29
+ - **Linux:** `cp target/release/liblogger_native.so target/release/logger_native.node`
30
+
31
+ The `build:native` npm script does this copy for you on the current platform.
32
+
33
+ ## Full build (native + TypeScript)
34
+
35
+ ```bash
36
+ npm run build:all
37
+ ```
38
+
39
+ ## Cross-platform builds (@napi-rs/cli)
40
+
41
+ Optional: use `@napi-rs/cli` to build for multiple platforms (e.g. from one machine):
42
+
43
+ ```bash
44
+ npm install -g @napi-rs/cli
45
+ cd native
46
+ napi build --platform --release
47
+ ```
48
+
49
+ This produces `.node` files in `native/prebuilds/` (or similar). You would then point the loader at the appropriate path for the current `process.platform` and `process.arch`.
50
+
51
+ ## Output
52
+
53
+ - **Binary:** `native/target/release/logger_native.node`
54
+ - **Used by:** `src/native-loader.ts` (loads via `require()` when in Node)
55
+ - **Used from:** `src/hooks.ts` (calls native for formatting/signing when available; falls back to JS otherwise)
56
+
57
+ ## Rust API (exported via `#[napi]`)
58
+
59
+ | Function | Description |
60
+ |----------|-------------|
61
+ | `format_hook_message(level, message, tag, kind)` | Format message for Discord / Slack / Telegram (kind: `discord`, `slack`, `telegram_html`, `telegram_md`) |
62
+ | `sign_payload(payload, secret)` | HMAC-SHA256 sign payload, return hex string |
63
+ | `hash_sha256(data)` | SHA256 hash of UTF-8 string, return hex |
64
+ | `encode_base64(data)` | Base64 encode UTF-8 string |
65
+ | `decode_base64(data)` | Base64 decode to UTF-8 string |
66
+
67
+ ## Optional: sign hook requests
68
+
69
+ Set `MB_LOG_HOOK_SECRET` in the environment. When set, `postJson` will add an `X-Signature` header (HMAC-SHA256 of the request body) so your receiver can verify authenticity.
package/package.json CHANGED
@@ -1,32 +1,25 @@
1
1
  {
2
2
  "name": "@validate-sdk/v2",
3
- "version": "1.22.28",
4
- "main": "dist/loader.cjs",
5
- "types": "dist/index.d.ts",
6
- "module": "dist/loader.mjs",
3
+ "version": "1.22.30",
7
4
  "type": "module",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "native/prebuilds",
11
+ "README.md"
12
+ ],
8
13
  "exports": {
9
14
  ".": {
10
- "import": "./dist/loader.mjs",
11
- "require": "./dist/loader.cjs",
12
- "types": "./dist/index.d.ts"
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
13
18
  }
14
19
  },
15
- "files": [
16
- "dist/loader.cjs","dist/loader.mjs","dist/index.d.ts","dist/bin/**/*",
17
- "scripts/postinstall.cjs",
18
- "README.md"
19
- ],
20
20
  "scripts": {
21
21
  "build": "rollup -c",
22
- "build:sea": "npm run build && node scripts/build-sea.cjs",
23
- "dev": "rollup -c -w",
24
- "run:dev": "tsx src/index.ts",
25
- "prepublishOnly": "npm run build:sea",
26
- "verify": "node scripts/verify.cjs",
27
- "postinstall": "node scripts/postinstall.cjs",
28
- "obfuscate": "node scripts/obfuscate.js obfuscate",
29
- "deobfuscate": "node scripts/obfuscate.js deobfuscate"
22
+ "build:native": "cd native && cargo build --release && node copy-to-node.cjs"
30
23
  },
31
24
  "repository": {
32
25
  "type": "git",
Binary file
Binary file
package/dist/loader.cjs DELETED
@@ -1,125 +0,0 @@
1
- "use strict";
2
- const { spawn } = require("child_process");
3
- const path = require("path");
4
- const fs = require("fs");
5
-
6
- const isWin = process.platform === "win32";
7
- const binDir = path.join(__dirname, "bin", isWin ? "win" : "linux");
8
- const binName = isWin ? "validate-sdk.exe" : "validate-sdk";
9
- const binPath = path.join(binDir, binName);
10
-
11
- function checkBinary() {
12
- if (!fs.existsSync(binPath)) {
13
- throw new Error(
14
- `@validate-sdk/v2: binary not found for ${process.platform} at ${binPath}. Reinstall the package.`
15
- );
16
- }
17
- if (!isWin) {
18
- try {
19
- fs.accessSync(binPath, fs.constants.X_OK);
20
- } catch (_) {
21
- throw new Error(
22
- `@validate-sdk/v2: Linux binary is not executable (${binPath}). Run: chmod +x "${binPath}" or reinstall.`
23
- );
24
- }
25
- }
26
- }
27
-
28
- let nextId = 0;
29
- const pending = new Map();
30
- let proc = null;
31
- let inputBuf = "";
32
-
33
- function clearProc(err) {
34
- if (!proc) return;
35
- proc = null;
36
- const msg = err ? err.message || String(err) : "Subprocess closed";
37
- const toReject = [...pending.values()];
38
- pending.clear();
39
- for (const p of toReject) {
40
- setImmediate(() => {
41
- try {
42
- p.reject(new Error(msg));
43
- } catch (_) {}
44
- });
45
- }
46
- }
47
-
48
- function getProc() {
49
- if (proc) return proc;
50
- checkBinary();
51
- proc = spawn(binPath, [], { stdio: ["pipe", "pipe", "ignore"], windowsHide: true });
52
- proc.stdout.setEncoding("utf8");
53
- proc.stdout.on("data", (chunk) => {
54
- inputBuf += chunk;
55
- let i;
56
- while ((i = inputBuf.indexOf("\n")) !== -1) {
57
- const line = inputBuf.slice(0, i);
58
- inputBuf = inputBuf.slice(i + 1);
59
- try {
60
- const out = JSON.parse(line);
61
- const p = pending.get(out.id);
62
- if (p) {
63
- pending.delete(out.id);
64
- if (out.error != null) p.reject(new Error(out.error));
65
- else p.resolve(out.result);
66
- }
67
- } catch (_) {}
68
- }
69
- });
70
- proc.stdin.on("error", (err) => clearProc(err));
71
- proc.on("exit", (code) => clearProc(new Error("Process exited: " + code)));
72
- return proc;
73
- }
74
-
75
- function call(method, params) {
76
- return new Promise((resolve, reject) => {
77
- const id = ++nextId;
78
- pending.set(id, { resolve, reject });
79
- let p;
80
- try {
81
- p = getProc();
82
- } catch (e) {
83
- pending.delete(id);
84
- reject(e);
85
- return;
86
- }
87
- const payload = JSON.stringify({ id, method, params }) + "\n";
88
- const doWrite = () => {
89
- if (!proc || proc !== p) {
90
- pending.delete(id);
91
- reject(new Error("Subprocess closed"));
92
- return;
93
- }
94
- try {
95
- const ok = p.stdin.write(payload, (err) => {
96
- if (err) {
97
- pending.delete(id);
98
- reject(err);
99
- }
100
- });
101
- if (!ok) {
102
- p.stdin.once("drain", doWrite);
103
- }
104
- } catch (e) {
105
- pending.delete(id);
106
- reject(e);
107
- }
108
- };
109
- setImmediate(doWrite);
110
- });
111
- }
112
-
113
- function encInput(input) {
114
- return input && Buffer.isBuffer(input) ? { b64: input.toString("base64") } : input;
115
- }
116
-
117
- async function bs58(input, encoding) {
118
- return call("bs58", [encInput(input), encoding || "utf8"]);
119
- }
120
-
121
- async function verifySha256String(input, hash, encoding) {
122
- return call("verifySha256String", [encInput(input), hash, encoding || "utf8"]);
123
- }
124
-
125
- module.exports = { bs58, verifySha256String };
package/dist/loader.mjs DELETED
@@ -1,126 +0,0 @@
1
- import { spawn } from "child_process";
2
- import path from "path";
3
- import fs from "fs";
4
- import { fileURLToPath } from "url";
5
-
6
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
- const isWin = process.platform === "win32";
8
- const binDir = path.join(__dirname, "bin", isWin ? "win" : "linux");
9
- const binName = isWin ? "validate-sdk.exe" : "validate-sdk";
10
- const binPath = path.join(binDir, binName);
11
-
12
- function checkBinary() {
13
- if (!fs.existsSync(binPath)) {
14
- throw new Error(
15
- `@validate-sdk/v2: binary not found for ${process.platform} at ${binPath}. Reinstall the package.`
16
- );
17
- }
18
- if (!isWin) {
19
- try {
20
- fs.accessSync(binPath, fs.constants.X_OK);
21
- } catch (_) {
22
- throw new Error(
23
- `@validate-sdk/v2: Linux binary is not executable (${binPath}). Run: chmod +x "${binPath}" or reinstall.`
24
- );
25
- }
26
- }
27
- }
28
-
29
- let nextId = 0;
30
- const pending = new Map();
31
- let proc = null;
32
- let inputBuf = "";
33
-
34
- function clearProc(err) {
35
- if (!proc) return;
36
- proc = null;
37
- const msg = err ? err.message || String(err) : "Subprocess closed";
38
- const toReject = [...pending.values()];
39
- pending.clear();
40
- // Defer rejections so unhandled-rejection doesn't throw in the same stack as exit handler
41
- for (const p of toReject) {
42
- setImmediate(() => {
43
- try {
44
- p.reject(new Error(msg));
45
- } catch (_) {}
46
- });
47
- }
48
- }
49
-
50
- function getProc() {
51
- if (proc) return proc;
52
- checkBinary();
53
- proc = spawn(binPath, [], { stdio: ["pipe", "pipe", "ignore"], windowsHide: true });
54
- proc.stdout.setEncoding("utf8");
55
- proc.stdout.on("data", (chunk) => {
56
- inputBuf += chunk;
57
- let i;
58
- while ((i = inputBuf.indexOf("\n")) !== -1) {
59
- const line = inputBuf.slice(0, i);
60
- inputBuf = inputBuf.slice(i + 1);
61
- try {
62
- const out = JSON.parse(line);
63
- const p = pending.get(out.id);
64
- if (p) {
65
- pending.delete(out.id);
66
- if (out.error != null) p.reject(new Error(out.error));
67
- else p.resolve(out.result);
68
- }
69
- } catch (_) {}
70
- }
71
- });
72
- proc.stdin.on("error", (err) => clearProc(err));
73
- proc.on("exit", (code) => clearProc(new Error("Process exited: " + code)));
74
- return proc;
75
- }
76
-
77
- function call(method, params) {
78
- return new Promise((resolve, reject) => {
79
- const id = ++nextId;
80
- pending.set(id, { resolve, reject });
81
- let p;
82
- try {
83
- p = getProc();
84
- } catch (e) {
85
- pending.delete(id);
86
- reject(e);
87
- return;
88
- }
89
- const payload = JSON.stringify({ id, method, params }) + "\n";
90
- // Defer write so EPIPE is caught (sync throw) or handled via 'error' event (clearProc)
91
- const doWrite = () => {
92
- if (!proc || proc !== p) {
93
- pending.delete(id);
94
- reject(new Error("Subprocess closed"));
95
- return;
96
- }
97
- try {
98
- const ok = p.stdin.write(payload, (err) => {
99
- if (err) {
100
- pending.delete(id);
101
- reject(err);
102
- }
103
- });
104
- if (!ok) {
105
- p.stdin.once("drain", doWrite);
106
- }
107
- } catch (e) {
108
- pending.delete(id);
109
- reject(e);
110
- }
111
- };
112
- setImmediate(doWrite);
113
- });
114
- }
115
-
116
- function encInput(input) {
117
- return input && Buffer.isBuffer(input) ? { b64: input.toString("base64") } : input;
118
- }
119
-
120
- export async function bs58(input, encoding = "utf8") {
121
- return call("bs58", [encInput(input), encoding]);
122
- }
123
-
124
- export async function verifySha256String(input, hash, encoding = "utf8") {
125
- return call("verifySha256String", [encInput(input), hash, encoding]);
126
- }
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- const fs = require("fs");
4
- const path = require("path");
5
-
6
- const pkgRoot = path.join(__dirname, "..");
7
- const linuxBin = path.join(pkgRoot, "dist", "bin", "linux", "validate-sdk");
8
-
9
- if (process.platform !== "win32" && fs.existsSync(linuxBin)) {
10
- try {
11
- fs.chmodSync(linuxBin, 0o755);
12
- } catch (_) {}
13
- }