@lowerdeck/tokens 1.0.3 → 1.0.5

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/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@lowerdeck/tokens",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
+ "files": [
8
+ "src/**",
9
+ "dist/**",
10
+ "README.md",
11
+ "package.json"
12
+ ],
7
13
  "author": "Tobias Herber",
8
14
  "license": "Apache 2",
9
15
  "type": "module",
@@ -21,15 +27,15 @@
21
27
  "scripts": {
22
28
  "test": "vitest run --passWithNoTests",
23
29
  "lint": "prettier src/**/*.ts --check",
24
- "build": "microbundle"
30
+ "build": "rm -rf ./dist && microbundle"
25
31
  },
26
32
  "dependencies": {
27
- "@lowerdeck/base62": "^1.0.2",
28
- "@lowerdeck/memo": "^1.0.2"
33
+ "@lowerdeck/base62": "^1.0.4",
34
+ "@lowerdeck/memo": "^1.0.4"
29
35
  },
30
36
  "devDependencies": {
31
37
  "microbundle": "^0.15.1",
32
- "@lowerdeck/tsconfig": "^1.0.0",
38
+ "@lowerdeck/tsconfig": "^1.0.1",
33
39
  "typescript": "5.8.2",
34
40
  "vitest": "^3.1.2"
35
41
  }
@@ -1,13 +0,0 @@
1
-
2
- $ microbundle
3
- No name was provided for external module '@lowerdeck/base62' in output.globals – guessing 'base62'
4
- No name was provided for external module '@lowerdeck/memo' in output.globals – guessing 'memo'
5
- Build "@lowerdeck/tokens" to dist:
6
- 932 B: index.cjs.gz
7
- 834 B: index.cjs.br
8
- 800 B: index.module.js.gz
9
- 713 B: index.module.js.br
10
- 936 B: index.module.js.gz
11
- 839 B: index.module.js.br
12
- 1015 B: index.umd.js.gz
13
- 903 B: index.umd.js.br
@@ -1,26 +0,0 @@
1
-
2
- $ vitest run --passWithNoTests
3
- [?25l
4
-  RUN  v3.2.4 /Users/tobias/code/metorial/metorial-enterprise/oss/src/packages/backend/tokens
5
-
6
- [?2026h
7
-  ❯ src/tokens.test.ts [queued]
8
-
9
-  Test Files 0 passed (1)
10
-  Tests 0 passed (0)
11
-  Start at 10:23:44
12
-  Duration 101ms
13
- [?2026l ✓ src/tokens.test.ts (6 tests) 14ms
14
- ✓ Tokens > should sign and verify tokens 4ms
15
- ✓ Tokens > should not verify tokens with wrong type 1ms
16
- ✓ Tokens > should not verify tokens with wrong version 2ms
17
- ✓ Tokens > should not verify tokens with wrong signature 1ms
18
- ✓ Tokens > should not verify tokens with too few parts 1ms
19
- ✓ Tokens > should not verify expired tokens 2ms
20
-
21
-  Test Files  1 passed (1)
22
-  Tests  6 passed (6)
23
-  Start at  10:23:44
24
-  Duration  247ms (transform 47ms, setup 0ms, collect 52ms, tests 14ms, environment 0ms, prepare 45ms)
25
-
26
- [?25h
package/CHANGELOG.md DELETED
@@ -1,25 +0,0 @@
1
- # @lowerdeck/tokens
2
-
3
- ## 1.0.3
4
-
5
- ### Patch Changes
6
-
7
- - update versions
8
- - Updated dependencies
9
- - @lowerdeck/base62@1.0.2
10
- - @lowerdeck/memo@1.0.2
11
-
12
- ## 1.0.2
13
-
14
- ### Patch Changes
15
-
16
- - rebuild
17
-
18
- ## 1.0.1
19
-
20
- ### Patch Changes
21
-
22
- - Fix exports
23
- - Updated dependencies
24
- - @lowerdeck/base62@1.0.1
25
- - @lowerdeck/memo@1.0.1
@@ -1,2 +0,0 @@
1
- import{base62 as e}from"@lowerdeck/base62";import{memo as t}from"@lowerdeck/memo";class r{constructor(r){this.keys=void 0,this.signer=void 0,this.keys=r,this.signer=(r=>{if("secret"in r){let n=t(()=>crypto.subtle.importKey("raw",(new TextEncoder).encode(r.secret),{name:"HMAC",hash:{name:"SHA-384"}},!1,["sign","verify"]));return{async sign(t){let r=await crypto.subtle.sign({name:"HMAC",hash:{name:"SHA-384"}},await n(),(new TextEncoder).encode(t));return e.encode(new Uint8Array(r))},verify:async(t,r)=>crypto.subtle.verify({name:"HMAC",hash:{name:"SHA-384"}},await n(),new Uint8Array(e.decodeRaw(r)),(new TextEncoder).encode(t))}}{let n=t(async()=>{if("string"==typeof r.privateKey){let e=JSON.parse(r.privateKey);return await crypto.subtle.importKey("jwk",e,{name:"EC"==e.kty?"ECDSA":e.kty,namedCurve:e.crv},!0,["sign"])}return await r.privateKey()}),i=t(async()=>{if("string"==typeof r.publicKey){let e=JSON.parse(r.publicKey);return await crypto.subtle.importKey("jwk",JSON.parse(r.publicKey),{name:"EC"==e.kty?"ECDSA":e.kty,namedCurve:e.crv},!0,["verify"])}return await r.publicKey()});return{async sign(t){let r=await n(),i=await crypto.subtle.sign({name:r.algorithm.name,hash:{name:"SHA-384"}},r,(new TextEncoder).encode(t));return e.encode(new Uint8Array(i))},verify:async(t,r)=>crypto.subtle.verify({name:"ECDSA",hash:{name:"SHA-384"}},await i(),new Uint8Array(e.decodeRaw(r)),(new TextEncoder).encode(t))}}})(r)}async sign({type:t,data:r,expiresAt:n}){let i=`${t}_v1_${e.encode(JSON.stringify({d:r,e:null==n?void 0:n.getTime(),c:Date.now()}))}`;return`${i}_${await this.signer.sign(i)}`}async verify({token:t,expectedType:r}){let n=t.split("_");if(n.length<4)return{verified:!1};let i=n.pop(),a=n.pop(),s=n.pop(),c=n.join("_");if(c!=r)return{verified:!1};if("v1"!=s)return{verified:!1};let o=`${c}_${s}_${a}`;if(!await this.signer.verify(o,i))return{verified:!1};let y=JSON.parse(e.decode(a)),d=y.e?new Date(y.e):null;return d&&d<new Date?{verified:!1}:{verified:!0,type:c,expiresAt:d,createdAt:new Date(y.c),data:y.d}}static decode(t){let r=t.split("_");return r.length<4?null:JSON.parse(e.decode(r[r.length-2]))}}export{r as Tokens};
2
- //# sourceMappingURL=index.modern.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/tokens.ts"],"sourcesContent":["import { base62 } from '@lowerdeck/base62';\nimport { memo } from '@lowerdeck/memo';\n\nexport type TokenKeys =\n | {\n privateKey: string | (() => Promise<CryptoKey> | CryptoKey);\n publicKey: string | (() => Promise<CryptoKey> | CryptoKey);\n }\n | {\n secret: string;\n };\n\ntype Signer = {\n sign: (data: string) => Promise<string>;\n verify: (data: string, signature: string) => Promise<boolean>;\n};\n\nlet getSigner = (keys: TokenKeys): Signer => {\n if ('secret' in keys) {\n let keyMemo = memo(() =>\n crypto.subtle.importKey(\n 'raw',\n new TextEncoder().encode(keys.secret),\n { name: 'HMAC', hash: { name: 'SHA-384' } },\n false,\n ['sign', 'verify']\n )\n );\n\n return {\n async sign(data) {\n let signature = await crypto.subtle.sign(\n { name: 'HMAC', hash: { name: 'SHA-384' } },\n await keyMemo(),\n new TextEncoder().encode(data)\n );\n\n return base62.encode(new Uint8Array(signature));\n },\n\n async verify(data, signature) {\n return crypto.subtle.verify(\n { name: 'HMAC', hash: { name: 'SHA-384' } },\n await keyMemo(),\n new Uint8Array(base62.decodeRaw(signature)),\n new TextEncoder().encode(data)\n );\n }\n };\n } else {\n let privateKeyMemo = memo(async () => {\n if (typeof keys.privateKey == 'string') {\n let data = JSON.parse(keys.privateKey) as any;\n\n return await crypto.subtle.importKey(\n 'jwk',\n data,\n { name: data.kty == 'EC' ? 'ECDSA' : data.kty, namedCurve: data.crv },\n true,\n ['sign']\n );\n } else {\n return (await keys.privateKey()) as CryptoKey;\n }\n });\n\n let publicKeyMemo = memo(async () => {\n if (typeof keys.publicKey == 'string') {\n let data = JSON.parse(keys.publicKey) as any;\n\n return await crypto.subtle.importKey(\n 'jwk',\n JSON.parse(keys.publicKey) as any,\n { name: data.kty == 'EC' ? 'ECDSA' : data.kty, namedCurve: data.crv },\n true,\n ['verify']\n );\n } else {\n return (await keys.publicKey()) as CryptoKey;\n }\n });\n\n return {\n async sign(data) {\n let key = await privateKeyMemo();\n\n let signature = await crypto.subtle.sign(\n { name: key.algorithm.name, hash: { name: 'SHA-384' } },\n key,\n new TextEncoder().encode(data)\n );\n\n return base62.encode(new Uint8Array(signature));\n },\n\n async verify(data, signature) {\n return crypto.subtle.verify(\n { name: 'ECDSA', hash: { name: 'SHA-384' } },\n await publicKeyMemo(),\n new Uint8Array(base62.decodeRaw(signature)),\n new TextEncoder().encode(data)\n );\n }\n };\n }\n};\n\nexport class Tokens {\n private signer: Signer;\n constructor(readonly keys: TokenKeys) {\n this.signer = getSigner(keys);\n }\n\n async sign({ type, data, expiresAt }: { type: string; data: any; expiresAt?: Date }) {\n let token = `${type}_v1_${base62.encode(\n JSON.stringify({\n d: data,\n e: expiresAt?.getTime(),\n c: Date.now()\n })\n )}`;\n\n let signature = await this.signer.sign(token);\n return `${token}_${signature}`;\n }\n\n async verify({ token, expectedType }: { expectedType: string; token: string }) {\n let parts = token.split('_');\n if (parts.length < 4) return { verified: false as const };\n\n let signatureBase62 = parts.pop()!;\n let dataBase62 = parts.pop()!;\n let version = parts.pop()!;\n let type = parts.join('_');\n if (type != expectedType) return { verified: false as const };\n\n if (version != 'v1') return { verified: false as const };\n\n let main = `${type}_${version}_${dataBase62}`;\n\n let verified = await this.signer.verify(main, signatureBase62);\n if (!verified) return { verified: false as const };\n\n let data = JSON.parse(base62.decode(dataBase62));\n let expiresAt = data.e ? new Date(data.e) : null;\n if (expiresAt && expiresAt < new Date()) return { verified: false as const };\n\n let createdAt = new Date(data.c);\n\n return {\n verified: true as const,\n\n type,\n expiresAt,\n createdAt,\n data: data.d\n };\n }\n\n static decode(token: string) {\n let parts = token.split('_');\n if (parts.length < 4) return null;\n\n let dataBase62 = parts[parts.length - 2];\n return JSON.parse(base62.decode(dataBase62));\n }\n}\n"],"names":["Tokens","constructor","keys","this","signer","keyMemo","memo","crypto","subtle","importKey","TextEncoder","encode","secret","name","hash","sign","data","signature","base62","Uint8Array","async","verify","decodeRaw","privateKeyMemo","privateKey","JSON","parse","kty","namedCurve","crv","publicKeyMemo","publicKey","key","algorithm","getSigner","type","expiresAt","token","stringify","d","e","getTime","c","Date","now","expectedType","parts","split","length","verified","signatureBase62","pop","dataBase62","version","join","main","decode","createdAt"],"mappings":"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"}
package/tsconfig.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "extends": "@lowerdeck/tsconfig/base.json",
4
- "exclude": ["dist"],
5
- "compilerOptions": {
6
- "outDir": "dist"
7
- }
8
- }