@focus-at/zs3 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/zeros3.js CHANGED
@@ -3,3 +3,6 @@ var y="HMAC",m="SHA256",b="AWS4",U=[b,y,m].join("-"),M=/[:-]|\.\d{3}/g,W=/<(\w)(
3
3
  `,d.join(";"),D].join(`
4
4
  `),_=`${x}/${w}/s3/aws4_request`,q=await u(await u(await u(await u(`${b}${K}`,x),w),"s3"),"aws4_request"),P=I(await u(q,[U,l,_,await j(O)].join(`
5
5
  `)));f.Authorization=`${U} Credential=${G}/${_}, SignedHeaders=${d.join(";")}, Signature=${P}`;let g=await fetch(new URL(E,h),{method:t,headers:f,body:a});if(!g.ok)throw Error(`S3 Error: ${g.status} - ${await g.text()}`);return t==="HEAD"?{size:+g.headers.get("content-length"),mtime:new Date(g.headers.get("last-modified")),...Object.fromEntries(g.headers)}:g};return{get:async(t,s={})=>{if(typeof t!=="object"||t===null)return r("GET",t,null,s);let a=`?list-type=2&max-keys=${t.maxKeys||1000}&prefix=${Q(t.prefix||"")}`;return(await(await r("GET",a,null,s)).body?.pipeThrough(new B).getReader()?.read()).value},put:(t,s=null,a={})=>r("PUT",t,s,a),del:(t,s={})=>r("DELETE",t,null,s),stat:(t,s={})=>r("HEAD",t,null,s),execute:r,config:n}}export{B as S3XmlTransformStream,j as hash,u as hmac,I as toHex,Y as zs3};
6
+
7
+ //# debugId=40B38E1FDF2C5C1664756E2164756E21
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../index.ts"],
4
+ "sourcesContent": [
5
+ "export interface S3Config {\n endpoint: string;\n accessKeyId: string;\n secretAccessKey: string;\n bucket?: string;\n region?: string;\n [key: string]: any;\n}\n\nexport interface S3Options {\n headers?: Record<string, string>;\n meta?: Record<string, string>;\n}\n\nexport interface ListOptions {\n prefix?: string;\n maxKeys?: number;\n}\n\nexport interface S3StatResponse extends Record<string, any> {\n size: number;\n mtime: Date;\n}\n\nconst ALG_NAME = ('HMAC' + '');\nconst ALG_HASH = ('SHA256' + '');\nconst AWS4 = ('AWS4' + '');\nconst SIGN_P = [AWS4, ALG_NAME, ALG_HASH].join('-');\nconst RE_ISO_DATE = /[:-]|\\.\\d{3}/g;\nconst RE_XML_TAGS = /<(\\w)([-\\w]*)(?:\\/|[^>]*>((?:(?!<\\1\\2)[\\s\\S])*)<\\/\\1\\2)>/gm;\nconst RE_DASH_CASE = /\\B[A-Z]/g;\nconst RE_ENCODE_URI = /[!'()*]/g;\nconst RE_LEADING_SLASHES = /^\\/*/;\n\nconst enc = new TextEncoder();\nconst { subtle } = crypto;\n\nconst toArrayBuffer = (d: any): ArrayBuffer =>\n d instanceof ArrayBuffer ? d : d?.buffer?.constructor === ArrayBuffer ? d.buffer : enc.encode(d == null ? '' : `${d}`).buffer;\n\nexport const toHex = (buf: ArrayBuffer | Uint8Array):string =>\n Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, '0')).join('');\n\nexport const hmac = async (key: string | Uint8Array | ArrayBuffer, data: string): Promise<Uint8Array> => {\n const cryptoKey = await subtle.importKey('raw', toArrayBuffer(key), { name: ALG_NAME, hash: ALG_HASH}, false, ['sign']);\n return new Uint8Array(await subtle.sign(ALG_NAME, cryptoKey, enc.encode(data)));\n};\n\nexport const hash = async (data: any) => toHex(await subtle.digest(ALG_HASH, toArrayBuffer(data)));\n\nconst assignDashCase = (target: Record<string, string>, source: Record<string, any> | undefined, prefix: string): Record<string, string> => {\n if (source) Object.keys(source).forEach(key => {\n const name = (prefix + (key === \"expires\" ? key : key.replace(RE_DASH_CASE, \"-$&\"))).toLowerCase();\n if (source[key] && typeof source[key] !== 'object') target[name] = `${source[key]}`;\n });\n return target;\n};\n\nconst awsEncodeURI = (str: string): string =>\n encodeURIComponent(str).replace(RE_ENCODE_URI, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);\n\nconst parseXml = (str: string): any => {\n const types: Record<string, any> = { \"\": \"\", \"true\": true, \"false\": false };\n const m = [...str.matchAll(RE_XML_TAGS)];\n return m.length ? m.reduce((acc: any, [, tag = '', suffix = '', content = '']) => {\n const k = tag.toLowerCase() + suffix;\n const v = types[content] ?? (isNaN(+content) ? parseXml(content) : +content);\n acc[k] = Array.isArray(acc[k]) ? [...acc[k], v] : acc[k] != null ? [acc[k], v] : k === \"contents\" ? [v] : v;\n return acc;\n }, {}) : str;\n};\n\nexport class S3XmlTransformStream extends TransformStream<Uint8Array, any> {\n constructor() {\n const decoder = new TextDecoder();\n let acc = \"\";\n super({\n transform(chunk) { acc += decoder.decode(chunk, { stream: true }); },\n flush(c) {\n const res = parseXml((acc + decoder.decode()).trim());\n c.enqueue(res?.listBucketResult || res);\n }\n });\n }\n}\n\nexport function zs3(opts: S3Config) {\n const config = { region: 'us-east-1', bucket: '', ...opts };\n const execute = async (method: string, path: string, body: any = null, options: S3Options = {}): Promise<Response | any> => {\n const {\n endpoint,\n bucket,\n region,\n accessKeyId,\n secretAccessKey\n } = config;\n const base = new URL(endpoint.startsWith('http') ? endpoint : `https://${endpoint.replace('://', '')}`);\n const isoDate = new Date().toISOString().replace(RE_ISO_DATE, '');\n const sDate = isoDate.slice(0, 8);\n const pathname = bucket ? `/${bucket}/${path.replace(RE_LEADING_SLASHES, '')}` : path;\n const isStream = body && typeof body.getReader === 'function';\n const payloadHash = isStream ? 'UNSIGNED-PAYLOAD' : await hash(body || '');\n\n const headers: Record<string, string> = assignDashCase(assignDashCase({\n host: base.host,\n 'x-amz-date': isoDate,\n 'x-amz-content-sha256': payloadHash,\n ...(body && !isStream ? { 'content-length': `${toArrayBuffer(body).byteLength}` } : {})\n }, options.headers, \"\"), options.meta, \"x-amz-meta-\");\n\n const [uri, query = ''] = pathname.split('?');\n const sortedHeaders = Object.keys(headers).map(k => k.toLowerCase()).sort();\n const sortedQuery = query ? query.split('&').sort().join('&') : '';\n\n const canonical = [method, uri || '/', sortedQuery, sortedHeaders.map(k => `${k}:${headers[k]?.trim()}`).join('\\n') + '\\n', sortedHeaders.join(';'), payloadHash].join('\\n');\n const scope = `${sDate}/${region}/s3/aws4_request`;\n\n const kSign = await hmac(await hmac(await hmac(await hmac(`${AWS4}${secretAccessKey}`, sDate), region), 's3'), 'aws4_request');\n const signature = toHex(await hmac(kSign, [SIGN_P, isoDate, scope, await hash(canonical)].join('\\n')));\n\n headers['Authorization'] = `${SIGN_P} Credential=${accessKeyId}/${scope}, SignedHeaders=${sortedHeaders.join(';')}, Signature=${signature}`;\n\n const res = await fetch(new URL(pathname, base), { method, headers, body });\n if (!res.ok) throw new Error(`S3 Error: ${res.status} - ${await res.text()}`);\n\n return method === 'HEAD' ? {\n size: +res.headers.get(\"content-length\")!,\n mtime: new Date(res.headers.get(\"last-modified\")!),\n ...Object.fromEntries(res.headers)\n } : res;\n };\n\n return {\n get: async (keyOrOpts: string | ListOptions, options: S3Options = {}) => {\n if (typeof keyOrOpts !== 'object' || keyOrOpts === null) {\n return execute('GET', keyOrOpts, null, options);\n }\n\n const query = `?list-type=2&max-keys=${keyOrOpts.maxKeys || 1000}&prefix=${awsEncodeURI(keyOrOpts.prefix || '')}`;\n const res = await execute('GET', query, null, options);\n\n const reader = res.body?.pipeThrough(new S3XmlTransformStream()).getReader();\n\n return (await reader?.read()).value\n },\n put: (path: string, body: any = null, options: S3Options = {}) => execute('PUT', path, body, options),\n del: (path: string, options: S3Options = {}) => execute('DELETE', path, null, options),\n stat: (path: string, options: S3Options = {}) => execute('HEAD', path, null, options),\n execute,\n config\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "40B38E1FDF2C5C1664756E2164756E21",
9
+ "names": []
10
+ }
package/package.json CHANGED
@@ -1,28 +1,40 @@
1
1
  {
2
2
  "name": "@focus-at/zs3",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "Zero-dependency micro S3 client built on Web Standards",
5
5
  "homepage": "https://github.com/focus-at/zs3",
6
6
  "type": "module",
7
- "exports": "./dist/zeros3.js",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./index.ts",
10
+ "import": "./dist/zeros3.js"
11
+ }
12
+ },
8
13
  "scripts": {
9
- "build": "bun build --minify ./index.ts --outfile=dist/zeros3.js",
14
+ "build": "bun build --minify --sourcemap ./index.ts --outdir=dist && mv dist/index.js dist/zeros3.js && mv dist/index.js.map dist/zeros3.js.map",
10
15
  "release": "npm version patch && git push origin main --tags",
11
16
  "postinstall": "node -e \"if(!process.env.DISABLE_OPENCOLLECTIVE && !process.env.CI){process.stdout.write('\\u001b[35mThanks for installing ZeroS3! Consider giving it a star on GitHub: https://github.com\\u001b[0m\\n')}\""
12
17
  },
13
18
  "keywords": [
14
19
  "s3",
15
20
  "aws-s3",
16
- "zeros3",
17
21
  "zs3",
18
- "micro",
22
+ "zeros3",
23
+ "amazon-s3",
24
+ "s3-client",
19
25
  "zero-dependency",
26
+ "tree-shakeable",
27
+ "esm",
28
+ "micro",
29
+ "tiny-s3",
30
+ "lightweight-s3",
20
31
  "web-standards",
21
32
  "fetch",
22
- "runtime",
23
- "browser",
33
+ "crypto-subtle",
34
+ "transform-stream",
35
+ "edge-runtime",
24
36
  "cloudflare-workers",
25
- "esm"
37
+ "browser-s3"
26
38
  ],
27
39
  "author": "Dmitry Zimin",
28
40
  "license": "MIT",