From 6da2a94266eddad7ff00277c8db15b6242386992 Mon Sep 17 00:00:00 2001 From: Alexander Elias Date: Mon, 29 Jan 2024 12:05:23 -0800 Subject: [PATCH] 3.6.4 --- .gitignore | 3 +- README.md | 2 +- _/_mod.ts | 95 -------- _/cryp.ts | 205 ------------------ _/mod.js | 45 ---- _/node/access/.npmignore | 4 - _/node/access/esm/mod.js | 70 ------ _/node/access/esm/package.json | 3 - _/node/access/package-lock.json | 13 -- _/node/access/package.json | 12 - _/node/connect/.npmignore | 4 - _/node/connect/esm/connect/mod.js | 127 ----------- .../deno.land/std@0.180.0/encoding/base64.js | 139 ------------ .../std@0.180.0/encoding/base64url.js | 65 ------ _/node/connect/esm/jwt/mod.js | 14 -- _/node/connect/esm/package.json | 3 - _/node/connect/package-lock.json | 13 -- _/node/connect/package.json | 12 - _/node/decrypt/.npmignore | 4 - _/node/decrypt/esm/mod.js | 29 --- _/node/decrypt/esm/package.json | 3 - _/node/decrypt/package-lock.json | 13 -- _/node/decrypt/package.json | 12 - _/node/encrypt/.npmignore | 4 - _/node/encrypt/esm/mod.js | 28 --- _/node/encrypt/esm/package.json | 3 - _/node/encrypt/package-lock.json | 13 -- _/node/encrypt/package.json | 12 - _/node/hash/.npmignore | 4 - _/node/hash/esm/mod.js | 10 - _/node/hash/esm/package.json | 3 - _/node/hash/package-lock.json | 13 -- _/node/hash/package.json | 12 - _/node/identifier/.npmignore | 4 - _/node/identifier/esm/mod.js | 3 - _/node/identifier/esm/package.json | 3 - _/node/identifier/package-lock.json | 13 -- _/node/identifier/package.json | 12 - _/node/jwt/.npmignore | 4 - .../deno.land/std@0.180.0/encoding/base64.js | 139 ------------ .../std@0.180.0/encoding/base64url.js | 65 ------ _/node/jwt/esm/mod.js | 14 -- _/node/jwt/esm/package.json | 3 - _/node/jwt/package-lock.json | 13 -- _/node/jwt/package.json | 12 - _/node/password/.npmignore | 4 - _/node/password/esm/mod.js | 43 ---- _/node/password/esm/package.json | 3 - _/node/password/package-lock.json | 13 -- _/node/password/package.json | 12 - _/node/secret/.npmignore | 4 - _/node/secret/esm/mod.js | 1 - _/node/secret/esm/package.json | 3 - _/node/secret/package-lock.json | 13 -- _/node/secret/package.json | 12 - _/node/username/.npmignore | 4 - _/node/username/esm/mod.js | 13 -- _/node/username/esm/package.json | 3 - _/node/username/package-lock.json | 13 -- _/node/username/package.json | 12 - build.ts | 6 +- executable/publish.ts | 10 +- jwt/mod.ts | 12 +- module/connect/mod.js | 16 +- module/connect/mod.js.map | 6 +- module/jwt/mod.js | 16 +- module/jwt/mod.js.map | 6 +- package.json | 54 ++--- snowflake/mod.ts | 2 +- test.ts | 2 +- version.ts | 2 +- 71 files changed, 67 insertions(+), 1495 deletions(-) delete mode 100644 _/_mod.ts delete mode 100644 _/cryp.ts delete mode 100644 _/mod.js delete mode 100644 _/node/access/.npmignore delete mode 100644 _/node/access/esm/mod.js delete mode 100644 _/node/access/esm/package.json delete mode 100644 _/node/access/package-lock.json delete mode 100644 _/node/access/package.json delete mode 100644 _/node/connect/.npmignore delete mode 100644 _/node/connect/esm/connect/mod.js delete mode 100644 _/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64.js delete mode 100644 _/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64url.js delete mode 100644 _/node/connect/esm/jwt/mod.js delete mode 100644 _/node/connect/esm/package.json delete mode 100644 _/node/connect/package-lock.json delete mode 100644 _/node/connect/package.json delete mode 100644 _/node/decrypt/.npmignore delete mode 100644 _/node/decrypt/esm/mod.js delete mode 100644 _/node/decrypt/esm/package.json delete mode 100644 _/node/decrypt/package-lock.json delete mode 100644 _/node/decrypt/package.json delete mode 100644 _/node/encrypt/.npmignore delete mode 100644 _/node/encrypt/esm/mod.js delete mode 100644 _/node/encrypt/esm/package.json delete mode 100644 _/node/encrypt/package-lock.json delete mode 100644 _/node/encrypt/package.json delete mode 100644 _/node/hash/.npmignore delete mode 100644 _/node/hash/esm/mod.js delete mode 100644 _/node/hash/esm/package.json delete mode 100644 _/node/hash/package-lock.json delete mode 100644 _/node/hash/package.json delete mode 100644 _/node/identifier/.npmignore delete mode 100644 _/node/identifier/esm/mod.js delete mode 100644 _/node/identifier/esm/package.json delete mode 100644 _/node/identifier/package-lock.json delete mode 100644 _/node/identifier/package.json delete mode 100644 _/node/jwt/.npmignore delete mode 100644 _/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64.js delete mode 100644 _/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64url.js delete mode 100644 _/node/jwt/esm/mod.js delete mode 100644 _/node/jwt/esm/package.json delete mode 100644 _/node/jwt/package-lock.json delete mode 100644 _/node/jwt/package.json delete mode 100644 _/node/password/.npmignore delete mode 100644 _/node/password/esm/mod.js delete mode 100644 _/node/password/esm/package.json delete mode 100644 _/node/password/package-lock.json delete mode 100644 _/node/password/package.json delete mode 100644 _/node/secret/.npmignore delete mode 100644 _/node/secret/esm/mod.js delete mode 100644 _/node/secret/esm/package.json delete mode 100644 _/node/secret/package-lock.json delete mode 100644 _/node/secret/package.json delete mode 100644 _/node/username/.npmignore delete mode 100644 _/node/username/esm/mod.js delete mode 100644 _/node/username/esm/package.json delete mode 100644 _/node/username/package-lock.json delete mode 100644 _/node/username/package.json diff --git a/.gitignore b/.gitignore index 3f1b4ae..8b94dbc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ commands node_modules -deno.lock \ No newline at end of file +deno.lock +package-lock.json \ No newline at end of file diff --git a/README.md b/README.md index da2c42a..55b67ce 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![GitHub](https://img.shields.io/github/license/xeaone/tool) [![deno module](https://shield.deno.dev/x/xtool)](https://deno.land/x/xtool) -![deno compatibility](https://shield.deno.dev/deno/1.33.3) +![deno compatibility](https://shield.deno.dev/deno/1.40.2) [![CodeQL](https://github.com/xeaone/tool/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/xeaone/tool/actions/workflows/github-code-scanning/codeql) [![Test](https://github.com/xeaone/tool/actions/workflows/test.yml/badge.svg)](https://github.com/xeaone/tool/actions/workflows/test.yml) diff --git a/_/_mod.ts b/_/_mod.ts deleted file mode 100644 index 038e996..0000000 --- a/_/_mod.ts +++ /dev/null @@ -1,95 +0,0 @@ -const symbol1Start = 33; -const symbol1End = 47; - -const numberStart = 48; -const numberEnd = 57; - -const symbol2Start = 58; -const symbol2End = 64; - -const upperStart = 65; -const upperEnd = 90; - -const symbol3Start = 91; -const symbol3End = 96; - -const lowerStart = 97; -const lowerEnd = 122; - -const symbol4Start = 123; -const symbol4End = 126; - -const anyStart = 33; -const anyEnd = 126; - -const translator = 2 ** 32; - -export const randomNumber = (): string => String.fromCharCode(randomInteger(numberStart, numberEnd)); - -export const randomUpper = (): string => String.fromCharCode(randomInteger(upperStart, upperEnd)); - -export const randomLower = (): string => String.fromCharCode(randomInteger(lowerStart, lowerEnd)); - -export const randomAny = (): string => String.fromCharCode(randomInteger(anyStart, anyEnd)); - -/** - * @description Generates a secure random string of configurable length with upper, lower, symbol, or number chars. - * @param {Object} - * @returns {String} - */ -export const random = ({ - length = 8, - upper = true, - lower = true, - symbol = true, - number = true, -}: { - length?: number; - upper?: boolean; - lower?: boolean; - symbol?: boolean; - number?: boolean; -} = { - length: 8, - upper: true, - lower: true, - symbol: true, - number: true, - }): string => { - if (!length) throw new Error('length number required'); - if (typeof length !== 'number') throw new Error('length number required'); - if (typeof upper !== 'boolean') throw new Error('upper boolean required'); - if (typeof lower !== 'boolean') throw new Error('lower boolean required'); - if (typeof symbol !== 'boolean') throw new Error('symbol boolean required'); - if (typeof number !== 'boolean') throw new Error('number boolean required'); - if (!upper && !lower && !symbol && !number) throw new Error('upper, lower, symbol, or number required'); - - let result = ''; - - while (length) { - const integer = randomInteger(anyStart, anyEnd); - - if (upper && integer >= upperStart && integer <= upperEnd) { - result += String.fromCharCode(integer); - length--; - } else if (lower && integer >= lowerStart && integer <= lowerEnd) { - result += String.fromCharCode(integer); - length--; - } else if (number && integer >= numberStart && integer <= numberEnd) { - result += String.fromCharCode(integer); - length--; - } else if ( - symbol && ( - integer >= symbol1Start && integer <= symbol1End || - integer >= symbol2Start && integer <= symbol2End || - integer >= symbol3Start && integer <= symbol3End || - integer >= symbol4Start && integer <= symbol4End - ) - ) { - result += String.fromCharCode(integer); - length--; - } - } - - return result; -}; diff --git a/_/cryp.ts b/_/cryp.ts deleted file mode 100644 index 32c825c..0000000 --- a/_/cryp.ts +++ /dev/null @@ -1,205 +0,0 @@ - - -// const ENCODING = 'hex'; -const ITERATIONS = 999999; -// const KEY = 32; -const TAG = 16; -const SALT = 16; -const SIZE = 20; -const VECTOR = 12; -// const RANDOM= 20; -const HASH = 'SHA-512'; -const ALGORITHM = 'aes-256-gcm'; - -interface KeyOptions { - size?: number; - hash?: string; - iterations?: number; - salt?: string | number | ArrayBufferLike; -} - -export const hash = async function (data: string, type: string) { - if (!data) throw new Error('data argument required'); - - type = type || HASH; - - const buffer = await stringToBuffer(data); - const bufferHash = await createHash(buffer, type); - const hex = await bufferToHex(bufferHash); - - return hex; -}; - -export const compare = async function (password: string, data: string) { - - if (!data) throw new Error('data argument required'); - if (!password) throw new Error('password argument required'); - - const salt = await hexToBuffer(data.split(':')[ 1 ]); - const computed = await key(password, { salt }); - - return data === computed; -}; - -export const key = async function (data: string, options?: KeyOptions) { - if (!data) throw new Error('data argument required'); - - const size = options?.size ?? SIZE; - const hash = options?.hash ?? HASH; - const salt = options?.salt ?? SALT; - const iterations = options?.iterations ?? ITERATIONS; - - const bData = - typeof data === 'string' ? - stringToBuffer(data) : data; - - const bSalt = - typeof salt === 'string' ? - stringToBuffer(salt) : - typeof salt === 'number' ? - randomBytes(salt) : salt; - - const bKey = await pbkdf2(bData, bSalt, iterations, size, hash); - - const hKey = bufferToHex(bKey); - const hSalt = bufferToHex(bSalt); - - return `${hKey}:${hSalt}`; -}; - -export const encrypt = async function (data: string, key: string, algorithm: string, vector: string | number) { - - if (!key) throw new Error('key argument required'); - if (!data) throw new Error(' data argument required'); - - const [ sKey ] = key.split(':'); - vector = vector || VECTOR; - algorithm = algorithm || ALGORITHM; - - const bKey = hexToBuffer(sKey); - const bVector = typeof data === 'string' ? stringToBuffer(data) : data; - const bData = typeof vector === 'string' ? stringToBuffer(vector) : randomBytes(vector); - - const bEncrypted = await cipher(algorithm, bKey, bVector, bData); - - const hEncrypted = bufferToHex(bEncrypted); - const hVector = bufferToHex(bVector); - - return `${hEncrypted}:${hVector}`; -}; - -export const decrypt = async function (data: string, key: string, algorithm: string) { - - if (!key) throw new Error('key argument required'); - if (!data) throw new Error('data argument required'); - - algorithm = algorithm || ALGORITHM; - - const [ sKey ] = key.split(':'); - const [ sData, sVector ] = data.split(':'); - - const bKey = hexToBuffer(sKey); - const bData = hexToBuffer(sData); - const bVector = hexToBuffer(sVector); - - const bDecrypted = await decipher(algorithm, bKey, bVector, bData); - const sDecrypted = await bufferToString(bDecrypted); - - return sDecrypted; -}; - -export const hexToBuffer = function (hex: string) { - if (typeof hex !== 'string') throw new TypeError('expected input to be a string'); - if ((hex.length % 2) !== 0) throw new RangeError('expected string to be an even number of characters'); - - const bytes = new Uint8Array(hex.length / 2); - - for (let i = 0, l = hex.length; i < l; i += 2) { - bytes[ i / 2 ] = parseInt(hex.substring(i, i + 2), 16); - } - - return bytes.buffer; -}; - -export const bufferToHex = function (buffer: ArrayBufferLike) { - const bytes = new Uint8Array(buffer); - const hex = new Array(bytes.length); - - for (let i = 0, l = bytes.length; i < l; i++) { - hex[ i ] = bytes[ i ].toString(16).padStart(2, '0').slice(-2); - } - - return hex.join(''); -}; - -export const stringToBuffer = function (string: string) { - const bytes = new Uint8Array(string.length); - - for (let i = 0, l = string.length; i < l; i++) { - bytes[ i ] = string.charCodeAt(i); - } - - return bytes.buffer; -}; - -export const bufferToString = function (buffer: ArrayBufferLike) { - const bytes = new Uint8Array(buffer); - const string = new Array(bytes.length); - - for (let i = 0, l = bytes.length; i < l; i++) { - string[ i ] = String.fromCharCode(bytes[ i ]); - } - - return string.join(''); -}; - -export const createHash = function (data: ArrayBufferLike, type: string) { - return window.crypto.subtle.digest(type, data); -}; - -export const randomBytes = function (size: number) { - return window.crypto.getRandomValues(new Uint8Array(size)).buffer; -}; - -export const pbkdf2 = async function (password: ArrayBufferLike, salt: ArrayBufferLike, iterations: number, size: number, hash: string) { - const key = await window.crypto.subtle.importKey('raw', password, { name: 'PBKDF2' }, false, [ 'deriveBits' ]); - - const bits = await window.crypto.subtle.deriveBits({ - salt, - iterations, - name: 'PBKDF2', - hash: { name: hash } - }, key, size << 3); - - return new Uint8Array(bits); -}; - -export const cipher = async function (algorithm: string, key: ArrayBufferLike, vector: ArrayBufferLike, data: ArrayBufferLike) { - - const oKey = await window.crypto.subtle.importKey('raw', key, { - name: algorithm - }, false, [ 'encrypt' ]); - - const encrypted = await window.crypto.subtle.encrypt({ - iv: vector, - name: algorithm, - tagLength: TAG * 8 - }, oKey, data); - - return encrypted; -}; - -export const decipher = async function (algorithm: string, key: ArrayBufferLike, vector: ArrayBufferLike, data: ArrayBufferLike) { - - const oKey = await window.crypto.subtle.importKey('raw', key, { - name: algorithm - }, false, [ 'decrypt' ]); - - const decrypted = await window.crypto.subtle.decrypt({ - iv: vector, - name: algorithm, - tagLength: TAG * 8 - }, oKey, data); - - return decrypted; -}; diff --git a/_/mod.js b/_/mod.js deleted file mode 100644 index b0f6c42..0000000 --- a/_/mod.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - license: MIT - version: 2.0.0 - author: Alexander Elias - repository: https://github.com/xeaone/tool - jsdelivr: https://cdn.jsdelivr.net/gh/xeaone/tool@main/ -*/ -export default class Post { - beforePost; - duringPost; - afterPost; - constructor(options) { - this.beforePost = options?.beforePost; - this.duringPost = options?.duringPost; - this.afterPost = options?.afterPost; - } - async method(path, data) { - const url = new URL(path, globalThis.location.origin); - await this.beforePost?.(data, url); - try { - data = JSON.stringify(data); - } - catch { /**/ } - const response = await globalThis.fetch(url.href, { method: 'POST', body: data }); - if (!response.body) { - await this.afterPost?.(data, new URL(response.url), response.status); - return {}; - } - data = ''; - const decoder = new TextDecoder(); - const reader = response.body.getReader(); - let result = await reader.read(); - while (!result.done) { - data += decoder.decode(result.value, { stream: true }); - await this.duringPost?.(data, new URL(response.url), response.status); - result = await reader.read(); - } - try { - data = JSON.parse(data); - } - catch { /**/ } - await this.afterPost?.(data, new URL(response.url), response.status); - return data; - } -} diff --git a/_/node/access/.npmignore b/_/node/access/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/access/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/access/esm/mod.js b/_/node/access/esm/mod.js deleted file mode 100644 index 8154bec..0000000 --- a/_/node/access/esm/mod.js +++ /dev/null @@ -1,70 +0,0 @@ -// type Action = 'view' | 'search' | 'create' | 'update' | 'remove'; -export default class Access { - #actions = []; - #resources = []; - constructor(options) { - this.#actions = options?.actions ?? this.#actions; - this.#resources = options?.resources ?? this.#resources; - } - actions(actions) { - this.#actions = actions; - return this; - } - resources(resources) { - this.#resources = resources; - return this; - } - // checks if access is allowed - allowed(permissions, resource, action) { - if (!this.#actions.includes(action)) - return false; - if (!this.#resources.includes(resource)) - return false; - if (permissions instanceof Array === false) - return false; - for (const permission of permissions) { - if (permission.resource === resource && permission[action] === true) { - return true; - } - } - return false; - } - // checks permission format - formated(permissions) { - if (permissions instanceof Array === false) - return false; - for (const permission of permissions) { - if (this.#resources.includes(permission.resource) === false) - return false; - if (this.#actions.length !== Object.keys(permission).length) - return false; - for (const action of this.#actions) { - if (action in permission === false || typeof permission[action] !== 'boolean') { - return false; - } - } - } - return true; - } - // checks a permission against another permission - compare(credentialPermissions, payloadPermissions) { - if (payloadPermissions instanceof Array === false) { - return false; - } - if (credentialPermissions instanceof Array === false) { - return false; - } - for (const payloadPermission of payloadPermissions) { - for (const credentialPermission of credentialPermissions) { - if (credentialPermission.resource === payloadPermission.resource) { - for (const action of this.#actions) { - if (credentialPermission[action] === false && payloadPermission[action] === true) { - return false; - } - } - } - } - } - return true; - } -} diff --git a/_/node/access/esm/package.json b/_/node/access/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/access/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/access/package-lock.json b/_/node/access/package-lock.json deleted file mode 100644 index a8ff843..0000000 --- a/_/node/access/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/access", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/access", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/access/package.json b/_/node/access/package.json deleted file mode 100644 index 0f903b1..0000000 --- a/_/node/access/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/access", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/connect/.npmignore b/_/node/connect/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/connect/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/connect/esm/connect/mod.js b/_/node/connect/esm/connect/mod.js deleted file mode 100644 index f7ee5bf..0000000 --- a/_/node/connect/esm/connect/mod.js +++ /dev/null @@ -1,127 +0,0 @@ -import jwt from '../jwt/mod.js'; -export class Google { - #token; - #expires; - #project; - #serviceAccountCredentials; - #applicationDefaultCredentials; - constructor(options) { - this.#project = options?.project; - this.#serviceAccountCredentials = options?.serviceAccountCredentials; - this.#applicationDefaultCredentials = options?.applicationDefaultCredentials; - } - async #auth() { - if (this.#expires && this.#expires >= Date.now()) - return; - let response; - if (this.#applicationDefaultCredentials) { - response = await fetch('https://oauth2.googleapis.com/token', { - method: 'POST', - body: new URLSearchParams(this.#applicationDefaultCredentials) - }); - } - else if (this.#serviceAccountCredentials) { - const { client_email, private_key } = this.#serviceAccountCredentials; - const iss = client_email; - const iat = Math.round(Date.now() / 1000); - const exp = iat + (30 * 60); - const aud = 'https://oauth2.googleapis.com/token'; - const scope = 'https://www.googleapis.com/auth/datastore'; - const assertion = await jwt({ typ: 'JWT', alg: 'RS256' }, { exp, iat, iss, aud, scope }, private_key); - const grant_type = 'urn:ietf:params:oauth:grant-type:jwt-bearer'; - response = await fetch('https://oauth2.googleapis.com/token', { - method: 'POST', - body: new URLSearchParams({ assertion, grant_type }), - }); - } - else { - try { - response = await fetch('http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token', { - method: 'GET', - headers: { 'Metadata-Flavor': 'Google' }, - }); - } - catch { - throw new Error('credentials required'); - } - } - const result = await response.json(); - if (result.error) { - throw new Error(JSON.stringify(result.error, null, '\t')); - } - this.#token = result.access_token; - this.#expires = Date.now() + (result.expires_in * 1000); - } - applicationDefault(applicationDefaultCredentials) { - this.#applicationDefaultCredentials = { ...applicationDefaultCredentials, grant_type: 'refresh_token' }; - return this; - } - serviceAccount(serviceAccountCredentials) { - this.#serviceAccountCredentials = { ...serviceAccountCredentials }; - return this; - } - /** - * @description - * Initialize application default credentials with `gcloud auth application-default login`. - * This file should be created and will be used as the application credential: - * - Windows: %APPDATA%\gcloud\application_default_credentials.json - * - Linux/Mac: $HOME/.config/gcloud/application_default_credentials.json - * @param credential - */ - credential(credential) { - // const command = await new Deno.Command('gcloud', { - // args: ['auth', 'application-default', 'print-access-token'], - // stderr: 'inherit', - // }).output(); - // result = { - // expires_in: 3599, - // access_token: new TextDecoder().decode(command.stdout), - // }; - if (credential === 'meta') { - return; - } - else if (credential === 'application') { - let file; - try { - const prefix = Deno.build.os === 'windows' ? Deno.env.get('APPDATA') : `${Deno.env.get('HOME')}/.config`; - file = Deno.readTextFileSync(`${prefix}/gcloud/application_default_credentials.json`); - } - catch { - return; - } - const data = JSON.parse(file); - this.#applicationDefaultCredentials = { ...data, grant_type: 'refresh_token' }; - } - else if (credential.type === 'authorized_user') { - this.applicationDefault(credential); - } - else if (credential.type === 'service_account') { - this.serviceAccount(credential); - } - else { - throw new Error('credential option required'); - } - } - project(data) { - this.#project = data; - return this; - } - async fetch(input, init) { - if (!this.project) { - const method = 'GET'; - const headers = new Headers({ - 'Metadata-Flavor': 'Google' - }); - const projectResponse = await fetch('http://metadata.google.internal/computeMetadata/v1/project/project-id', { method, headers }); - this.#project = await projectResponse.text(); - } - if (!this.#project) - throw new Error('project required'); - await this.#auth(); - const request = new Request(input, init); - if (this.#token) - request.headers.set('Authorization', `Bearer ${this.#token}`); - const response = await fetch(request); - return response; - } -} diff --git a/_/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64.js b/_/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64.js deleted file mode 100644 index 75cb0b9..0000000 --- a/_/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64.js +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -/** - * {@linkcode encode} and {@linkcode decode} for - * [base64](https://en.wikipedia.org/wiki/Base64) encoding. - * - * This module is browser compatible. - * - * @example - * ```ts - * import { - * decode, - * encode, - * } from "https://deno.land/std@$STD_VERSION/encoding/base64.ts"; - * - * const b64Repr = "Zm9vYg=="; - * - * const binaryData = decode(b64Repr); - * console.log(binaryData); - * // => Uint8Array [ 102, 111, 111, 98 ] - * - * console.log(encode(binaryData)); - * // => Zm9vYg== - * ``` - * - * @module - */ -const base64abc = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "+", - "/", -]; -/** - * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727 - * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation - * @param data - */ -export function encode(data) { - const uint8 = typeof data === "string" - ? new TextEncoder().encode(data) - : data instanceof Uint8Array - ? data - : new Uint8Array(data); - let result = "", i; - const l = uint8.length; - for (i = 2; i < l; i += 3) { - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)]; - result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)]; - result += base64abc[uint8[i] & 0x3f]; - } - if (i === l + 1) { - // 1 octet yet to write - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[(uint8[i - 2] & 0x03) << 4]; - result += "=="; - } - if (i === l) { - // 2 octets yet to write - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)]; - result += base64abc[(uint8[i - 1] & 0x0f) << 2]; - result += "="; - } - return result; -} -/** - * Decodes a given RFC4648 base64 encoded string - * @param b64 - */ -export function decode(b64) { - const binString = atob(b64); - const size = binString.length; - const bytes = new Uint8Array(size); - for (let i = 0; i < size; i++) { - bytes[i] = binString.charCodeAt(i); - } - return bytes; -} diff --git a/_/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64url.js b/_/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64url.js deleted file mode 100644 index 7262dc5..0000000 --- a/_/node/connect/esm/deps/deno.land/std@0.180.0/encoding/base64url.js +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -/** - * {@linkcode encode} and {@linkcode decode} for - * [base64 URL safe](https://en.wikipedia.org/wiki/Base64#URL_applications) encoding. - * - * This module is browser compatible. - * - * @example - * ```ts - * import { - * decode, - * encode, - * } from "https://deno.land/std@$STD_VERSION/encoding/base64url.ts"; - * - * const binary = new TextEncoder().encode("foobar"); - * const encoded = encode(binary); - * console.log(encoded); - * // => "Zm9vYmFy" - * - * console.log(decode(encoded)); - * // => Uint8Array(6) [ 102, 111, 111, 98, 97, 114 ] - * ``` - * - * @module - */ -import * as base64 from "./base64.js"; -/* - * Some variants allow or require omitting the padding '=' signs: - * https://en.wikipedia.org/wiki/Base64#The_URL_applications - * @param base64url - */ -function addPaddingToBase64url(base64url) { - if (base64url.length % 4 === 2) - return base64url + "=="; - if (base64url.length % 4 === 3) - return base64url + "="; - if (base64url.length % 4 === 1) { - throw new TypeError("Illegal base64url string!"); - } - return base64url; -} -function convertBase64urlToBase64(b64url) { - if (!/^[-_A-Z0-9]*?={0,2}$/i.test(b64url)) { - // Contains characters not part of base64url spec. - throw new TypeError("Failed to decode base64url: invalid character"); - } - return addPaddingToBase64url(b64url).replace(/\-/g, "+").replace(/_/g, "/"); -} -function convertBase64ToBase64url(b64) { - return b64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); -} -/** - * Encodes a given ArrayBuffer or string into a base64url representation - * @param data - */ -export function encode(data) { - return convertBase64ToBase64url(base64.encode(data)); -} -/** - * Converts given base64url encoded data back to original - * @param b64url - */ -export function decode(b64url) { - return base64.decode(convertBase64urlToBase64(b64url)); -} diff --git a/_/node/connect/esm/jwt/mod.js b/_/node/connect/esm/jwt/mod.js deleted file mode 100644 index a100e44..0000000 --- a/_/node/connect/esm/jwt/mod.js +++ /dev/null @@ -1,14 +0,0 @@ -import * as base64url from '../deps/deno.land/std@0.180.0/encoding/base64url.js'; -import * as base64 from '../deps/deno.land/std@0.180.0/encoding/base64.js'; -const encoder = new TextEncoder(); -export default async function (header, payload, secret) { - const encodedHeader = base64url.encode(JSON.stringify(header)); - const encodedPayload = base64url.encode(JSON.stringify(payload)); - const data = encoder.encode(`${encodedHeader}.${encodedPayload}`); - const cleanedKey = secret.replace(/^\n?-----BEGIN PRIVATE KEY-----\n?|\n?-----END PRIVATE KEY-----\n?$/g, ''); - const decodedKey = base64.decode(cleanedKey).buffer; - const key = await crypto.subtle.importKey('pkcs8', decodedKey, { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, true, ['sign']); - const signature = await crypto.subtle.sign({ hash: { name: 'SHA-256' }, name: 'RSASSA-PKCS1-v1_5' }, key, data); - const encodedSignature = base64url.encode(signature); - return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; -} diff --git a/_/node/connect/esm/package.json b/_/node/connect/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/connect/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/connect/package-lock.json b/_/node/connect/package-lock.json deleted file mode 100644 index 0d45941..0000000 --- a/_/node/connect/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/connect", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/connect", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/connect/package.json b/_/node/connect/package.json deleted file mode 100644 index a7c38ff..0000000 --- a/_/node/connect/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/connect/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/connect", - "exports": { - ".": { - "import": "./esm/connect/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/decrypt/.npmignore b/_/node/decrypt/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/decrypt/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/decrypt/esm/mod.js b/_/node/decrypt/esm/mod.js deleted file mode 100644 index 04f2509..0000000 --- a/_/node/decrypt/esm/mod.js +++ /dev/null @@ -1,29 +0,0 @@ -const hexToBuffer = function (data) { - return Uint8Array.from(data.match(/.{2}/g) || [], x => parseInt(x, 16)).buffer; -}; -const bufferToString = function (data) { - return new TextDecoder().decode(data); -}; -const stringToBuffer = function (data) { - return new TextEncoder().encode(data); -}; -export default async function decrypt(data, secret, options) { - if (!data) - throw new Error(' data required'); - if (!secret) - throw new Error('secret required'); - const tag = options?.tag || 128; - const length = options?.length || 256; - const hash = options?.hash || 'SHA-256'; - const seperator = options?.seperator || '.'; - const algorithm = options?.algorithm || 'AES-GCM'; - const iterations = options?.iterations || 100_000; - const parts = data.split(seperator); - const body = hexToBuffer(parts[0]); - const salt = hexToBuffer(parts[1]); - const vector = hexToBuffer(parts[2]); - const imported = await crypto.subtle.importKey('raw', stringToBuffer(secret), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']); - const derived = await crypto.subtle.deriveKey({ name: 'PBKDF2', salt, iterations, hash }, imported, { name: algorithm, length }, true, ['decrypt']); - const decrypted = await crypto.subtle.decrypt({ iv: vector, name: algorithm, length, tagLength: tag }, derived, body); - return bufferToString(decrypted); -} diff --git a/_/node/decrypt/esm/package.json b/_/node/decrypt/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/decrypt/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/decrypt/package-lock.json b/_/node/decrypt/package-lock.json deleted file mode 100644 index 7825a08..0000000 --- a/_/node/decrypt/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/decrypt", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/decrypt", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/decrypt/package.json b/_/node/decrypt/package.json deleted file mode 100644 index aea9bff..0000000 --- a/_/node/decrypt/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/decrypt", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/encrypt/.npmignore b/_/node/encrypt/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/encrypt/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/encrypt/esm/mod.js b/_/node/encrypt/esm/mod.js deleted file mode 100644 index 98f43d9..0000000 --- a/_/node/encrypt/esm/mod.js +++ /dev/null @@ -1,28 +0,0 @@ -const randomBytes = function (size) { - return crypto.getRandomValues(new Uint8Array(size)).buffer; -}; -const bufferToHex = function (data) { - return Array.from(new Uint8Array(data)).map(x => x.toString(16).padStart(2, '0')).join(''); -}; -const stringToBuffer = function (data) { - return new TextEncoder().encode(data); -}; -export default async function encrypt(data, secret, options) { - if (!data) - throw new Error(' data required'); - if (!secret) - throw new Error('secret required'); - const tag = options?.tag || 128; - const length = options?.length || 256; - const hash = options?.hash || 'SHA-256'; - const seperator = options?.seperator || '.'; - const algorithm = options?.algorithm || 'AES-GCM'; - const iterations = options?.iterations || 100_000; - const salt = typeof options?.salt === 'number' ? randomBytes(options.salt) : randomBytes(32); - const vector = typeof options?.vector === 'number' ? randomBytes(options.vector) : randomBytes(16); - const body = stringToBuffer(data); - const imported = await crypto.subtle.importKey('raw', stringToBuffer(secret), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']); - const derived = await crypto.subtle.deriveKey({ name: 'PBKDF2', salt, iterations, hash }, imported, { name: algorithm, length }, true, ['encrypt']); - const encrypted = await crypto.subtle.encrypt({ iv: vector, name: algorithm, length, tagLength: tag }, derived, body); - return [bufferToHex(encrypted), bufferToHex(salt), bufferToHex(vector)].join(seperator); -} diff --git a/_/node/encrypt/esm/package.json b/_/node/encrypt/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/encrypt/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/encrypt/package-lock.json b/_/node/encrypt/package-lock.json deleted file mode 100644 index ef15088..0000000 --- a/_/node/encrypt/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/encrypt", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/encrypt", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/encrypt/package.json b/_/node/encrypt/package.json deleted file mode 100644 index c40b86b..0000000 --- a/_/node/encrypt/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/encrypt", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/hash/.npmignore b/_/node/hash/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/hash/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/hash/esm/mod.js b/_/node/hash/esm/mod.js deleted file mode 100644 index 549b475..0000000 --- a/_/node/hash/esm/mod.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @description Hash a string and return hex encoded string. - * @param {string} data - * @returns {Promise} - */ -export default async function hash(data) { - const encoded = new TextEncoder().encode(data); - const buffer = await crypto.subtle.digest('SHA-256', encoded); - return Array.from(new Uint8Array(buffer)).map(x => x.toString(16).padStart(2, '0')).join(''); -} diff --git a/_/node/hash/esm/package.json b/_/node/hash/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/hash/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/hash/package-lock.json b/_/node/hash/package-lock.json deleted file mode 100644 index e0127ba..0000000 --- a/_/node/hash/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/hash", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/hash", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/hash/package.json b/_/node/hash/package.json deleted file mode 100644 index 1f1b03e..0000000 --- a/_/node/hash/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/hash", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/identifier/.npmignore b/_/node/identifier/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/identifier/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/identifier/esm/mod.js b/_/node/identifier/esm/mod.js deleted file mode 100644 index 2dd283b..0000000 --- a/_/node/identifier/esm/mod.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function () { - return crypto.randomUUID(); -} diff --git a/_/node/identifier/esm/package.json b/_/node/identifier/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/identifier/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/identifier/package-lock.json b/_/node/identifier/package-lock.json deleted file mode 100644 index 8ba04cb..0000000 --- a/_/node/identifier/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/identifier", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/identifier", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/identifier/package.json b/_/node/identifier/package.json deleted file mode 100644 index 6d7b3e6..0000000 --- a/_/node/identifier/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/identifier", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/jwt/.npmignore b/_/node/jwt/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/jwt/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64.js b/_/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64.js deleted file mode 100644 index 75cb0b9..0000000 --- a/_/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64.js +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -/** - * {@linkcode encode} and {@linkcode decode} for - * [base64](https://en.wikipedia.org/wiki/Base64) encoding. - * - * This module is browser compatible. - * - * @example - * ```ts - * import { - * decode, - * encode, - * } from "https://deno.land/std@$STD_VERSION/encoding/base64.ts"; - * - * const b64Repr = "Zm9vYg=="; - * - * const binaryData = decode(b64Repr); - * console.log(binaryData); - * // => Uint8Array [ 102, 111, 111, 98 ] - * - * console.log(encode(binaryData)); - * // => Zm9vYg== - * ``` - * - * @module - */ -const base64abc = [ - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "+", - "/", -]; -/** - * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727 - * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation - * @param data - */ -export function encode(data) { - const uint8 = typeof data === "string" - ? new TextEncoder().encode(data) - : data instanceof Uint8Array - ? data - : new Uint8Array(data); - let result = "", i; - const l = uint8.length; - for (i = 2; i < l; i += 3) { - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)]; - result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)]; - result += base64abc[uint8[i] & 0x3f]; - } - if (i === l + 1) { - // 1 octet yet to write - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[(uint8[i - 2] & 0x03) << 4]; - result += "=="; - } - if (i === l) { - // 2 octets yet to write - result += base64abc[uint8[i - 2] >> 2]; - result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)]; - result += base64abc[(uint8[i - 1] & 0x0f) << 2]; - result += "="; - } - return result; -} -/** - * Decodes a given RFC4648 base64 encoded string - * @param b64 - */ -export function decode(b64) { - const binString = atob(b64); - const size = binString.length; - const bytes = new Uint8Array(size); - for (let i = 0; i < size; i++) { - bytes[i] = binString.charCodeAt(i); - } - return bytes; -} diff --git a/_/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64url.js b/_/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64url.js deleted file mode 100644 index 7262dc5..0000000 --- a/_/node/jwt/esm/deps/deno.land/std@0.180.0/encoding/base64url.js +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -/** - * {@linkcode encode} and {@linkcode decode} for - * [base64 URL safe](https://en.wikipedia.org/wiki/Base64#URL_applications) encoding. - * - * This module is browser compatible. - * - * @example - * ```ts - * import { - * decode, - * encode, - * } from "https://deno.land/std@$STD_VERSION/encoding/base64url.ts"; - * - * const binary = new TextEncoder().encode("foobar"); - * const encoded = encode(binary); - * console.log(encoded); - * // => "Zm9vYmFy" - * - * console.log(decode(encoded)); - * // => Uint8Array(6) [ 102, 111, 111, 98, 97, 114 ] - * ``` - * - * @module - */ -import * as base64 from "./base64.js"; -/* - * Some variants allow or require omitting the padding '=' signs: - * https://en.wikipedia.org/wiki/Base64#The_URL_applications - * @param base64url - */ -function addPaddingToBase64url(base64url) { - if (base64url.length % 4 === 2) - return base64url + "=="; - if (base64url.length % 4 === 3) - return base64url + "="; - if (base64url.length % 4 === 1) { - throw new TypeError("Illegal base64url string!"); - } - return base64url; -} -function convertBase64urlToBase64(b64url) { - if (!/^[-_A-Z0-9]*?={0,2}$/i.test(b64url)) { - // Contains characters not part of base64url spec. - throw new TypeError("Failed to decode base64url: invalid character"); - } - return addPaddingToBase64url(b64url).replace(/\-/g, "+").replace(/_/g, "/"); -} -function convertBase64ToBase64url(b64) { - return b64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); -} -/** - * Encodes a given ArrayBuffer or string into a base64url representation - * @param data - */ -export function encode(data) { - return convertBase64ToBase64url(base64.encode(data)); -} -/** - * Converts given base64url encoded data back to original - * @param b64url - */ -export function decode(b64url) { - return base64.decode(convertBase64urlToBase64(b64url)); -} diff --git a/_/node/jwt/esm/mod.js b/_/node/jwt/esm/mod.js deleted file mode 100644 index 13886bc..0000000 --- a/_/node/jwt/esm/mod.js +++ /dev/null @@ -1,14 +0,0 @@ -import * as base64url from './deps/deno.land/std@0.180.0/encoding/base64url.js'; -import * as base64 from './deps/deno.land/std@0.180.0/encoding/base64.js'; -const encoder = new TextEncoder(); -export default async function (header, payload, secret) { - const encodedHeader = base64url.encode(JSON.stringify(header)); - const encodedPayload = base64url.encode(JSON.stringify(payload)); - const data = encoder.encode(`${encodedHeader}.${encodedPayload}`); - const cleanedKey = secret.replace(/^\n?-----BEGIN PRIVATE KEY-----\n?|\n?-----END PRIVATE KEY-----\n?$/g, ''); - const decodedKey = base64.decode(cleanedKey).buffer; - const key = await crypto.subtle.importKey('pkcs8', decodedKey, { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, true, ['sign']); - const signature = await crypto.subtle.sign({ hash: { name: 'SHA-256' }, name: 'RSASSA-PKCS1-v1_5' }, key, data); - const encodedSignature = base64url.encode(signature); - return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; -} diff --git a/_/node/jwt/esm/package.json b/_/node/jwt/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/jwt/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/jwt/package-lock.json b/_/node/jwt/package-lock.json deleted file mode 100644 index c075dee..0000000 --- a/_/node/jwt/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/jwt", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/jwt", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/jwt/package.json b/_/node/jwt/package.json deleted file mode 100644 index c25b54b..0000000 --- a/_/node/jwt/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/jwt", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/password/.npmignore b/_/node/password/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/password/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/password/esm/mod.js b/_/node/password/esm/mod.js deleted file mode 100644 index ae01147..0000000 --- a/_/node/password/esm/mod.js +++ /dev/null @@ -1,43 +0,0 @@ -/* -https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf -"5.1 The Salt (S)" At least 16 bytes -"5.2 The Iteration Count (C)" Minimum 1,000 -*/ -const randomBytes = function (size) { - return crypto.getRandomValues(new Uint8Array(size)).buffer; -}; -const bufferToHex = function (data) { - return Array.from(new Uint8Array(data), x => x.toString(16).padStart(2, '0')).join(''); -}; -const stringToBuffer = function (data) { - return Uint8Array.from(data, x => x.charCodeAt(0)).buffer; -}; -const hexToBuffer = function (data) { - return Uint8Array.from(data.match(/.{2}/g) || [], x => parseInt(x, 16)).buffer; -}; -export const PasswordCreate = async function (secret, options) { - if (!secret) - throw new Error('secret required'); - const length = options?.length || 256; - const hash = options?.hash || 'SHA-256'; - const seperator = options?.seperator || '.'; - const iterations = options?.iterations || 100_000; - const salt = typeof options?.salt === 'string' ? stringToBuffer(options.salt) : - typeof options?.salt === 'number' ? randomBytes(options.salt) : - options?.salt instanceof ArrayBuffer ? options.salt : - randomBytes(32); - const imported = await crypto.subtle.importKey('raw', stringToBuffer(secret), { name: 'PBKDF2' }, false, ['deriveBits']); - const derived = await crypto.subtle.deriveBits({ name: 'PBKDF2', hash, salt, iterations }, imported, length); - return [bufferToHex(derived), bufferToHex(salt)].join(seperator); -}; -export const PasswordCompare = async function (secret, data, options) { - if (!data) - throw new Error('data argument required'); - if (!secret) - throw new Error('password argument required'); - const seperator = options?.seperator || '.'; - const salt = await hexToBuffer(data.split(seperator)[1]); - const computed = await PasswordCreate(secret, { salt, ...options }); - return data === computed; -}; -export default { create: PasswordCreate, compare: PasswordCompare }; diff --git a/_/node/password/esm/package.json b/_/node/password/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/password/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/password/package-lock.json b/_/node/password/package-lock.json deleted file mode 100644 index 0166810..0000000 --- a/_/node/password/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/password", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/password", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/password/package.json b/_/node/password/package.json deleted file mode 100644 index fa75d0e..0000000 --- a/_/node/password/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/password", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/secret/.npmignore b/_/node/secret/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/secret/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/secret/esm/mod.js b/_/node/secret/esm/mod.js deleted file mode 100644 index d6fff19..0000000 --- a/_/node/secret/esm/mod.js +++ /dev/null @@ -1 +0,0 @@ -export default (size) => Array.from(crypto.getRandomValues(new Uint8Array(size || 64)), x => x.toString(16).padStart(2, '0').slice(-2)).join(''); diff --git a/_/node/secret/esm/package.json b/_/node/secret/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/secret/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/secret/package-lock.json b/_/node/secret/package-lock.json deleted file mode 100644 index 912abe4..0000000 --- a/_/node/secret/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/secret", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/secret", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/secret/package.json b/_/node/secret/package.json deleted file mode 100644 index f2e04d0..0000000 --- a/_/node/secret/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/secret", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/_/node/username/.npmignore b/_/node/username/.npmignore deleted file mode 100644 index d54ff4e..0000000 --- a/_/node/username/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src/ -test_runner.js -yarn.lock -pnpm-lock.yaml diff --git a/_/node/username/esm/mod.js b/_/node/username/esm/mod.js deleted file mode 100644 index ba6a56b..0000000 --- a/_/node/username/esm/mod.js +++ /dev/null @@ -1,13 +0,0 @@ -const stringToHash = function (data) { - return crypto.subtle.digest('SHA-256', new TextEncoder().encode(data)); -}; -const bufferToString = function (data) { - return Array.from(new Uint8Array(data), x => x.toString(16).padStart(2, '0')).join(''); -}; -export async function UsernameCreate(text) { - return bufferToString(await stringToHash(text)); -} -export async function UsernameCompare(text, hash) { - return bufferToString(await stringToHash(text)) === hash; -} -export default { create: UsernameCreate, compare: UsernameCompare }; diff --git a/_/node/username/esm/package.json b/_/node/username/esm/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/_/node/username/esm/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/_/node/username/package-lock.json b/_/node/username/package-lock.json deleted file mode 100644 index 74e82ce..0000000 --- a/_/node/username/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@xeaone/tool/username", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@xeaone/tool/username", - "version": "2.0.0", - "devDependencies": {} - } - } -} diff --git a/_/node/username/package.json b/_/node/username/package.json deleted file mode 100644 index 2397bb2..0000000 --- a/_/node/username/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "module": "./esm/mod.js", - "version": "2.0.0", - "name": "@xeaone/tool/username", - "exports": { - ".": { - "import": "./esm/mod.js" - } - }, - "dependencies": {}, - "devDependencies": {} -} \ No newline at end of file diff --git a/build.ts b/build.ts index 92e7f7d..f926af0 100644 --- a/build.ts +++ b/build.ts @@ -1,10 +1,10 @@ // import { build, emptyDir } from 'https://deno.land/x/dnt@0.22.0/mod.ts'; // import { ts } from 'https://deno.land/x/ts_morph@14.0.0/mod.ts'; -import { build, stop } from 'https://deno.land/x/esbuild@v0.19.0/mod.js'; -import http from 'https://deno.land/x/esbuild_plugin_http_fetch@v1.0.2/index.js'; +import { build, stop } from 'https://deno.land/x/esbuild@v0.20.0/mod.js'; +import http from 'https://deno.land/x/esbuild_plugin_http_fetch@v1.0.3/index.js'; -import pkg from './package.json' assert { type: 'json' }; +import pkg from './package.json' with { type: 'json' }; const { writeTextFile } = Deno; diff --git a/executable/publish.ts b/executable/publish.ts index 563547f..590416a 100644 --- a/executable/publish.ts +++ b/executable/publish.ts @@ -1,9 +1,9 @@ #!/usr/bin/env -S deno run --allow-read --allow-write -import { resolve } from 'https://deno.land/std@0.204.0/path/resolve.ts'; -import { blue, red } from 'https://deno.land/std@0.204.0/fmt/colors.ts'; -import * as semver from 'https://deno.land/std@0.204.0/semver/mod.ts'; -import { parse } from 'https://deno.land/std@0.204.0/flags/mod.ts'; +import { resolve } from 'https://deno.land/std@0.213.0/path/resolve.ts'; +import { blue, red } from 'https://deno.land/std@0.213.0/fmt/colors.ts'; +import * as semver from 'https://deno.land/std@0.213.0/semver/mod.ts'; +import { parseArgs } from 'https://deno.land/std@0.213.0/cli/parse_args.ts'; import versionImport from '../version.ts'; /** @@ -48,7 +48,7 @@ const helpText = ` `; export const publish = async function () { - const options = parse(Deno.args, { + const options = parseArgs(Deno.args, { boolean: [ 'git', 'tag', diff --git a/jwt/mod.ts b/jwt/mod.ts index 19541cc..e2e106e 100644 --- a/jwt/mod.ts +++ b/jwt/mod.ts @@ -1,5 +1,5 @@ -import * as base64url from 'https://deno.land/std@0.204.0/encoding/base64url.ts'; -import * as base64 from 'https://deno.land/std@0.204.0/encoding/base64.ts'; +import { encodeBase64Url } from 'https://deno.land/std@0.213.0/encoding/base64url.ts'; +import { decodeBase64 } from 'https://deno.land/std@0.213.0/encoding/base64.ts'; export type Header = { alg: 'RS256'; @@ -21,15 +21,15 @@ export default async function ( payload: Payload, secret: string, ): Promise { - const encodedHeader = base64url.encode(JSON.stringify(header)); - const encodedPayload = base64url.encode(JSON.stringify(payload)); + const encodedHeader = encodeBase64Url(JSON.stringify(header)); + const encodedPayload = encodeBase64Url(JSON.stringify(payload)); const data = encoder.encode(`${encodedHeader}.${encodedPayload}`); const cleanedKey = secret.replace( /^\n?-----BEGIN PRIVATE KEY-----\n?|\n?-----END PRIVATE KEY-----\n?$/g, '', ); - const decodedKey = base64.decode(cleanedKey).buffer; + const decodedKey = decodeBase64(cleanedKey).buffer; const key = await crypto.subtle.importKey( 'pkcs8', decodedKey, @@ -43,7 +43,7 @@ export default async function ( key, data, ); - const encodedSignature = base64url.encode(signature); + const encodedSignature = encodeBase64Url(signature); return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; } diff --git a/module/connect/mod.js b/module/connect/mod.js index bdcfe52..4ad0073 100644 --- a/module/connect/mod.js +++ b/module/connect/mod.js @@ -7,7 +7,7 @@ */ -// http-fetch:https://deno.land/std@0.204.0/encoding/_util.ts +// http-fetch:https://deno.land/std@0.213.0/encoding/_util.ts var encoder = new TextEncoder(); function getTypeName(value) { const type = typeof value; @@ -32,7 +32,7 @@ function validateBinaryLike(source) { ); } -// http-fetch:https://deno.land/std@0.204.0/encoding/base64.ts +// http-fetch:https://deno.land/std@0.213.0/encoding/base64.ts var base64abc = [ "A", "B", @@ -99,7 +99,6 @@ var base64abc = [ "+", "/" ]; -var decode = decodeBase64; function encodeBase64(data) { const uint8 = validateBinaryLike(data); let result = "", i; @@ -133,11 +132,10 @@ function decodeBase64(b64) { return bytes; } -// http-fetch:https://deno.land/std@0.204.0/encoding/base64url.ts +// http-fetch:https://deno.land/std@0.213.0/encoding/base64url.ts function convertBase64ToBase64url(b64) { return b64.endsWith("=") ? b64.endsWith("==") ? b64.replace(/\+/g, "-").replace(/\//g, "_").slice(0, -2) : b64.replace(/\+/g, "-").replace(/\//g, "_").slice(0, -1) : b64.replace(/\+/g, "-").replace(/\//g, "_"); } -var encode = encodeBase64Url; function encodeBase64Url(data) { return convertBase64ToBase64url(encodeBase64(data)); } @@ -145,14 +143,14 @@ function encodeBase64Url(data) { // jwt/mod.ts var encoder2 = new TextEncoder(); async function mod_default(header, payload, secret) { - const encodedHeader = encode(JSON.stringify(header)); - const encodedPayload = encode(JSON.stringify(payload)); + const encodedHeader = encodeBase64Url(JSON.stringify(header)); + const encodedPayload = encodeBase64Url(JSON.stringify(payload)); const data = encoder2.encode(`${encodedHeader}.${encodedPayload}`); const cleanedKey = secret.replace( /^\n?-----BEGIN PRIVATE KEY-----\n?|\n?-----END PRIVATE KEY-----\n?$/g, "" ); - const decodedKey = decode(cleanedKey).buffer; + const decodedKey = decodeBase64(cleanedKey).buffer; const key = await crypto.subtle.importKey( "pkcs8", decodedKey, @@ -165,7 +163,7 @@ async function mod_default(header, payload, secret) { key, data ); - const encodedSignature = encode(signature); + const encodedSignature = encodeBase64Url(signature); return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; } diff --git a/module/connect/mod.js.map b/module/connect/mod.js.map index b31f5db..b70b303 100644 --- a/module/connect/mod.js.map +++ b/module/connect/mod.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["http-fetch:https://deno.land/std@0.204.0/encoding/_util.ts", "http-fetch:https://deno.land/std@0.204.0/encoding/base64.ts", "http-fetch:https://deno.land/std@0.204.0/encoding/base64url.ts", "../../jwt/mod.ts", "../../connect/mod.ts"], - "sourcesContent": ["// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.\n\nconst encoder = new TextEncoder();\n\nfunction getTypeName(value: unknown): string {\n const type = typeof value;\n if (type !== \"object\") {\n return type;\n } else if (value === null) {\n return \"null\";\n } else {\n return value?.constructor?.name ?? \"object\";\n }\n}\n\nexport function validateBinaryLike(source: unknown): Uint8Array {\n if (typeof source === \"string\") {\n return encoder.encode(source);\n } else if (source instanceof Uint8Array) {\n return source;\n } else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n throw new TypeError(\n `The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type ${\n getTypeName(source)\n }.`,\n );\n}\n", "// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\nimport { validateBinaryLike } from \"./_util.ts\";\n\n/**\n * {@linkcode encodeBase64} and {@linkcode decodeBase64} for\n * [base64](https://en.wikipedia.org/wiki/Base64) encoding.\n *\n * This module is browser compatible.\n *\n * @example\n * ```ts\n * import {\n * decodeBase64,\n * encodeBase64,\n * } from \"https://deno.land/std@$STD_VERSION/encoding/base64.ts\";\n *\n * const b64Repr = \"Zm9vYg==\";\n *\n * const binaryData = decodeBase64(b64Repr);\n * console.log(binaryData);\n * // => Uint8Array [ 102, 111, 111, 98 ]\n *\n * console.log(encodeBase64(binaryData));\n * // => Zm9vYg==\n * ```\n *\n * @module\n */\n\nconst base64abc = [\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\",\n \"a\",\n \"b\",\n \"c\",\n \"d\",\n \"e\",\n \"f\",\n \"g\",\n \"h\",\n \"i\",\n \"j\",\n \"k\",\n \"l\",\n \"m\",\n \"n\",\n \"o\",\n \"p\",\n \"q\",\n \"r\",\n \"s\",\n \"t\",\n \"u\",\n \"v\",\n \"w\",\n \"x\",\n \"y\",\n \"z\",\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"+\",\n \"/\",\n];\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `encodeBase64` instead.\n *\n * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation\n * @param data\n */\nexport const encode = encodeBase64;\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `decodeBase64` instead.\n *\n * Decodes a given RFC4648 base64 encoded string\n * @param b64\n */\nexport const decode = decodeBase64;\n\n/**\n * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation\n */\nexport function encodeBase64(data: ArrayBuffer | Uint8Array | string): string {\n // CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n const uint8 = validateBinaryLike(data);\n let result = \"\",\n i;\n const l = uint8.length;\n for (i = 2; i < l; i += 3) {\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)];\n result += base64abc[uint8[i] & 0x3f];\n }\n if (i === l + 1) {\n // 1 octet yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[(uint8[i - 2] & 0x03) << 4];\n result += \"==\";\n }\n if (i === l) {\n // 2 octets yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[(uint8[i - 1] & 0x0f) << 2];\n result += \"=\";\n }\n return result;\n}\n\n/**\n * Decodes a given RFC4648 base64 encoded string\n */\nexport function decodeBase64(b64: string): Uint8Array {\n const binString = atob(b64);\n const size = binString.length;\n const bytes = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n bytes[i] = binString.charCodeAt(i);\n }\n return bytes;\n}\n", "// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\n/**\n * {@linkcode encodeBase64Url} and {@linkcode decodeBase64Url} for\n * [base64 URL safe](https://en.wikipedia.org/wiki/Base64#URL_applications) encoding.\n *\n * This module is browser compatible.\n *\n * @example\n * ```ts\n * import {\n * decodeBase64Url,\n * encodeBase64Url,\n * } from \"https://deno.land/std@$STD_VERSION/encoding/base64url.ts\";\n *\n * const binary = new TextEncoder().encode(\"foobar\");\n * const encoded = encodeBase64Url(binary);\n * console.log(encoded);\n * // => \"Zm9vYmFy\"\n *\n * console.log(decodeBase64Url(encoded));\n * // => Uint8Array(6) [ 102, 111, 111, 98, 97, 114 ]\n * ```\n *\n * @module\n */\n\nimport * as base64 from \"./base64.ts\";\n\n/*\n * Some variants allow or require omitting the padding '=' signs:\n * https://en.wikipedia.org/wiki/Base64#The_URL_applications\n * @param base64url\n */\nfunction addPaddingToBase64url(base64url: string): string {\n if (base64url.length % 4 === 2) return base64url + \"==\";\n if (base64url.length % 4 === 3) return base64url + \"=\";\n if (base64url.length % 4 === 1) {\n throw new TypeError(\"Illegal base64url string!\");\n }\n return base64url;\n}\n\nfunction convertBase64urlToBase64(b64url: string): string {\n if (!/^[-_A-Z0-9]*?={0,2}$/i.test(b64url)) {\n // Contains characters not part of base64url spec.\n throw new TypeError(\"Failed to decode base64url: invalid character\");\n }\n return addPaddingToBase64url(b64url).replace(/\\-/g, \"+\").replace(/_/g, \"/\");\n}\n\nfunction convertBase64ToBase64url(b64: string) {\n return b64.endsWith(\"=\")\n ? b64.endsWith(\"==\")\n ? b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -2)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -1)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `encodeBase64Url` instead.\n *\n * Encodes a given ArrayBuffer or string into a base64url representation\n * @param data\n */\nexport const encode = encodeBase64Url;\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `decodeBase64Url` instead.\n *\n * Converts given base64url encoded data back to original\n * @param b64url\n */\nexport const decode = decodeBase64Url;\n\n/**\n * Encodes a given ArrayBuffer or string into a base64url representation\n * @param data\n */\nexport function encodeBase64Url(\n data: ArrayBuffer | Uint8Array | string,\n): string {\n return convertBase64ToBase64url(base64.encodeBase64(data));\n}\n\n/**\n * Converts given base64url encoded data back to original\n * @param b64url\n */\nexport function decodeBase64Url(b64url: string): Uint8Array {\n return base64.decodeBase64(convertBase64urlToBase64(b64url));\n}\n", "import * as base64url from 'https://deno.land/std@0.204.0/encoding/base64url.ts';\nimport * as base64 from 'https://deno.land/std@0.204.0/encoding/base64.ts';\n\nexport type Header = {\n alg: 'RS256';\n [key: string]: unknown;\n};\n\nexport type Payload = {\n iss: string;\n aud: string;\n exp: number;\n iat: number;\n scope: string;\n};\n\nconst encoder = new TextEncoder();\n\nexport default async function (\n header: Header,\n payload: Payload,\n secret: string,\n): Promise {\n const encodedHeader = base64url.encode(JSON.stringify(header));\n const encodedPayload = base64url.encode(JSON.stringify(payload));\n const data = encoder.encode(`${encodedHeader}.${encodedPayload}`);\n\n const cleanedKey = secret.replace(\n /^\\n?-----BEGIN PRIVATE KEY-----\\n?|\\n?-----END PRIVATE KEY-----\\n?$/g,\n '',\n );\n const decodedKey = base64.decode(cleanedKey).buffer;\n const key = await crypto.subtle.importKey(\n 'pkcs8',\n decodedKey,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n\n const signature = await crypto.subtle.sign(\n { hash: { name: 'SHA-256' }, name: 'RSASSA-PKCS1-v1_5' },\n key,\n data,\n );\n const encodedSignature = base64url.encode(signature);\n\n return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;\n}\n", "import jwt from '../jwt/mod.ts';\n\n// https://developers.google.com/identity/protocols/oauth2/service-account\ntype ServiceAccountCredentials = {\n type: 'service_account';\n project_id: string;\n private_key_id: string;\n private_key: string;\n client_email: string;\n client_id: string;\n auth_uri?: string;\n token_uri?: string;\n client_x509_cert_url?: string;\n auth_provider_x509_cert_url?: string;\n};\n\n// https://developers.google.com/identity/protocols/oauth2/web-server#offline\ntype ApplicationDefaultCredentials = {\n type: 'authorized_user';\n client_id: string;\n client_secret: string;\n grant_type: string;\n refresh_token: string;\n};\n\ntype Credential =\n | 'meta'\n | 'application'\n | ApplicationDefaultCredentials\n | ServiceAccountCredentials;\n\ntype Options = {\n project?: string;\n timeout?: number;\n attempts?: number;\n // credential?: Credential;\n serviceAccountCredentials?: ServiceAccountCredentials;\n applicationDefaultCredentials?: ApplicationDefaultCredentials;\n};\n\nclass Google {\n #token?: string;\n #expires?: number;\n #project?: string;\n #attempts = 10;\n #timeout = 1000;\n #serviceAccountCredentials?: ServiceAccountCredentials;\n #applicationDefaultCredentials?: ApplicationDefaultCredentials;\n\n constructor(options?: Options) {\n this.#project = options?.project;\n this.#timeout = options?.timeout ?? this.#timeout;\n this.#attempts = options?.attempts ?? this.#attempts;\n this.#serviceAccountCredentials = options?.serviceAccountCredentials;\n this.#applicationDefaultCredentials = options?.applicationDefaultCredentials;\n }\n\n async #auth(attempts: number) {\n if (this.#expires && this.#expires >= Date.now()) return;\n\n let response;\n if (this.#applicationDefaultCredentials) {\n response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n signal: AbortSignal.timeout(this.#timeout * attempts),\n body: new URLSearchParams(this.#applicationDefaultCredentials),\n });\n } else if (this.#serviceAccountCredentials) {\n const { client_email, private_key } = this.#serviceAccountCredentials;\n const iss = client_email;\n const iat = Math.round(Date.now() / 1000);\n const exp = iat + (30 * 60);\n const aud = 'https://oauth2.googleapis.com/token';\n const scope = 'https://www.googleapis.com/auth/datastore';\n const assertion = await jwt({ typ: 'JWT', alg: 'RS256' }, { exp, iat, iss, aud, scope }, private_key);\n const grant_type = 'urn:ietf:params:oauth:grant-type:jwt-bearer';\n response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n body: new URLSearchParams({ assertion, grant_type }),\n signal: AbortSignal.timeout(this.#timeout * attempts),\n });\n } else {\n try {\n response = await fetch(\n 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token',\n {\n method: 'GET',\n headers: { 'Metadata-Flavor': 'Google' },\n signal: AbortSignal.timeout(this.#timeout * attempts),\n },\n );\n } catch (error) {\n if (error?.name !== 'TimeoutError') {\n throw new Error('credentials required');\n } else {\n throw new Error(error.message, { cause: error });\n }\n }\n }\n\n if (response.status !== 200) {\n throw new Error(`${response.status} ${response.statusText} ${await response.text()}`);\n }\n\n const result = await response.json();\n\n this.#token = result.access_token;\n this.#expires = Date.now() + (result.expires_in * 1000);\n }\n\n applicationDefault(\n applicationDefaultCredentials: ApplicationDefaultCredentials,\n ) {\n this.#applicationDefaultCredentials = {\n ...applicationDefaultCredentials,\n grant_type: 'refresh_token',\n };\n return this;\n }\n\n serviceAccount(serviceAccountCredentials: ServiceAccountCredentials) {\n this.#serviceAccountCredentials = { ...serviceAccountCredentials };\n return this;\n }\n\n /**\n * @description\n * Initialize application default credentials with `gcloud auth application-default login`.\n * This file should be created and will be used as the application credential:\n * - Windows: %APPDATA%\\gcloud\\application_default_credentials.json\n * - Linux/Mac: $HOME/.config/gcloud/application_default_credentials.json\n * @param credential\n */\n credential(credential: Credential) {\n // const command = await new Deno.Command('gcloud', {\n // args: ['auth', 'application-default', 'print-access-token'],\n // stderr: 'inherit',\n // }).output();\n // result = {\n // expires_in: 3599,\n // access_token: new TextDecoder().decode(command.stdout),\n // };\n\n if (credential === 'meta') {\n return;\n } else if (credential === 'application') {\n let file;\n\n try {\n const prefix = Deno.build.os === 'windows' ? Deno.env.get('APPDATA') : `${Deno.env.get('HOME')}/.config`;\n file = Deno.readTextFileSync(\n `${prefix}/gcloud/application_default_credentials.json`,\n );\n } catch {\n return;\n }\n\n const data = JSON.parse(file);\n this.#applicationDefaultCredentials = {\n ...data,\n grant_type: 'refresh_token',\n };\n } else if (credential.type === 'authorized_user') {\n this.applicationDefault(credential as ApplicationDefaultCredentials);\n } else if (credential.type === 'service_account') {\n this.serviceAccount(credential as ServiceAccountCredentials);\n } else {\n throw new Error('credential option required');\n }\n }\n\n /**\n * @description\n * @param {String} data\n * @returns {Google}\n */\n project(data: string): this {\n this.#project = data;\n return this;\n }\n\n /**\n * @description Sets the max request time. Defaults to 1000ms.\n * @param {Number} timeout The milliseconds for request a timeout.\n * @return {Google}\n */\n timeout(timeout: number): this {\n this.#timeout = timeout;\n return this;\n }\n\n /**\n * @description Sets the max retry atttempts after request timeout. Defaults to 5.\n * @param {Number} attempts The amount of attempts for timeout retries.\n * @return {Google}\n */\n attempts(attempts: number): this {\n this.#attempts = attempts;\n return this;\n }\n\n async fetch(input: string | URL | Request, init?: RequestInit, attempts?: number): Promise {\n attempts = attempts || 1;\n try {\n if (!this.project) {\n const projectResponse = await fetch(\n 'http://metadata.google.internal/computeMetadata/v1/project/project-id',\n {\n method: 'GET',\n headers: { 'Metadata-Flavor': 'Google' },\n signal: AbortSignal.timeout(this.#timeout * attempts),\n },\n );\n\n this.#project = await projectResponse.text();\n }\n\n if (!this.#project) throw new Error('project required');\n\n await this.#auth(attempts);\n\n init = init ?? {};\n init.signal = AbortSignal.timeout(this.#timeout * attempts);\n\n const request = new Request(input, init);\n\n if (this.#token) request.headers.set('Authorization', `Bearer ${this.#token}`);\n\n const response = await fetch(request);\n\n return response;\n } catch (error) {\n if (error?.name === 'TimeoutError' && attempts < this.#attempts) {\n return this.fetch(input, init, attempts + 1);\n } else if (error?.name === 'TimeoutError') {\n return new Response(undefined, { status: 408, headers: { connection: 'close' } });\n } else {\n throw new Error(error.message, { cause: error });\n }\n }\n }\n}\n\nexport default {\n Google,\n};\n"], - "mappings": "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", + "sources": ["http-fetch:https://deno.land/std@0.213.0/encoding/_util.ts", "http-fetch:https://deno.land/std@0.213.0/encoding/base64.ts", "http-fetch:https://deno.land/std@0.213.0/encoding/base64url.ts", "../../jwt/mod.ts", "../../connect/mod.ts"], + "sourcesContent": ["// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.\n\nconst encoder = new TextEncoder();\n\nfunction getTypeName(value: unknown): string {\n const type = typeof value;\n if (type !== \"object\") {\n return type;\n } else if (value === null) {\n return \"null\";\n } else {\n return value?.constructor?.name ?? \"object\";\n }\n}\n\nexport function validateBinaryLike(source: unknown): Uint8Array {\n if (typeof source === \"string\") {\n return encoder.encode(source);\n } else if (source instanceof Uint8Array) {\n return source;\n } else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n throw new TypeError(\n `The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type ${\n getTypeName(source)\n }.`,\n );\n}\n", "// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\nimport { validateBinaryLike } from \"./_util.ts\";\n\n/**\n * Utilities for\n * [base64]{@link https://datatracker.ietf.org/doc/html/rfc4648#section-4}\n * encoding and decoding.\n *\n * This module is browser compatible.\n *\n * @module\n */\n\nconst base64abc = [\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\",\n \"a\",\n \"b\",\n \"c\",\n \"d\",\n \"e\",\n \"f\",\n \"g\",\n \"h\",\n \"i\",\n \"j\",\n \"k\",\n \"l\",\n \"m\",\n \"n\",\n \"o\",\n \"p\",\n \"q\",\n \"r\",\n \"s\",\n \"t\",\n \"u\",\n \"v\",\n \"w\",\n \"x\",\n \"y\",\n \"z\",\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"+\",\n \"/\",\n];\n\n/**\n * Converts data into a base64-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-4}\n *\n * @example\n * ```ts\n * import { encodeBase64 } from \"https://deno.land/std@$STD_VERSION/encoding/base64.ts\";\n *\n * encodeBase64(\"foobar\"); // \"Zm9vYmFy\"\n * ```\n */\nexport function encodeBase64(data: ArrayBuffer | Uint8Array | string): string {\n // CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n const uint8 = validateBinaryLike(data);\n let result = \"\",\n i;\n const l = uint8.length;\n for (i = 2; i < l; i += 3) {\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)];\n result += base64abc[uint8[i] & 0x3f];\n }\n if (i === l + 1) {\n // 1 octet yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[(uint8[i - 2] & 0x03) << 4];\n result += \"==\";\n }\n if (i === l) {\n // 2 octets yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[(uint8[i - 1] & 0x0f) << 2];\n result += \"=\";\n }\n return result;\n}\n\n/**\n * Decodes a base64-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-4}\n *\n * @example\n * ```ts\n * import { encodeBase64 } from \"https://deno.land/std@$STD_VERSION/encoding/base64.ts\";\n *\n * encodeBase64(\"foobar\"); // \"Zm9vYmFy\"\n * ```\n */\nexport function decodeBase64(b64: string): Uint8Array {\n const binString = atob(b64);\n const size = binString.length;\n const bytes = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n bytes[i] = binString.charCodeAt(i);\n }\n return bytes;\n}\n", "// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * [base64url]{@link https://datatracker.ietf.org/doc/html/rfc4648#section-5}\n * encoding and decoding.\n *\n * This module is browser compatible.\n *\n * @module\n */\n\nimport * as base64 from \"./base64.ts\";\n\n/*\n * Some variants allow or require omitting the padding '=' signs:\n * https://en.wikipedia.org/wiki/Base64#The_URL_applications\n * @param base64url\n */\nfunction addPaddingToBase64url(base64url: string): string {\n if (base64url.length % 4 === 2) return base64url + \"==\";\n if (base64url.length % 4 === 3) return base64url + \"=\";\n if (base64url.length % 4 === 1) {\n throw new TypeError(\"Illegal base64url string!\");\n }\n return base64url;\n}\n\nfunction convertBase64urlToBase64(b64url: string): string {\n if (!/^[-_A-Z0-9]*?={0,2}$/i.test(b64url)) {\n // Contains characters not part of base64url spec.\n throw new TypeError(\"Failed to decode base64url: invalid character\");\n }\n return addPaddingToBase64url(b64url).replace(/\\-/g, \"+\").replace(/_/g, \"/\");\n}\n\nfunction convertBase64ToBase64url(b64: string) {\n return b64.endsWith(\"=\")\n ? b64.endsWith(\"==\")\n ? b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -2)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -1)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n/**\n * Convert data into a base64url-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-5}\n *\n * @example\n * ```ts\n * import { encodeBase64Url } from \"https://deno.land/std@$STD_VERSION/encoding/base64url.ts\";\n *\n * encodeBase64Url(new TextEncoder().encode(\"foobar\")); // \"Zm9vYmFy\"\n * ```\n */\nexport function encodeBase64Url(\n data: ArrayBuffer | Uint8Array | string,\n): string {\n return convertBase64ToBase64url(base64.encodeBase64(data));\n}\n\n/**\n * Decodes a given base64url-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-5}\n *\n * @example\n * ```ts\n * import { decodeBase64Url } from \"https://deno.land/std@$STD_VERSION/encoding/base64url.ts\";\n *\n * decodeBase64Url(\"Zm9vYmFy\"); // Uint8Array(6) [ 102, 111, 111, 98, 97, 114 ]\n * ```\n */\nexport function decodeBase64Url(b64url: string): Uint8Array {\n return base64.decodeBase64(convertBase64urlToBase64(b64url));\n}\n", "import { encodeBase64Url } from 'https://deno.land/std@0.213.0/encoding/base64url.ts';\nimport { decodeBase64 } from 'https://deno.land/std@0.213.0/encoding/base64.ts';\n\nexport type Header = {\n alg: 'RS256';\n [key: string]: unknown;\n};\n\nexport type Payload = {\n iss: string;\n aud: string;\n exp: number;\n iat: number;\n scope: string;\n};\n\nconst encoder = new TextEncoder();\n\nexport default async function (\n header: Header,\n payload: Payload,\n secret: string,\n): Promise {\n const encodedHeader = encodeBase64Url(JSON.stringify(header));\n const encodedPayload = encodeBase64Url(JSON.stringify(payload));\n const data = encoder.encode(`${encodedHeader}.${encodedPayload}`);\n\n const cleanedKey = secret.replace(\n /^\\n?-----BEGIN PRIVATE KEY-----\\n?|\\n?-----END PRIVATE KEY-----\\n?$/g,\n '',\n );\n const decodedKey = decodeBase64(cleanedKey).buffer;\n const key = await crypto.subtle.importKey(\n 'pkcs8',\n decodedKey,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n\n const signature = await crypto.subtle.sign(\n { hash: { name: 'SHA-256' }, name: 'RSASSA-PKCS1-v1_5' },\n key,\n data,\n );\n const encodedSignature = encodeBase64Url(signature);\n\n return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;\n}\n", "import jwt from '../jwt/mod.ts';\n\n// https://developers.google.com/identity/protocols/oauth2/service-account\ntype ServiceAccountCredentials = {\n type: 'service_account';\n project_id: string;\n private_key_id: string;\n private_key: string;\n client_email: string;\n client_id: string;\n auth_uri?: string;\n token_uri?: string;\n client_x509_cert_url?: string;\n auth_provider_x509_cert_url?: string;\n};\n\n// https://developers.google.com/identity/protocols/oauth2/web-server#offline\ntype ApplicationDefaultCredentials = {\n type: 'authorized_user';\n client_id: string;\n client_secret: string;\n grant_type: string;\n refresh_token: string;\n};\n\ntype Credential =\n | 'meta'\n | 'application'\n | ApplicationDefaultCredentials\n | ServiceAccountCredentials;\n\ntype Options = {\n project?: string;\n timeout?: number;\n attempts?: number;\n // credential?: Credential;\n serviceAccountCredentials?: ServiceAccountCredentials;\n applicationDefaultCredentials?: ApplicationDefaultCredentials;\n};\n\nclass Google {\n #token?: string;\n #expires?: number;\n #project?: string;\n #attempts = 10;\n #timeout = 1000;\n #serviceAccountCredentials?: ServiceAccountCredentials;\n #applicationDefaultCredentials?: ApplicationDefaultCredentials;\n\n constructor(options?: Options) {\n this.#project = options?.project;\n this.#timeout = options?.timeout ?? this.#timeout;\n this.#attempts = options?.attempts ?? this.#attempts;\n this.#serviceAccountCredentials = options?.serviceAccountCredentials;\n this.#applicationDefaultCredentials = options?.applicationDefaultCredentials;\n }\n\n async #auth(attempts: number) {\n if (this.#expires && this.#expires >= Date.now()) return;\n\n let response;\n if (this.#applicationDefaultCredentials) {\n response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n signal: AbortSignal.timeout(this.#timeout * attempts),\n body: new URLSearchParams(this.#applicationDefaultCredentials),\n });\n } else if (this.#serviceAccountCredentials) {\n const { client_email, private_key } = this.#serviceAccountCredentials;\n const iss = client_email;\n const iat = Math.round(Date.now() / 1000);\n const exp = iat + (30 * 60);\n const aud = 'https://oauth2.googleapis.com/token';\n const scope = 'https://www.googleapis.com/auth/datastore';\n const assertion = await jwt({ typ: 'JWT', alg: 'RS256' }, { exp, iat, iss, aud, scope }, private_key);\n const grant_type = 'urn:ietf:params:oauth:grant-type:jwt-bearer';\n response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n body: new URLSearchParams({ assertion, grant_type }),\n signal: AbortSignal.timeout(this.#timeout * attempts),\n });\n } else {\n try {\n response = await fetch(\n 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token',\n {\n method: 'GET',\n headers: { 'Metadata-Flavor': 'Google' },\n signal: AbortSignal.timeout(this.#timeout * attempts),\n },\n );\n } catch (error) {\n if (error?.name !== 'TimeoutError') {\n throw new Error('credentials required');\n } else {\n throw new Error(error.message, { cause: error });\n }\n }\n }\n\n if (response.status !== 200) {\n throw new Error(`${response.status} ${response.statusText} ${await response.text()}`);\n }\n\n const result = await response.json();\n\n this.#token = result.access_token;\n this.#expires = Date.now() + (result.expires_in * 1000);\n }\n\n applicationDefault(\n applicationDefaultCredentials: ApplicationDefaultCredentials,\n ) {\n this.#applicationDefaultCredentials = {\n ...applicationDefaultCredentials,\n grant_type: 'refresh_token',\n };\n return this;\n }\n\n serviceAccount(serviceAccountCredentials: ServiceAccountCredentials) {\n this.#serviceAccountCredentials = { ...serviceAccountCredentials };\n return this;\n }\n\n /**\n * @description\n * Initialize application default credentials with `gcloud auth application-default login`.\n * This file should be created and will be used as the application credential:\n * - Windows: %APPDATA%\\gcloud\\application_default_credentials.json\n * - Linux/Mac: $HOME/.config/gcloud/application_default_credentials.json\n * @param credential\n */\n credential(credential: Credential) {\n // const command = await new Deno.Command('gcloud', {\n // args: ['auth', 'application-default', 'print-access-token'],\n // stderr: 'inherit',\n // }).output();\n // result = {\n // expires_in: 3599,\n // access_token: new TextDecoder().decode(command.stdout),\n // };\n\n if (credential === 'meta') {\n return;\n } else if (credential === 'application') {\n let file;\n\n try {\n const prefix = Deno.build.os === 'windows' ? Deno.env.get('APPDATA') : `${Deno.env.get('HOME')}/.config`;\n file = Deno.readTextFileSync(\n `${prefix}/gcloud/application_default_credentials.json`,\n );\n } catch {\n return;\n }\n\n const data = JSON.parse(file);\n this.#applicationDefaultCredentials = {\n ...data,\n grant_type: 'refresh_token',\n };\n } else if (credential.type === 'authorized_user') {\n this.applicationDefault(credential as ApplicationDefaultCredentials);\n } else if (credential.type === 'service_account') {\n this.serviceAccount(credential as ServiceAccountCredentials);\n } else {\n throw new Error('credential option required');\n }\n }\n\n /**\n * @description\n * @param {String} data\n * @returns {Google}\n */\n project(data: string): this {\n this.#project = data;\n return this;\n }\n\n /**\n * @description Sets the max request time. Defaults to 1000ms.\n * @param {Number} timeout The milliseconds for request a timeout.\n * @return {Google}\n */\n timeout(timeout: number): this {\n this.#timeout = timeout;\n return this;\n }\n\n /**\n * @description Sets the max retry atttempts after request timeout. Defaults to 5.\n * @param {Number} attempts The amount of attempts for timeout retries.\n * @return {Google}\n */\n attempts(attempts: number): this {\n this.#attempts = attempts;\n return this;\n }\n\n async fetch(input: string | URL | Request, init?: RequestInit, attempts?: number): Promise {\n attempts = attempts || 1;\n try {\n if (!this.project) {\n const projectResponse = await fetch(\n 'http://metadata.google.internal/computeMetadata/v1/project/project-id',\n {\n method: 'GET',\n headers: { 'Metadata-Flavor': 'Google' },\n signal: AbortSignal.timeout(this.#timeout * attempts),\n },\n );\n\n this.#project = await projectResponse.text();\n }\n\n if (!this.#project) throw new Error('project required');\n\n await this.#auth(attempts);\n\n init = init ?? {};\n init.signal = AbortSignal.timeout(this.#timeout * attempts);\n\n const request = new Request(input, init);\n\n if (this.#token) request.headers.set('Authorization', `Bearer ${this.#token}`);\n\n const response = await fetch(request);\n\n return response;\n } catch (error) {\n if (error?.name === 'TimeoutError' && attempts < this.#attempts) {\n return this.fetch(input, init, attempts + 1);\n } else if (error?.name === 'TimeoutError') {\n return new Response(undefined, { status: 408, headers: { connection: 'close' } });\n } else {\n throw new Error(error.message, { cause: error });\n }\n }\n }\n}\n\nexport default {\n Google,\n};\n"], + "mappings": "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", "names": ["encoder", "mod_default"] } diff --git a/module/jwt/mod.js b/module/jwt/mod.js index 50b6cd8..c880ab0 100644 --- a/module/jwt/mod.js +++ b/module/jwt/mod.js @@ -7,7 +7,7 @@ */ -// http-fetch:https://deno.land/std@0.204.0/encoding/_util.ts +// http-fetch:https://deno.land/std@0.213.0/encoding/_util.ts var encoder = new TextEncoder(); function getTypeName(value) { const type = typeof value; @@ -32,7 +32,7 @@ function validateBinaryLike(source) { ); } -// http-fetch:https://deno.land/std@0.204.0/encoding/base64.ts +// http-fetch:https://deno.land/std@0.213.0/encoding/base64.ts var base64abc = [ "A", "B", @@ -99,7 +99,6 @@ var base64abc = [ "+", "/" ]; -var decode = decodeBase64; function encodeBase64(data) { const uint8 = validateBinaryLike(data); let result = "", i; @@ -133,11 +132,10 @@ function decodeBase64(b64) { return bytes; } -// http-fetch:https://deno.land/std@0.204.0/encoding/base64url.ts +// http-fetch:https://deno.land/std@0.213.0/encoding/base64url.ts function convertBase64ToBase64url(b64) { return b64.endsWith("=") ? b64.endsWith("==") ? b64.replace(/\+/g, "-").replace(/\//g, "_").slice(0, -2) : b64.replace(/\+/g, "-").replace(/\//g, "_").slice(0, -1) : b64.replace(/\+/g, "-").replace(/\//g, "_"); } -var encode = encodeBase64Url; function encodeBase64Url(data) { return convertBase64ToBase64url(encodeBase64(data)); } @@ -145,14 +143,14 @@ function encodeBase64Url(data) { // jwt/mod.ts var encoder2 = new TextEncoder(); async function mod_default(header, payload, secret) { - const encodedHeader = encode(JSON.stringify(header)); - const encodedPayload = encode(JSON.stringify(payload)); + const encodedHeader = encodeBase64Url(JSON.stringify(header)); + const encodedPayload = encodeBase64Url(JSON.stringify(payload)); const data = encoder2.encode(`${encodedHeader}.${encodedPayload}`); const cleanedKey = secret.replace( /^\n?-----BEGIN PRIVATE KEY-----\n?|\n?-----END PRIVATE KEY-----\n?$/g, "" ); - const decodedKey = decode(cleanedKey).buffer; + const decodedKey = decodeBase64(cleanedKey).buffer; const key = await crypto.subtle.importKey( "pkcs8", decodedKey, @@ -165,7 +163,7 @@ async function mod_default(header, payload, secret) { key, data ); - const encodedSignature = encode(signature); + const encodedSignature = encodeBase64Url(signature); return `${encodedHeader}.${encodedPayload}.${encodedSignature}`; } export { diff --git a/module/jwt/mod.js.map b/module/jwt/mod.js.map index ded490e..e679d4e 100644 --- a/module/jwt/mod.js.map +++ b/module/jwt/mod.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["http-fetch:https://deno.land/std@0.204.0/encoding/_util.ts", "http-fetch:https://deno.land/std@0.204.0/encoding/base64.ts", "http-fetch:https://deno.land/std@0.204.0/encoding/base64url.ts", "../../jwt/mod.ts"], - "sourcesContent": ["// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.\n\nconst encoder = new TextEncoder();\n\nfunction getTypeName(value: unknown): string {\n const type = typeof value;\n if (type !== \"object\") {\n return type;\n } else if (value === null) {\n return \"null\";\n } else {\n return value?.constructor?.name ?? \"object\";\n }\n}\n\nexport function validateBinaryLike(source: unknown): Uint8Array {\n if (typeof source === \"string\") {\n return encoder.encode(source);\n } else if (source instanceof Uint8Array) {\n return source;\n } else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n throw new TypeError(\n `The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type ${\n getTypeName(source)\n }.`,\n );\n}\n", "// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\nimport { validateBinaryLike } from \"./_util.ts\";\n\n/**\n * {@linkcode encodeBase64} and {@linkcode decodeBase64} for\n * [base64](https://en.wikipedia.org/wiki/Base64) encoding.\n *\n * This module is browser compatible.\n *\n * @example\n * ```ts\n * import {\n * decodeBase64,\n * encodeBase64,\n * } from \"https://deno.land/std@$STD_VERSION/encoding/base64.ts\";\n *\n * const b64Repr = \"Zm9vYg==\";\n *\n * const binaryData = decodeBase64(b64Repr);\n * console.log(binaryData);\n * // => Uint8Array [ 102, 111, 111, 98 ]\n *\n * console.log(encodeBase64(binaryData));\n * // => Zm9vYg==\n * ```\n *\n * @module\n */\n\nconst base64abc = [\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\",\n \"a\",\n \"b\",\n \"c\",\n \"d\",\n \"e\",\n \"f\",\n \"g\",\n \"h\",\n \"i\",\n \"j\",\n \"k\",\n \"l\",\n \"m\",\n \"n\",\n \"o\",\n \"p\",\n \"q\",\n \"r\",\n \"s\",\n \"t\",\n \"u\",\n \"v\",\n \"w\",\n \"x\",\n \"y\",\n \"z\",\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"+\",\n \"/\",\n];\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `encodeBase64` instead.\n *\n * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation\n * @param data\n */\nexport const encode = encodeBase64;\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `decodeBase64` instead.\n *\n * Decodes a given RFC4648 base64 encoded string\n * @param b64\n */\nexport const decode = decodeBase64;\n\n/**\n * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation\n */\nexport function encodeBase64(data: ArrayBuffer | Uint8Array | string): string {\n // CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n const uint8 = validateBinaryLike(data);\n let result = \"\",\n i;\n const l = uint8.length;\n for (i = 2; i < l; i += 3) {\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)];\n result += base64abc[uint8[i] & 0x3f];\n }\n if (i === l + 1) {\n // 1 octet yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[(uint8[i - 2] & 0x03) << 4];\n result += \"==\";\n }\n if (i === l) {\n // 2 octets yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[(uint8[i - 1] & 0x0f) << 2];\n result += \"=\";\n }\n return result;\n}\n\n/**\n * Decodes a given RFC4648 base64 encoded string\n */\nexport function decodeBase64(b64: string): Uint8Array {\n const binString = atob(b64);\n const size = binString.length;\n const bytes = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n bytes[i] = binString.charCodeAt(i);\n }\n return bytes;\n}\n", "// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\n/**\n * {@linkcode encodeBase64Url} and {@linkcode decodeBase64Url} for\n * [base64 URL safe](https://en.wikipedia.org/wiki/Base64#URL_applications) encoding.\n *\n * This module is browser compatible.\n *\n * @example\n * ```ts\n * import {\n * decodeBase64Url,\n * encodeBase64Url,\n * } from \"https://deno.land/std@$STD_VERSION/encoding/base64url.ts\";\n *\n * const binary = new TextEncoder().encode(\"foobar\");\n * const encoded = encodeBase64Url(binary);\n * console.log(encoded);\n * // => \"Zm9vYmFy\"\n *\n * console.log(decodeBase64Url(encoded));\n * // => Uint8Array(6) [ 102, 111, 111, 98, 97, 114 ]\n * ```\n *\n * @module\n */\n\nimport * as base64 from \"./base64.ts\";\n\n/*\n * Some variants allow or require omitting the padding '=' signs:\n * https://en.wikipedia.org/wiki/Base64#The_URL_applications\n * @param base64url\n */\nfunction addPaddingToBase64url(base64url: string): string {\n if (base64url.length % 4 === 2) return base64url + \"==\";\n if (base64url.length % 4 === 3) return base64url + \"=\";\n if (base64url.length % 4 === 1) {\n throw new TypeError(\"Illegal base64url string!\");\n }\n return base64url;\n}\n\nfunction convertBase64urlToBase64(b64url: string): string {\n if (!/^[-_A-Z0-9]*?={0,2}$/i.test(b64url)) {\n // Contains characters not part of base64url spec.\n throw new TypeError(\"Failed to decode base64url: invalid character\");\n }\n return addPaddingToBase64url(b64url).replace(/\\-/g, \"+\").replace(/_/g, \"/\");\n}\n\nfunction convertBase64ToBase64url(b64: string) {\n return b64.endsWith(\"=\")\n ? b64.endsWith(\"==\")\n ? b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -2)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -1)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `encodeBase64Url` instead.\n *\n * Encodes a given ArrayBuffer or string into a base64url representation\n * @param data\n */\nexport const encode = encodeBase64Url;\n\n/**\n * @deprecated (will be removed in 0.210.0) Use a `decodeBase64Url` instead.\n *\n * Converts given base64url encoded data back to original\n * @param b64url\n */\nexport const decode = decodeBase64Url;\n\n/**\n * Encodes a given ArrayBuffer or string into a base64url representation\n * @param data\n */\nexport function encodeBase64Url(\n data: ArrayBuffer | Uint8Array | string,\n): string {\n return convertBase64ToBase64url(base64.encodeBase64(data));\n}\n\n/**\n * Converts given base64url encoded data back to original\n * @param b64url\n */\nexport function decodeBase64Url(b64url: string): Uint8Array {\n return base64.decodeBase64(convertBase64urlToBase64(b64url));\n}\n", "import * as base64url from 'https://deno.land/std@0.204.0/encoding/base64url.ts';\nimport * as base64 from 'https://deno.land/std@0.204.0/encoding/base64.ts';\n\nexport type Header = {\n alg: 'RS256';\n [key: string]: unknown;\n};\n\nexport type Payload = {\n iss: string;\n aud: string;\n exp: number;\n iat: number;\n scope: string;\n};\n\nconst encoder = new TextEncoder();\n\nexport default async function (\n header: Header,\n payload: Payload,\n secret: string,\n): Promise {\n const encodedHeader = base64url.encode(JSON.stringify(header));\n const encodedPayload = base64url.encode(JSON.stringify(payload));\n const data = encoder.encode(`${encodedHeader}.${encodedPayload}`);\n\n const cleanedKey = secret.replace(\n /^\\n?-----BEGIN PRIVATE KEY-----\\n?|\\n?-----END PRIVATE KEY-----\\n?$/g,\n '',\n );\n const decodedKey = base64.decode(cleanedKey).buffer;\n const key = await crypto.subtle.importKey(\n 'pkcs8',\n decodedKey,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n\n const signature = await crypto.subtle.sign(\n { hash: { name: 'SHA-256' }, name: 'RSASSA-PKCS1-v1_5' },\n key,\n data,\n );\n const encodedSignature = base64url.encode(signature);\n\n return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;\n}\n"], - "mappings": "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", + "sources": ["http-fetch:https://deno.land/std@0.213.0/encoding/_util.ts", "http-fetch:https://deno.land/std@0.213.0/encoding/base64.ts", "http-fetch:https://deno.land/std@0.213.0/encoding/base64url.ts", "../../jwt/mod.ts"], + "sourcesContent": ["// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.\n\nconst encoder = new TextEncoder();\n\nfunction getTypeName(value: unknown): string {\n const type = typeof value;\n if (type !== \"object\") {\n return type;\n } else if (value === null) {\n return \"null\";\n } else {\n return value?.constructor?.name ?? \"object\";\n }\n}\n\nexport function validateBinaryLike(source: unknown): Uint8Array {\n if (typeof source === \"string\") {\n return encoder.encode(source);\n } else if (source instanceof Uint8Array) {\n return source;\n } else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n throw new TypeError(\n `The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type ${\n getTypeName(source)\n }.`,\n );\n}\n", "// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\nimport { validateBinaryLike } from \"./_util.ts\";\n\n/**\n * Utilities for\n * [base64]{@link https://datatracker.ietf.org/doc/html/rfc4648#section-4}\n * encoding and decoding.\n *\n * This module is browser compatible.\n *\n * @module\n */\n\nconst base64abc = [\n \"A\",\n \"B\",\n \"C\",\n \"D\",\n \"E\",\n \"F\",\n \"G\",\n \"H\",\n \"I\",\n \"J\",\n \"K\",\n \"L\",\n \"M\",\n \"N\",\n \"O\",\n \"P\",\n \"Q\",\n \"R\",\n \"S\",\n \"T\",\n \"U\",\n \"V\",\n \"W\",\n \"X\",\n \"Y\",\n \"Z\",\n \"a\",\n \"b\",\n \"c\",\n \"d\",\n \"e\",\n \"f\",\n \"g\",\n \"h\",\n \"i\",\n \"j\",\n \"k\",\n \"l\",\n \"m\",\n \"n\",\n \"o\",\n \"p\",\n \"q\",\n \"r\",\n \"s\",\n \"t\",\n \"u\",\n \"v\",\n \"w\",\n \"x\",\n \"y\",\n \"z\",\n \"0\",\n \"1\",\n \"2\",\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"+\",\n \"/\",\n];\n\n/**\n * Converts data into a base64-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-4}\n *\n * @example\n * ```ts\n * import { encodeBase64 } from \"https://deno.land/std@$STD_VERSION/encoding/base64.ts\";\n *\n * encodeBase64(\"foobar\"); // \"Zm9vYmFy\"\n * ```\n */\nexport function encodeBase64(data: ArrayBuffer | Uint8Array | string): string {\n // CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727\n const uint8 = validateBinaryLike(data);\n let result = \"\",\n i;\n const l = uint8.length;\n for (i = 2; i < l; i += 3) {\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[((uint8[i - 1] & 0x0f) << 2) | (uint8[i] >> 6)];\n result += base64abc[uint8[i] & 0x3f];\n }\n if (i === l + 1) {\n // 1 octet yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[(uint8[i - 2] & 0x03) << 4];\n result += \"==\";\n }\n if (i === l) {\n // 2 octets yet to write\n result += base64abc[uint8[i - 2] >> 2];\n result += base64abc[((uint8[i - 2] & 0x03) << 4) | (uint8[i - 1] >> 4)];\n result += base64abc[(uint8[i - 1] & 0x0f) << 2];\n result += \"=\";\n }\n return result;\n}\n\n/**\n * Decodes a base64-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-4}\n *\n * @example\n * ```ts\n * import { encodeBase64 } from \"https://deno.land/std@$STD_VERSION/encoding/base64.ts\";\n *\n * encodeBase64(\"foobar\"); // \"Zm9vYmFy\"\n * ```\n */\nexport function decodeBase64(b64: string): Uint8Array {\n const binString = atob(b64);\n const size = binString.length;\n const bytes = new Uint8Array(size);\n for (let i = 0; i < size; i++) {\n bytes[i] = binString.charCodeAt(i);\n }\n return bytes;\n}\n", "// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * [base64url]{@link https://datatracker.ietf.org/doc/html/rfc4648#section-5}\n * encoding and decoding.\n *\n * This module is browser compatible.\n *\n * @module\n */\n\nimport * as base64 from \"./base64.ts\";\n\n/*\n * Some variants allow or require omitting the padding '=' signs:\n * https://en.wikipedia.org/wiki/Base64#The_URL_applications\n * @param base64url\n */\nfunction addPaddingToBase64url(base64url: string): string {\n if (base64url.length % 4 === 2) return base64url + \"==\";\n if (base64url.length % 4 === 3) return base64url + \"=\";\n if (base64url.length % 4 === 1) {\n throw new TypeError(\"Illegal base64url string!\");\n }\n return base64url;\n}\n\nfunction convertBase64urlToBase64(b64url: string): string {\n if (!/^[-_A-Z0-9]*?={0,2}$/i.test(b64url)) {\n // Contains characters not part of base64url spec.\n throw new TypeError(\"Failed to decode base64url: invalid character\");\n }\n return addPaddingToBase64url(b64url).replace(/\\-/g, \"+\").replace(/_/g, \"/\");\n}\n\nfunction convertBase64ToBase64url(b64: string) {\n return b64.endsWith(\"=\")\n ? b64.endsWith(\"==\")\n ? b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -2)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").slice(0, -1)\n : b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n/**\n * Convert data into a base64url-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-5}\n *\n * @example\n * ```ts\n * import { encodeBase64Url } from \"https://deno.land/std@$STD_VERSION/encoding/base64url.ts\";\n *\n * encodeBase64Url(new TextEncoder().encode(\"foobar\")); // \"Zm9vYmFy\"\n * ```\n */\nexport function encodeBase64Url(\n data: ArrayBuffer | Uint8Array | string,\n): string {\n return convertBase64ToBase64url(base64.encodeBase64(data));\n}\n\n/**\n * Decodes a given base64url-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/rfc4648#section-5}\n *\n * @example\n * ```ts\n * import { decodeBase64Url } from \"https://deno.land/std@$STD_VERSION/encoding/base64url.ts\";\n *\n * decodeBase64Url(\"Zm9vYmFy\"); // Uint8Array(6) [ 102, 111, 111, 98, 97, 114 ]\n * ```\n */\nexport function decodeBase64Url(b64url: string): Uint8Array {\n return base64.decodeBase64(convertBase64urlToBase64(b64url));\n}\n", "import { encodeBase64Url } from 'https://deno.land/std@0.213.0/encoding/base64url.ts';\nimport { decodeBase64 } from 'https://deno.land/std@0.213.0/encoding/base64.ts';\n\nexport type Header = {\n alg: 'RS256';\n [key: string]: unknown;\n};\n\nexport type Payload = {\n iss: string;\n aud: string;\n exp: number;\n iat: number;\n scope: string;\n};\n\nconst encoder = new TextEncoder();\n\nexport default async function (\n header: Header,\n payload: Payload,\n secret: string,\n): Promise {\n const encodedHeader = encodeBase64Url(JSON.stringify(header));\n const encodedPayload = encodeBase64Url(JSON.stringify(payload));\n const data = encoder.encode(`${encodedHeader}.${encodedPayload}`);\n\n const cleanedKey = secret.replace(\n /^\\n?-----BEGIN PRIVATE KEY-----\\n?|\\n?-----END PRIVATE KEY-----\\n?$/g,\n '',\n );\n const decodedKey = decodeBase64(cleanedKey).buffer;\n const key = await crypto.subtle.importKey(\n 'pkcs8',\n decodedKey,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n\n const signature = await crypto.subtle.sign(\n { hash: { name: 'SHA-256' }, name: 'RSASSA-PKCS1-v1_5' },\n key,\n data,\n );\n const encodedSignature = encodeBase64Url(signature);\n\n return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;\n}\n"], + "mappings": "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", "names": ["encoder"] } diff --git a/package.json b/package.json index 4e8abcb..1d124e4 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,28 @@ { - "private": false, - "name": "@xeaone/tool", - "version": "3.6.3", - "description": "", - "type": "module", - "main": "./module/index.js", - "module": "./module/index.js", - "exports": { - ".": { - "default": "./module/index.js" - } - }, - "scripts": { - "t": "deno tasks t", - "b": "deno tasks b" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/xeaone/tool.git" - }, - "author": "Alexander Elias", - "license": "MIT", - "bugs": { - "url": "https://github.com/xeaone/tool/issues" - }, - "homepage": "https://github.com/xeaone/tool#readme" -} + "private": false, + "name": "@xeaone/tool", + "version": "3.6.4", + "description": "", + "type": "module", + "main": "./module/index.js", + "module": "./module/index.js", + "exports": { + ".": { + "default": "./module/index.js" + } + }, + "scripts": { + "t": "deno tasks t", + "b": "deno tasks b" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/xeaone/tool.git" + }, + "author": "Alexander Elias", + "license": "MIT", + "bugs": { + "url": "https://github.com/xeaone/tool/issues" + }, + "homepage": "https://github.com/xeaone/tool#readme" +} \ No newline at end of file diff --git a/snowflake/mod.ts b/snowflake/mod.ts index 89b932b..7e5550a 100644 --- a/snowflake/mod.ts +++ b/snowflake/mod.ts @@ -1,4 +1,4 @@ -import * as jose from 'https://deno.land/x/jose@v5.0.1/index.ts'; +import * as jose from 'https://deno.land/x/jose@v5.2.0/index.ts'; /** * @link https://docs.snowflake.com/en/developer-guide/sql-api/authenticating diff --git a/test.ts b/test.ts index 4ad5f08..e25b749 100644 --- a/test.ts +++ b/test.ts @@ -1,4 +1,4 @@ -import { assertEquals } from 'https://deno.land/std@0.204.0/assert/mod.ts'; +import { assertEquals } from 'https://deno.land/std@0.213.0/assert/mod.ts'; import encrypt from './encrypt/mod.ts'; import decrypt from './decrypt/mod.ts'; diff --git a/version.ts b/version.ts index 1a4309a..30ae618 100644 --- a/version.ts +++ b/version.ts @@ -1 +1 @@ -export default '3.6.3'; +export default '3.6.4';