@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 +112 -95
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/native-loader.d.ts +76 -0
- package/dist/native-loader.d.ts.map +1 -0
- package/dist/native-loader.js +80 -0
- package/dist/native-loader.js.map +1 -0
- package/native/README.md +69 -0
- package/native/prebuilds/linux-x64/validator.node +0 -0
- package/native/prebuilds/win32-x64/validator.node +0 -0
- package/package.json +13 -20
- package/dist/bin/linux/validate-sdk +0 -0
- package/dist/bin/win/validate-sdk.exe +0 -0
- package/dist/loader.cjs +0 -125
- package/dist/loader.mjs +0 -126
- package/scripts/postinstall.cjs +0 -13
package/README.md
CHANGED
|
@@ -1,95 +1,112 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
###
|
|
36
|
-
|
|
37
|
-
```ts
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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":"sKA4CA,MAAMA,EAAUC,EAAAA,mLACVC,EAAYC,EAAKC,QAAQC,EAAAA,cAAc,oBAAAC,SAAAN,QAAA,OAAAO,cAAAC,YAAAC,KAAAC,GAAA,WAAAA,EAAAC,QAAAC,eAAAF,EAAAG,KAAA,IAAAC,IAAA,YAAAR,SAAAS,SAAAN,gBAS7BO,IACd,IAAK,MAAMC,IAPJ,CACLd,EAAKe,QAAQhB,EAAW,KAAM,SAAU,YAAa,GAAGiB,QAAQC,YAAYD,QAAQE,OAAQ,kBAC5FlB,EAAKe,QAAQhB,EAAW,KAAM,SAAU,SAAU,UAAW,mBAM7D,IACE,OAAOF,EAAQiB,EACjB,CAAE,MAAOK,GAET,CAEF,OAAO,IACT,CAEA,MAAMC,EAASP,IAEFQ,EAAW,CACtBC,OAASC,GAAuBH,GAAQI,kBAAkBD,KAAoB,iBAANA,GAAkB,kBAAkBE,KAAKF,IACjHG,OAASH,GAAuBH,GAAQO,kBAAkBJ,KAAoB,iBAANA,GAAkB,mBAAmBE,KAAKF,IAClHK,IAAML,GAAuBH,GAAQS,eAAeN,KAAoB,iBAANA,GAAkB,kBAAkBE,KAAKF,IAC3GO,IAAMP,GAAuBH,GAAQW,eAAeR,KAAoB,iBAANA,GAAkBA,EAAES,OAAS,GAAKT,EAAES,OAAS,GAAM,GAAK,eAAeP,KAAKF,IAC9IU,OAASV,GAAuBH,GAAQc,kBAAkBX,IAAM,MAAS,IAAM,OAAOY,OAAOC,KAAKb,EAAG,UAAUc,SAAS,YAAcd,CAAG,CAAE,MAAQ,OAAO,CAAO,CAAG,EAApG,GAChEe,UAAYf,GAAuBH,GAAQmB,qBAAqBhB,KAAoB,iBAANA,GAAkB,0BAA0BE,KAAKF,IAC/HiB,OAASjB,GAAuBH,GAAQqB,kBAAkBlB,KAAoB,iBAANA,GAAkBA,EAAES,OAAS,GAAK,kEAAkEP,KAAKF,IACjLmB,OAASnB,GAAuBH,GAAQuB,kBAAkBpB,KAAoB,iBAANA,GAAkB,iBAAiBE,KAAKF,IAAMA,EAAES,OAAS,GAAM,GACvIY,WAAarB,GAAuBH,GAAQyB,uBAAuBtB,KAAoB,iBAANA,GAAkB,sBAAsBE,KAAKF,IAC9HuB,WAAavB,GAAuBH,GAAQ2B,uBAAuBxB,KAAoB,iBAANA,IAAmB,oCAAoCE,KAAKF,IAAM,8BAA8BE,KAAKF,KACtLyB,cAAgBzB,GAAuBH,GAAQ6B,2BAA2B1B,KAAoB,iBAANA,GAAkB,kBAAkBE,KAAKF,IACjI2B,IAAM3B,GAAuBH,GAAQ+B,eAAe5B,IAAM,MAAS,MAAM6B,EAAQC,OAAO9B,GAAG+B,MAAM,KAAM,OAAwB,IAAjBF,EAAMpB,QAAgBoB,EAAMG,MAAOzC,GAAM,oBAAoBW,KAAKX,GAAM,EAA5H,GAC1D0C,KAAOjC,GAAuBH,GAAQqC,gBAAgBlC,KAAoB,iBAANA,GAAkB,yEAAyEE,KAAKF,IACpKmC,MAAQnC,GAAuBH,GAAQuC,iBAAiBpC,KAAoB,iBAANA,GAAkB,6BAA6BE,KAAKF,IAC1HqC,IAAMrC,GAAuBH,GAAQyC,eAAetC,IAAM,MAAS,IAAM,MAAMuC,EAAI,IAAInD,IAAIY,GAAI,MAAsB,UAAfuC,EAAEC,UAAuC,WAAfD,EAAEC,QAAuB,CAAE,MAAQ,OAAO,CAAO,CAAG,EAA1H,GAC1DC,KAAOzC,GAAuBH,GAAQ6C,gBAAgB1C,KAAoB,iBAANA,GAAkB,0BAA0BE,KAAKF,IAAMA,EAAE+B,MAAM,KAAKC,MAAOW,GAAMC,SAASD,EAAG,KAAO,MACxKE,KAAO7C,GAAuBH,GAAQiD,gBAAgB9C,KAAoB,iBAANA,GAAkB,sCAAsCE,KAAKF,IACjI+C,aAAe/C,GAAuBH,GAAQmD,wBAAwBhD,KAAoB,iBAANA,GAAkB,eAAeE,KAAKF,IAC1HiD,QAAUjD,GAAuBH,GAAQqD,mBAAmBlD,KAAoB,iBAANA,GAAkB,QAAQE,KAAKF,IACzGmD,eAAiBnD,GAAuBH,GAAQuD,2BAA2BpD,KAAoB,iBAANA,GAAkBA,EAAES,QAAU,GAAK,QAAQP,KAAKF,IAAM,QAAQE,KAAKF,IAAM,QAAQE,KAAKF,IAAM,eAAeE,KAAKF,IACzMqD,SAAWrD,GAAuBH,GAAQyD,qBAAqBtD,KAAoB,iBAANA,GAAkBA,EAAEuD,OAAO9C,OAAS,GACjHA,OAAQ,CAACT,EAAWwD,EAAaC,IAAyB5D,GAAQ6D,kBAAkB1D,EAAGwD,EAAKC,KAAsB,iBAANzD,GAAkBA,EAAES,QAAU+C,GAAOxD,EAAES,QAAUgD,IAGlJE,EAAS,CACpBjD,OAASkD,GAAmC/D,GAAQgE,gBAAgBjD,OAAOkD,SAASF,GAASA,EAAM9C,SAAS,QAAU8C,KAAWhD,OAAOkD,SAASF,GAASA,EAAM9C,SAAS,UAAYF,OAAOC,KAAK+C,GAAO9C,SAAS,WACjNC,UAAY6C,GAAmC/D,GAAQkE,mBAAmBnD,OAAOkD,SAASF,GAASA,EAAM9C,SAAS,QAAU8C,KAAWhD,OAAOkD,SAASF,GAASA,EAAM9C,SAAS,aAAeF,OAAOC,KAAK+C,GAAO9C,SAAS,cAC1NP,IAAMqD,GAAmC/D,GAAQmE,aAAapD,OAAOkD,SAASF,GAASA,EAAM9C,SAAS,QAAU8C,KAAWhD,OAAOkD,SAASF,GAASA,EAAM9C,SAAS,OAASF,OAAOC,KAAK+C,GAAO9C,SAAS,SAG7LmD,EAAS,CACpBvD,OAASkD,GAA0B/D,GAAQqE,gBAAgBN,IAAUhD,OAAOC,KAAK+C,EAAO,UAAU9C,SAAS,QAC3GC,UAAY6C,GAA0B/D,GAAQsE,mBAAmBP,IAAUhD,OAAOC,KAAK+C,EAAO,aAAa9C,SAAS,QACpHP,IAAMqD,GAA0B/D,GAAQuE,aAAaR,IAAUhD,OAAOC,KAAK+C,EAAMS,QAAQ,cAAe,IAAK,OAAOvD,SAAS,SAGlHwD,EAAW,CACtB/D,IAAK,CAACgE,EAAgB,KAAe1E,GAAQ2E,eAAeD,IAAUjG,EAAQ,eAAemG,YAAYF,GAAOzD,SAAS,OACzHJ,OAAQ,CAAC6D,EAAgB,KAAe1E,GAAQ6E,kBAAkBH,IAAUjG,EAAQ,eAAemG,YAAYF,GAAOzD,SAAS,UAC/HmB,KAAM,IACJpC,GAAQ8E,mBACR,MACE,MAAMC,EAAYtG,EAAQ,eAAemG,YAAY,IAGrD,OAFAG,EAAE,GAAa,GAAPA,EAAE,GAAa,GACvBA,EAAE,GAAa,GAAPA,EAAE,GAAa,IAChB,CAACA,EAAEC,SAAS,EAAG,GAAG/D,SAAS,OAAQ8D,EAAEC,SAAS,EAAG,GAAG/D,SAAS,OAAQ8D,EAAEC,SAAS,EAAG,GAAG/D,SAAS,OAAQ8D,EAAEC,SAAS,EAAG,IAAI/D,SAAS,OAAQ8D,EAAEC,SAAS,IAAI/D,SAAS,QAAQgE,KAAK,IACvL,EALD,aCvGaC,EACfnB,EACAoB,EAA2B,QAE3B,MAAMC,EAAOC,EAAAA,WAAW,UAOxB,MALqB,iBAAVtB,EACTqB,EAAKE,OAAOvE,OAAOC,KAAK+C,EAAOoB,IAE/BC,EAAKE,OAAOvB,GAEPqB,EAAKG,OAAO,MACrB,CAhBA9F,2FAkEM,SAAqB+F,EAAWT,GACpC,IACE,MAAMU,EAAO1E,OAAOC,KAAKwE,EAAEE,cAAe,OACpCC,EAAO5E,OAAOC,KAAK+D,EAAEW,cAAe,OAC1C,OAAID,EAAK7E,SAAW+E,EAAK/E,QAClBgF,EAAAA,gBAAgBH,EAAME,EAC/B,CAAE,MACA,OAAO,CACT,CACF,cAdM,SAAc5B,GAClB,OAAOsB,EAAAA,WAAW,OAAOC,OAAOvB,GAAOwB,OAAO,MAChD,0BAhBuBxB,EAAwBoB,EAA2B,QACxE,MAAMU,EAASR,EAAAA,WAAW,UAG1B,MAFqB,iBAAVtB,EAAoB8B,EAAOP,OAAOvE,OAAOC,KAAK+C,EAAOoB,IAC3DU,EAAOP,OAAOvB,GACZ8B,EAAON,OAAO,MACvB,0BAEuBxB,EAAwBoB,EAA2B,QACxE,MAAMU,EAASR,EAAAA,WAAW,UAG1B,MAFqB,iBAAVtB,EAAoB8B,EAAOP,OAAOvE,OAAOC,KAAK+C,EAAOoB,IAC3DU,EAAOP,OAAOvB,GACZ8B,EAAON,OAAO,MACvB,gDAtCM,SACJxB,EACA+B,EACAX,EAA2B,QAE3B,IACE,MAAMY,EAAeb,EAAKnB,EAAOoB,GAE3Ba,EAAiBjF,OAAOC,KAAK+E,EAAc,OAC3CE,EAAiBlF,OAAOC,KAAK8E,EAAaJ,cAAe,OAE/D,OAAIM,EAAepF,SAAWqF,EAAerF,QAItCgF,EAAAA,gBAAgBI,EAAgBC,EACzC,CAAE,MACA,OAAO,CACT,CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA0CzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,SAAS,cAAc;IACrB,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC;QAC7G,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,CAAC,CAAc,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAE5B,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrH,GAAG,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9G,GAAG,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjJ,MAAM,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACvK,SAAS,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClI,MAAM,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,iEAAiE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpL,MAAM,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;IACzI,UAAU,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjI,UAAU,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1L,aAAa,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpI,GAAG,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACzL,IAAI,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,wEAAwE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvK,KAAK,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7H,GAAG,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACvL,IAAI,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7K,IAAI,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpI,YAAY,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7H,OAAO,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5G,cAAc,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5M,QAAQ,EAAE,CAAC,CAAS,EAAW,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACnH,MAAM,EAAE,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW,EAAW,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;CAClK,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,CAAC,KAAsB,EAAU,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3N,SAAS,EAAE,CAAC,KAAsB,EAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvO,GAAG,EAAE,CAAC,KAAsB,EAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;CAChN,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClH,SAAS,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC3H,GAAG,EAAE,CAAC,KAAa,EAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;CACrI,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,EAAE,CAAC,QAAgB,EAAE,EAAU,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC/H,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAU,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACxI,IAAI,EAAE,GAAW,EAAE,CACjB,MAAM,EAAE,aAAa,EAAE,EAAE;QACzB,CAAC,GAAG,EAAE;YACJ,MAAM,CAAC,GAAW,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAC5B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAC5B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7L,CAAC,CAAC,EAAE;CACP,CAAC"}
|
package/native/README.md
ADDED
|
@@ -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.
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@validate-sdk/v2",
|
|
3
|
-
"version": "1.22.
|
|
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
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
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:
|
|
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
|
-
}
|
package/scripts/postinstall.cjs
DELETED
|
@@ -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
|
-
}
|