nec-oss 0.1.0
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/index.d.ts +122 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +801 -0
- package/dist/index.js.map +1 -0
- package/dist/nec-oss.iife.js +812 -0
- package/dist/nec-oss.iife.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nec-oss.iife.js","names":["request: UploadHttpRequest","init: RequestInit","runtimeItem: OssRuntime","uploadOptions: Record<string, unknown>","context: UploadContext","params: UploadParams","uploadContext: UploadContext","context: OssClientContext","defaultOssProviderOptions: OssProviderOptions","createCoreUploader"],"sources":["../../core/dist/index.js","../src/oss/runtime.ts","../src/oss/adapter.ts","../src/oss/provider.ts","../src/oss/client.ts","../src/uploader.ts"],"sourcesContent":["//#region src/event-emitter.ts\nvar EventEmitter = class {\n\tlisteners = /* @__PURE__ */ new Map();\n\temit(eventName, payload) {\n\t\t(this.listeners.get(eventName) ?? /* @__PURE__ */ new Set()).forEach((handler) => {\n\t\t\thandler(payload);\n\t\t});\n\t}\n\ton(eventName, handler) {\n\t\tconst handlers = this.listeners.get(eventName) ?? /* @__PURE__ */ new Set();\n\t\thandlers.add(handler);\n\t\tthis.listeners.set(eventName, handlers);\n\t\treturn () => {\n\t\t\thandlers.delete(handler);\n\t\t};\n\t}\n};\n\n//#endregion\n//#region src/file.ts\nlet nextId = 0;\nfunction createUploadFile(file) {\n\tconst name = getFileName(file);\n\tconst type = \"type\" in file ? file.type : \"\";\n\tconst size = \"size\" in file ? file.size : 0;\n\tnextId += 1;\n\treturn {\n\t\tid: `upload-${Date.now()}-${nextId}`,\n\t\tfile,\n\t\tname,\n\t\tprogress: {\n\t\t\tpercent: 0,\n\t\t\tloaded: 0,\n\t\t\ttotal: size\n\t\t},\n\t\tsize,\n\t\tstatus: \"pending\",\n\t\ttype\n\t};\n}\nfunction normalizeFiles(files) {\n\tif (isFileList(files)) return Array.from(files);\n\tif (Array.isArray(files)) return files;\n\treturn [files];\n}\nfunction isFileList(files) {\n\treturn typeof FileList !== \"undefined\" && files instanceof FileList;\n}\nfunction getFileName(file) {\n\tif (\"name\" in file && typeof file.name === \"string\") return file.name;\n\treturn \"blob\";\n}\n\n//#endregion\n//#region src/validate.ts\nfunction validateFiles(files, existingFiles, options = {}) {\n\tconst acceptedFiles = [];\n\tconst invalidFiles = [];\n\treturn files.reduce((promise, file) => {\n\t\treturn promise.then(() => {\n\t\t\treturn validateFile(file, {\n\t\t\t\tacceptedFiles,\n\t\t\t\texistingFiles,\n\t\t\t\tfiles\n\t\t\t}, options).then((result) => {\n\t\t\t\tif (result.valid) {\n\t\t\t\t\tacceptedFiles.push(file);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tinvalidFiles.push({\n\t\t\t\t\tfile: file.file,\n\t\t\t\t\tname: file.name,\n\t\t\t\t\treason: result.message ?? \"文件校验失败\",\n\t\t\t\t\trule: result.rule ?? \"custom\"\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}, Promise.resolve()).then(() => ({\n\t\tacceptedFiles,\n\t\tinvalidFiles\n\t}));\n}\nfunction validateFile(file, context, options) {\n\tconst builtInResult = validateBuiltInRules(file, context, options);\n\tif (!builtInResult.valid) return Promise.resolve(builtInResult);\n\treturn (options.customValidators ?? []).reduce((promise, validator) => {\n\t\treturn promise.then((currentResult) => {\n\t\t\tif (!currentResult.valid) return currentResult;\n\t\t\treturn Promise.resolve(validator(file, context)).then(normalizeValidationResult);\n\t\t});\n\t}, Promise.resolve({ valid: true }));\n}\nfunction validateBuiltInRules(file, context, options) {\n\tif (options.allowEmpty !== true && file.size === 0) return {\n\t\tvalid: false,\n\t\tmessage: \"不允许上传空文件\",\n\t\trule: \"allowEmpty\"\n\t};\n\tif (typeof options.maxCount === \"number\" && context.existingFiles.length + context.acceptedFiles.length >= options.maxCount) return {\n\t\tvalid: false,\n\t\tmessage: `最多只能上传 ${options.maxCount} 个文件`,\n\t\trule: \"maxCount\"\n\t};\n\tif (typeof options.maxSize === \"number\" && file.size > options.maxSize) return {\n\t\tvalid: false,\n\t\tmessage: `文件大小不能超过 ${options.maxSize} 字节`,\n\t\trule: \"maxSize\"\n\t};\n\tif (typeof options.minSize === \"number\" && file.size < options.minSize) return {\n\t\tvalid: false,\n\t\tmessage: `文件大小不能小于 ${options.minSize} 字节`,\n\t\trule: \"minSize\"\n\t};\n\tif (options.allowDuplicateName !== true && hasDuplicateName(file, context)) return {\n\t\tvalid: false,\n\t\tmessage: \"不允许上传重名文件\",\n\t\trule: \"allowDuplicateName\"\n\t};\n\tif (options.accept && !matchesAccept(file, options.accept)) return {\n\t\tvalid: false,\n\t\tmessage: \"文件类型不符合要求\",\n\t\trule: \"accept\"\n\t};\n\tif (options.extensions && options.extensions.length > 0 && !matchesExtension(file, options.extensions)) return {\n\t\tvalid: false,\n\t\tmessage: \"文件扩展名不符合要求\",\n\t\trule: \"extensions\"\n\t};\n\treturn { valid: true };\n}\nfunction normalizeValidationResult(result) {\n\tif (typeof result === \"boolean\") return { valid: result };\n\tif (typeof result === \"string\") return {\n\t\tmessage: result,\n\t\trule: \"custom\",\n\t\tvalid: false\n\t};\n\treturn result;\n}\nfunction hasDuplicateName(file, context) {\n\treturn [...context.existingFiles, ...context.files].filter((item) => item.name === file.name).length > 1;\n}\nfunction matchesAccept(file, accept) {\n\treturn (Array.isArray(accept) ? accept : accept.split(\",\")).map((item) => item.trim()).filter(Boolean).some((item) => {\n\t\tif (item.endsWith(\"/*\")) return file.type.startsWith(item.slice(0, -1));\n\t\tif (item.startsWith(\".\")) return file.name.toLowerCase().endsWith(item.toLowerCase());\n\t\treturn file.type === item;\n\t});\n}\nfunction matchesExtension(file, extensions) {\n\tconst normalizedName = file.name.toLowerCase();\n\treturn extensions.some((extension) => {\n\t\tconst normalizedExtension = extension.startsWith(\".\") ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\t\treturn normalizedName.endsWith(normalizedExtension);\n\t});\n}\n\n//#endregion\n//#region src/uploader.ts\nfunction createUploader(options) {\n\treturn new UploadQueue(options);\n}\nvar UploadQueue = class {\n\temitter = new EventEmitter();\n\tfiles = [];\n\ttaskMap = /* @__PURE__ */ new Map();\n\tactiveCount = 0;\n\trunningPromise;\n\tresolveRunning;\n\tconstructor(options) {\n\t\tthis.options = options;\n\t}\n\tadd(inputFiles) {\n\t\treturn validateFiles(normalizeFiles(inputFiles).map(createUploadFile), this.files, this.options.validate).then((result) => {\n\t\t\tresult.acceptedFiles.forEach((file) => {\n\t\t\t\tthis.files.push(file);\n\t\t\t\tthis.taskMap.set(file.id, new UploadTaskImpl(file, this));\n\t\t\t});\n\t\t\tthis.emitQueueChange();\n\t\t\treturn result;\n\t\t});\n\t}\n\tstart() {\n\t\tif (this.runningPromise) return this.runningPromise;\n\t\tthis.runningPromise = new Promise((resolve) => {\n\t\t\tthis.resolveRunning = resolve;\n\t\t}).finally(() => {\n\t\t\tthis.resolveRunning = void 0;\n\t\t\tthis.runningPromise = void 0;\n\t\t});\n\t\tthis.runNext();\n\t\treturn this.runningPromise;\n\t}\n\tpauseAll() {\n\t\treturn this.getTasks().reduce((promise, task) => promise.then(() => task.pause()), Promise.resolve()).then(() => void 0);\n\t}\n\tresumeAll() {\n\t\tthis.files.filter((file) => file.status === \"paused\").forEach((file) => {\n\t\t\tfile.status = \"pending\";\n\t\t});\n\t\tthis.emitQueueChange();\n\t\treturn this.start();\n\t}\n\tcancelAll() {\n\t\treturn this.getTasks().reduce((promise, task) => promise.then(() => task.cancel()), Promise.resolve()).then(() => void 0);\n\t}\n\tcancel(fileIds) {\n\t\treturn this.runByFileIds(fileIds, (task) => task.cancel());\n\t}\n\tpause(fileIds) {\n\t\treturn this.runByFileIds(fileIds, (task) => task.pause());\n\t}\n\tresume(fileIds) {\n\t\treturn this.runByFileIds(fileIds, (task) => task.resume());\n\t}\n\tretry(fileIds) {\n\t\treturn this.runByFileIds(fileIds, (task) => this.retryTask(task.file));\n\t}\n\tclear() {\n\t\tif (!this.files.every((file) => file.status !== \"uploading\")) throw new Error(\"上传中不能清空队列\");\n\t\tthis.files.splice(0, this.files.length);\n\t\tthis.taskMap.clear();\n\t\tthis.emitQueueChange();\n\t}\n\tgetFiles() {\n\t\treturn [...this.files];\n\t}\n\tgetTasks() {\n\t\treturn Array.from(this.taskMap.values());\n\t}\n\ton(eventName, handler) {\n\t\treturn this.emitter.on(eventName, handler);\n\t}\n\trunByFileIds(fileIds, runner) {\n\t\treturn normalizeFileIds(fileIds).reduce((promise, fileId) => {\n\t\t\treturn promise.then(() => {\n\t\t\t\tconst task = this.taskMap.get(fileId);\n\t\t\t\tif (!task) throw new Error(`未找到文件任务:${fileId}`);\n\t\t\t\treturn runner(task);\n\t\t\t});\n\t\t}, Promise.resolve());\n\t}\n\tpauseTask(file) {\n\t\tconst task = this.taskMap.get(file.id);\n\t\tif (!task || file.status !== \"uploading\") {\n\t\t\tif (file.status === \"pending\") {\n\t\t\t\tfile.status = \"paused\";\n\t\t\t\tthis.emitQueueChange();\n\t\t\t}\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn Promise.resolve(this.options.provider.transformLifecycleRequest?.({}, {\n\t\t\tfile,\n\t\t\tlifecycle: \"pause\"\n\t\t}) ?? {}).then(() => this.getAdapter().pause?.({\n\t\t\tfile,\n\t\t\tlifecycle: \"pause\",\n\t\t\tprepared: task.prepared\n\t\t})).then(() => {\n\t\t\ttask.abortController?.abort();\n\t\t\tfile.status = \"paused\";\n\t\t\tthis.emitQueueChange();\n\t\t});\n\t}\n\tresumeTask(file) {\n\t\treturn Promise.resolve(this.options.provider.transformLifecycleRequest?.({}, {\n\t\t\tfile,\n\t\t\tlifecycle: \"resume\"\n\t\t}) ?? {}).then(() => this.getAdapter().resume?.({\n\t\t\tfile,\n\t\t\tlifecycle: \"resume\",\n\t\t\tprepared: this.taskMap.get(file.id)?.prepared\n\t\t})).then(() => {\n\t\t\tif (file.status === \"paused\") {\n\t\t\t\tfile.status = \"pending\";\n\t\t\t\tthis.emitQueueChange();\n\t\t\t}\n\t\t\treturn this.start();\n\t\t});\n\t}\n\tretryTask(file) {\n\t\tif (file.status === \"uploading\") return Promise.resolve();\n\t\tfile.status = \"pending\";\n\t\tfile.error = void 0;\n\t\tfile.response = void 0;\n\t\tfile.rawResponse = void 0;\n\t\tfile.progress = {\n\t\t\tloaded: 0,\n\t\t\tpercent: 0,\n\t\t\ttotal: file.size\n\t\t};\n\t\tthis.emitQueueChange();\n\t\treturn this.start();\n\t}\n\tcancelTask(file) {\n\t\tconst task = this.taskMap.get(file.id);\n\t\tif (!task || file.status === \"pending\" || file.status === \"paused\") {\n\t\t\tfile.status = \"canceled\";\n\t\t\tthis.emitQueueChange();\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn Promise.resolve(this.options.provider.transformLifecycleRequest?.({}, {\n\t\t\tfile,\n\t\t\tlifecycle: \"cancel\"\n\t\t}) ?? {}).then(() => this.getAdapter().cancel?.({\n\t\t\tfile,\n\t\t\tlifecycle: \"cancel\",\n\t\t\tprepared: task?.prepared\n\t\t})).then(() => {\n\t\t\ttask?.abortController?.abort();\n\t\t\tfile.status = \"canceled\";\n\t\t\tthis.emitQueueChange();\n\t\t});\n\t}\n\trunNext() {\n\t\tconst maxConcurrency = Math.max(1, this.options.maxConcurrency ?? 3);\n\t\twhile (this.activeCount < maxConcurrency) {\n\t\t\tconst nextFile = this.files.find((file) => file.status === \"pending\");\n\t\t\tif (!nextFile) break;\n\t\t\tthis.activeCount += 1;\n\t\t\tthis.uploadFile(nextFile).finally(() => {\n\t\t\t\tthis.activeCount -= 1;\n\t\t\t\tthis.runNext();\n\t\t\t});\n\t\t}\n\t\tif (this.activeCount === 0 && !this.files.some((file) => file.status === \"pending\")) {\n\t\t\tthis.emitter.emit(\"complete\", { files: this.getFiles() });\n\t\t\tthis.resolveRunning?.();\n\t\t}\n\t}\n\tuploadFile(file) {\n\t\tconst task = this.taskMap.get(file.id);\n\t\tif (!task) return Promise.resolve();\n\t\tfile.status = \"uploading\";\n\t\ttask.abortController = new AbortController();\n\t\tthis.emitQueueChange();\n\t\treturn Promise.resolve(this.options.provider.prepare(file)).then((prepared) => {\n\t\t\ttask.prepared = prepared;\n\t\t\treturn this.getAdapter().upload({\n\t\t\t\tfile,\n\t\t\t\tonProgress: (progress) => this.handleProgress(file, progress),\n\t\t\t\tprepared,\n\t\t\t\tsignal: task.abortController?.signal ?? new AbortController().signal\n\t\t\t});\n\t\t}).then((result) => this.handleSuccess(file, result, task.prepared)).catch((error) => this.handleError(file, error));\n\t}\n\thandleProgress(file, progress) {\n\t\tfile.progress = progress;\n\t\tfile.checkpoint = progress.checkpoint;\n\t\tthis.emitter.emit(\"progress\", {\n\t\t\tfile,\n\t\t\tprogress\n\t\t});\n\t}\n\thandleSuccess(file, result, prepared) {\n\t\tconst key = result.key ?? prepared?.params.key ?? file.name;\n\t\tconst context = {\n\t\t\tfile,\n\t\t\tlifecycle: \"upload\",\n\t\t\tparams: prepared?.params\n\t\t};\n\t\treturn Promise.resolve(this.options.provider.response?.(result.rawResponse, context) ?? result.rawResponse).then((response) => {\n\t\t\tfile.status = \"success\";\n\t\t\tfile.rawResponse = result.rawResponse;\n\t\t\tfile.response = response;\n\t\t\tfile.checkpoint = result.checkpoint;\n\t\t\tconst payload = {\n\t\t\t\tcheckpoint: result.checkpoint,\n\t\t\t\tkey,\n\t\t\t\trawResponse: result.rawResponse,\n\t\t\t\tresponse,\n\t\t\t\turl: result.url\n\t\t\t};\n\t\t\tthis.emitter.emit(\"success\", {\n\t\t\t\tfile,\n\t\t\t\tresult: payload\n\t\t\t});\n\t\t\tthis.emitQueueChange();\n\t\t});\n\t}\n\thandleError(file, error) {\n\t\tif (file.status === \"paused\" || file.status === \"canceled\") return;\n\t\tconst uploadError = {\n\t\t\tcheckpoint: file.checkpoint,\n\t\t\tcode: getErrorCode(error),\n\t\t\tmessage: getErrorMessage(error),\n\t\t\traw: error\n\t\t};\n\t\tfile.status = \"error\";\n\t\tfile.error = uploadError;\n\t\tthis.emitter.emit(\"error\", {\n\t\t\terror: uploadError,\n\t\t\tfile\n\t\t});\n\t\tthis.emitQueueChange();\n\t}\n\temitQueueChange() {\n\t\tthis.emitter.emit(\"change\", { files: this.getFiles() });\n\t}\n\tgetAdapter() {\n\t\tconst adapter = this.options.adapter ?? this.options.provider.adapter;\n\t\tif (!adapter) throw new Error(\"上传缺少 adapter,请通过 provider 内置 adapter 或显式传入 adapter\");\n\t\treturn adapter;\n\t}\n};\nvar UploadTaskImpl = class {\n\tabortController;\n\tprepared;\n\tconstructor(file, queue) {\n\t\tthis.file = file;\n\t\tthis.queue = queue;\n\t}\n\tcancel() {\n\t\treturn this.queue.cancelTask(this.file);\n\t}\n\ton(eventName, handler) {\n\t\treturn this.queue.on(eventName, handler);\n\t}\n\tpause() {\n\t\treturn this.queue.pauseTask(this.file);\n\t}\n\tresume() {\n\t\treturn this.queue.resumeTask(this.file);\n\t}\n};\nfunction getErrorCode(error) {\n\tif (error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\") return error.code;\n\treturn \"UPLOAD_ERROR\";\n}\nfunction getErrorMessage(error) {\n\tif (error instanceof Error) return error.message;\n\tif (error && typeof error === \"object\" && \"message\" in error && typeof error.message === \"string\") return error.message;\n\treturn \"文件上传失败\";\n}\nfunction normalizeFileIds(fileIds) {\n\treturn Array.isArray(fileIds) ? fileIds : [fileIds];\n}\n\n//#endregion\nexport { EventEmitter, createUploadFile, createUploader, getFileName, normalizeFiles, validateFiles };\n//# sourceMappingURL=index.js.map","import type { MaybePromise, StsToken, UploadHttpRequest } from '@nec-oss/core'\nimport type {\n OssAdapterOptions,\n OssClientConstructor,\n OssClientOptions,\n OssRefreshStsTokenResult,\n OssRuntimeConfig,\n} from './types'\n\ninterface OssStsRuntimeOptions<TContext> extends OssAdapterOptions {\n stsUrl?: string\n beforeStsTokenReq?: (\n request: UploadHttpRequest,\n context: TContext,\n ) => MaybePromise<UploadHttpRequest>\n beforeStsTokenRes?: (\n response: unknown,\n context: TContext,\n ) => MaybePromise<StsToken>\n requestStsToken?: (\n request: UploadHttpRequest,\n context: TContext,\n ) => MaybePromise<unknown>\n refreshStsUrl?: string\n beforeRefreshStsTokenReq?: (\n request: UploadHttpRequest,\n context: TContext,\n ) => MaybePromise<UploadHttpRequest>\n requestRefreshStsToken?: (\n request: UploadHttpRequest,\n context: TContext,\n ) => MaybePromise<unknown>\n beforeRefreshStsTokenRes?: (\n response: unknown,\n context: TContext,\n ) => MaybePromise<OssRefreshStsTokenResult>\n refreshStsToken?: (context: TContext) => MaybePromise<OssRefreshStsTokenResult>\n}\n\nexport const DEFAULT_OSS_STS_URL = '/education/serverApi/oss-sts/token'\n\nexport function loadOssSdk(options: OssAdapterOptions): Promise<OssClientConstructor> {\n return Promise.resolve(options.loadSdk?.() ?? import('ali-oss').then((module) => module.default))\n}\n\nexport function buildOssClientOptions(\n options: OssAdapterOptions,\n token: StsToken,\n refreshSTSToken?: () => MaybePromise<OssRefreshStsTokenResult>,\n): OssClientOptions {\n const runtimeConfig = resolveRuntimeConfig(options, token)\n\n return {\n accessKeyId: token.accessKeyId,\n accessKeySecret: token.accessKeySecret,\n authorizationV4: options.authorizationV4 ?? true,\n bucket: runtimeConfig.bucket,\n cname: runtimeConfig.cname,\n endpoint: runtimeConfig.endpoint,\n region: runtimeConfig.region,\n ...(refreshSTSToken ? { refreshSTSToken } : {}),\n secure: runtimeConfig.secure,\n stsToken: token.stsToken,\n timeout: options.timeout,\n }\n}\n\nexport function resolveRuntimeConfig(\n options: OssAdapterOptions,\n token: StsToken,\n): OssRuntimeConfig {\n const bucket = options.bucket ?? token.bucket\n const endpoint = options.endpoint ?? token.endpoint\n const region = options.region ?? token.region ?? getRegionFromEndpoint(endpoint)\n\n if (!bucket || !region) {\n throw new Error('OSS 缺少 bucket 或 endpoint/region,请确认 STS 响应或 OSS 配置')\n }\n\n return {\n bucket,\n cname: options.cname ?? token.cname,\n endpoint,\n region,\n secure: options.secure ?? token.secure,\n }\n}\n\nexport function requestAndTransformStsToken<TContext>(\n context: TContext,\n options: OssStsRuntimeOptions<TContext>,\n): Promise<StsToken> {\n const request: UploadHttpRequest = {\n headers: {},\n method: 'GET',\n query: {},\n url: options.stsUrl ?? DEFAULT_OSS_STS_URL,\n }\n\n return Promise.resolve(options.beforeStsTokenReq?.(request, context) ?? request)\n .then((nextRequest) => requestStsToken(nextRequest, context, options))\n .then((stsResponse) => {\n return Promise.resolve(\n options.beforeStsTokenRes?.(stsResponse, context) ??\n defaultTransformStsResponse(stsResponse),\n )\n })\n}\n\nexport function createRefreshStsToken<TContext>(\n context: TContext,\n options: OssStsRuntimeOptions<TContext>,\n): (() => MaybePromise<OssRefreshStsTokenResult>) | undefined {\n if (!options.refreshStsToken && !options.refreshStsUrl) {\n return undefined\n }\n\n if (options.refreshStsToken) {\n const refreshStsToken = options.refreshStsToken\n\n return () => refreshStsToken(context)\n }\n\n return () => requestAndTransformRefreshStsToken(context, options)\n}\n\nexport function getOssRuntimeConfig(token: StsToken): OssRuntimeConfig {\n const region = token.region ?? getRegionFromEndpoint(token.endpoint)\n\n if (!token.bucket || !region) {\n throw new Error('STS 响应缺少 bucket 或 endpoint/region')\n }\n\n return {\n bucket: token.bucket,\n cname: token.cname,\n endpoint: token.endpoint,\n region,\n secure: token.secure,\n }\n}\n\nfunction requestStsToken<TContext>(\n request: UploadHttpRequest,\n context: TContext,\n options: OssStsRuntimeOptions<TContext>,\n): Promise<unknown> {\n return Promise.resolve(options.requestStsToken?.(request, context) ?? sendRequest(request))\n}\n\nfunction requestAndTransformRefreshStsToken<TContext>(\n context: TContext,\n options: OssStsRuntimeOptions<TContext>,\n): Promise<OssRefreshStsTokenResult> {\n const request: UploadHttpRequest = {\n headers: {},\n method: 'GET',\n query: {},\n url: options.refreshStsUrl,\n }\n\n return Promise.resolve(options.beforeRefreshStsTokenReq?.(request, context) ?? request)\n .then((nextRequest) => requestRefreshStsToken(nextRequest, context, options))\n .then((refreshResponse) => {\n return Promise.resolve(\n options.beforeRefreshStsTokenRes?.(refreshResponse, context) ??\n defaultTransformRefreshStsResponse(refreshResponse),\n )\n })\n}\n\nfunction requestRefreshStsToken<TContext>(\n request: UploadHttpRequest,\n context: TContext,\n options: OssStsRuntimeOptions<TContext>,\n): Promise<unknown> {\n return Promise.resolve(options.requestRefreshStsToken?.(request, context) ?? sendRequest(request))\n}\n\nfunction sendRequest(request: UploadHttpRequest): Promise<unknown> {\n if (!request.url) {\n return Promise.reject(new Error('STS 请求地址不能为空'))\n }\n\n const method = request.method ?? 'GET'\n const headers = request.headers ?? {}\n const url = buildUrl(request.url, request.query)\n const init: RequestInit = {\n headers,\n method,\n }\n\n if (method.toUpperCase() !== 'GET' && typeof request.body !== 'undefined') {\n init.body = typeof request.body === 'string' ? request.body : JSON.stringify(request.body)\n init.headers = {\n 'Content-Type': 'application/json',\n ...headers,\n }\n }\n\n return fetch(url, init).then((response) => {\n if (!response.ok) {\n throw new Error(`STS 请求失败:${response.status}`)\n }\n\n return response.json()\n })\n}\n\nfunction defaultTransformRefreshStsResponse(response: unknown): OssRefreshStsTokenResult {\n const token = defaultTransformStsResponse(response)\n\n return {\n accessKeyId: token.accessKeyId,\n accessKeySecret: token.accessKeySecret,\n stsToken: token.stsToken,\n }\n}\n\nfunction defaultTransformStsResponse(response: unknown): StsToken {\n const candidates = [\n response,\n getObjectValue(response, 'data'),\n getObjectValue(getObjectValue(response, 'data'), 'credentials'),\n getObjectValue(response, 'credentials'),\n ]\n\n for (const candidate of candidates) {\n if (!isRecord(candidate)) {\n continue\n }\n\n const accessKeyId = getStringValue(candidate, ['accessKeyId', 'AccessKeyId'])\n const accessKeySecret = getStringValue(candidate, ['accessKeySecret', 'AccessKeySecret'])\n const stsToken = getStringValue(candidate, ['stsToken', 'securityToken', 'SecurityToken'])\n const expiration = getStringValue(candidate, ['expiration', 'Expiration'])\n const bucket = getStringValue(candidate, ['bucket', 'bucketName', 'Bucket', 'BucketName'])\n const endpoint = getStringValue(candidate, ['endpoint', 'Endpoint'])\n const region = getStringValue(candidate, ['region', 'Region']) ?? getRegionFromEndpoint(endpoint)\n const uploadPrefix = getStringValue(candidate, ['uploadPrefix', 'prefix', 'Prefix'])\n\n if (accessKeyId && accessKeySecret && stsToken) {\n return {\n accessKeyId,\n accessKeySecret,\n bucket,\n endpoint,\n expiration,\n region,\n stsToken,\n uploadPrefix,\n }\n }\n }\n\n throw new Error('STS 响应缺少 accessKeyId/accessKeySecret/stsToken,请配置 beforeStsTokenRes')\n}\n\nfunction getRegionFromEndpoint(endpoint?: string): string | undefined {\n if (!endpoint) {\n return undefined\n }\n\n const hostname = getEndpointHostname(endpoint)\n const match = hostname.match(/^(?:[^.]+--)?(oss-[a-z0-9-]+)\\./)\n\n return match?.[1]\n}\n\nfunction getEndpointHostname(endpoint: string): string {\n try {\n return new URL(endpoint).hostname\n } catch {\n return endpoint.replace(/^https?:\\/\\//, '').split('/')[0] ?? endpoint\n }\n}\n\nfunction buildUrl(url: string, query: Record<string, unknown> = {}): string {\n const baseUrl =\n typeof window !== 'undefined' && window.location?.origin\n ? window.location.origin\n : 'http://localhost'\n const targetUrl = new URL(url, baseUrl)\n\n Object.entries(query).forEach(([key, value]) => {\n if (typeof value === 'undefined' || value === null) {\n return\n }\n\n targetUrl.searchParams.set(key, String(value))\n })\n\n return targetUrl.toString()\n}\n\nfunction getObjectValue(source: unknown, key: string): unknown {\n if (!isRecord(source)) {\n return undefined\n }\n\n return source[key]\n}\n\nfunction getStringValue(source: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source[key]\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value)\n }\n }\n\n return undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n","import type {\n AdapterLifecycleContext,\n AdapterUploadContext,\n AdapterUploadResult,\n MaybePromise,\n UploadAdapter,\n} from '@nec-oss/core'\nimport type {\n OssAdapterOptions,\n OssCheckpoint,\n OssClient,\n OssRefreshStsTokenResult,\n} from './types'\nimport { buildOssClientOptions, loadOssSdk } from './runtime'\n\nexport function createOssAdapter(options: OssAdapterOptions): UploadAdapter {\n const runtime = new Map<string, OssRuntime>()\n\n return {\n name: 'oss',\n cancel(context) {\n return cancelUpload(context, runtime)\n },\n pause(context) {\n const item = runtime.get(context.file.id)\n\n item?.cancel?.()\n\n return Promise.resolve()\n },\n resume() {\n return Promise.resolve()\n },\n upload(context) {\n const token = context.prepared.token\n\n if (!token) {\n return Promise.reject(new Error('OSS 上传缺少 STS Token'))\n }\n\n return loadOssSdk(options).then((OssClient) => {\n const refreshSTSToken = getRefreshStsToken(context)\n const client = new OssClient(buildOssClientOptions(options, token, refreshSTSToken))\n\n const runtimeItem: OssRuntime = {\n checkpoint: context.file.checkpoint as OssCheckpoint | undefined,\n client,\n }\n\n runtime.set(context.file.id, runtimeItem)\n\n return runMultipartUpload(context, options, runtimeItem).finally(() => {\n runtime.delete(context.file.id)\n })\n })\n },\n }\n}\n\nfunction getRefreshStsToken(\n context: AdapterUploadContext,\n): (() => MaybePromise<OssRefreshStsTokenResult>) | undefined {\n const refreshSTSToken = context.prepared.extra?.refreshSTSToken\n\n return typeof refreshSTSToken === 'function'\n ? (refreshSTSToken as () => MaybePromise<OssRefreshStsTokenResult>)\n : undefined\n}\n\ninterface OssRuntime {\n checkpoint?: OssCheckpoint\n client: OssClient\n cancel?: () => void\n}\n\nfunction runMultipartUpload(\n context: AdapterUploadContext,\n options: OssAdapterOptions,\n runtime: OssRuntime,\n): Promise<AdapterUploadResult> {\n const params = context.prepared.params\n const uploadOptions: Record<string, unknown> = {\n callback: params.callback,\n checkpoint: runtime.checkpoint,\n headers: params.headers,\n meta: params.meta,\n mime: params.mime,\n parallel: params.parallel ?? options.parallel,\n partSize: params.partSize ?? options.partSize,\n progress(progress: number, checkpoint: OssCheckpoint, raw: unknown) {\n runtime.checkpoint = checkpoint\n context.onProgress({\n checkpoint,\n loaded: Math.round((context.file.size || 0) * progress),\n percent: Math.round(progress * 10000) / 100,\n raw,\n total: context.file.size,\n })\n },\n }\n\n if (typeof AbortController !== 'undefined') {\n context.signal.addEventListener('abort', () => {\n runtime.cancel?.()\n })\n }\n\n const uploadPromise = runtime.client.multipartUpload(params.key, params.file, uploadOptions)\n\n if (uploadPromise && typeof uploadPromise === 'object' && 'cancel' in uploadPromise) {\n runtime.cancel = () => {\n const cancel = uploadPromise.cancel\n\n if (typeof cancel === 'function') {\n cancel.call(uploadPromise)\n }\n }\n }\n\n return Promise.resolve(uploadPromise).then((rawResponse) => ({\n checkpoint: runtime.checkpoint,\n key: params.key,\n rawResponse,\n url: getResponseUrl(rawResponse),\n }))\n}\n\nfunction cancelUpload(\n context: AdapterLifecycleContext,\n runtime: Map<string, OssRuntime>,\n): Promise<void> {\n const runtimeItem = runtime.get(context.file.id)\n const checkpoint = (runtimeItem?.checkpoint ?? context.file.checkpoint) as OssCheckpoint | undefined\n\n runtimeItem?.cancel?.()\n\n if (!runtimeItem?.client || !checkpoint?.name || !checkpoint.uploadId) {\n return Promise.resolve()\n }\n\n return Promise.resolve(runtimeItem.client.abortMultipartUpload(checkpoint.name, checkpoint.uploadId)).then(\n () => undefined,\n )\n}\n\nfunction getResponseUrl(response: unknown): string | undefined {\n if (response && typeof response === 'object' && 'url' in response && typeof response.url === 'string') {\n return response.url\n }\n\n if (\n response &&\n typeof response === 'object' &&\n 'res' in response &&\n response.res &&\n typeof response.res === 'object' &&\n 'requestUrls' in response.res &&\n Array.isArray(response.res.requestUrls)\n ) {\n return response.res.requestUrls[0]\n }\n\n return undefined\n}\n","import type {\n PreparedUpload,\n StsToken,\n UploadContext,\n UploadFile,\n UploadParams,\n UploadProvider,\n} from '@nec-oss/core'\nimport { createOssAdapter } from './adapter'\nimport {\n DEFAULT_OSS_STS_URL,\n createRefreshStsToken,\n getOssRuntimeConfig,\n requestAndTransformStsToken,\n} from './runtime'\nimport type { OssProviderOptions } from './types'\n\nexport { DEFAULT_OSS_STS_URL, getOssRuntimeConfig } from './runtime'\n\nexport function createOssProvider(options: OssProviderOptions = {}): UploadProvider {\n return {\n adapter: createOssAdapter(options),\n name: 'oss',\n prepare(file) {\n const context: UploadContext = {\n file,\n lifecycle: 'sts',\n }\n\n return requestAndTransformStsToken(context, options)\n .then((token) => buildUploadParams(file, token, options))\n },\n transformLifecycleRequest(request, context) {\n return Promise.resolve(options.transformLifecycleRequest?.(request, context) ?? request)\n },\n response(response, context) {\n return Promise.resolve(options.response?.(response, context) ?? response)\n },\n }\n}\n\nfunction buildUploadParams(\n file: UploadFile,\n token: StsToken,\n options: OssProviderOptions,\n): Promise<PreparedUpload> {\n const context: UploadContext = {\n file,\n lifecycle: 'upload',\n token,\n }\n\n return Promise.resolve(options.keyResolver?.(file, context) ?? defaultKeyResolver(file, token, options)).then((key) => {\n const refreshContext: UploadContext = {\n file,\n lifecycle: 'sts',\n }\n const refreshSTSToken = createRefreshStsToken(refreshContext, options)\n const params: UploadParams = {\n callback: options.callback,\n extra: {\n ...(options.extra ?? {}),\n ...(refreshSTSToken ? { refreshSTSToken } : {}),\n token,\n },\n file: file.file,\n headers: {},\n key,\n meta: {},\n mime: options.mime ?? file.type,\n parallel: options.parallel,\n partSize: options.partSize,\n }\n\n const uploadContext: UploadContext = {\n file,\n lifecycle: 'upload',\n params,\n token,\n }\n\n return Promise.resolve(options.beforeUploadReq?.(params, uploadContext) ?? params).then(\n (nextParams) => ({\n extra: {\n ...(refreshSTSToken ? { refreshSTSToken } : {}),\n token,\n },\n params: nextParams,\n token,\n }),\n )\n })\n}\n\nfunction defaultKeyResolver(file: UploadFile, token: StsToken, options: OssProviderOptions): string {\n const safeName = file.name.replace(/^\\.+/, '').replace(/[^\\w.\\\\/=-]+/g, '-')\n const prefix = options.uploadPrefix\n ? normalizePrefix(options.uploadPrefix)\n : token.uploadPrefix\n ? normalizePrefix(token.uploadPrefix)\n : 'uploads/'\n\n return `${prefix}${Date.now()}-${safeName}`\n}\n\nfunction normalizePrefix(prefix: string): string {\n if (!prefix) {\n return ''\n }\n\n return prefix.endsWith('/') ? prefix : `${prefix}/`\n}\n","import { buildOssClientOptions, createRefreshStsToken, loadOssSdk, requestAndTransformStsToken } from './runtime'\n\nimport type { CreateOssClientOptions, OssClient, OssClientContext } from './types'\n\nexport function createOssClient(options: CreateOssClientOptions = {}): Promise<OssClient> {\n const context: OssClientContext = {\n lifecycle: 'sts',\n }\n\n return requestAndTransformStsToken(context, options).then((token) => {\n const refreshSTSToken = createRefreshStsToken(context, options)\n\n return loadOssSdk(options).then((OssClient) => {\n return new OssClient(buildOssClientOptions(options, token, refreshSTSToken))\n })\n })\n}\n","import { createUploader as createCoreUploader } from '@nec-oss/core'\n\nimport { createOssProvider } from './oss'\n\nimport type { Uploader, UploaderOptions } from '@nec-oss/core'\nimport type { OssProviderOptions } from './oss'\n\nexport type CreateOssUploaderOptions = Partial<UploaderOptions>\n\nlet defaultOssProviderOptions: OssProviderOptions = {}\n\nexport function createOssUploader(options: CreateOssUploaderOptions = {}): Uploader {\n return createCoreUploader({\n ...options,\n provider: options.provider ?? createOssProvider(defaultOssProviderOptions),\n })\n}\n\nexport function setDefaultOssProviderOptions(options: OssProviderOptions): void {\n defaultOssProviderOptions = options\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nec-oss",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./dist/index.js",
|
|
7
|
+
"./package.json": "./package.json"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"unpkg": "./dist/nec-oss.iife.js",
|
|
13
|
+
"jsdelivr": "./dist/nec-oss.iife.js",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsdown",
|
|
19
|
+
"dev": "tsdown --watch",
|
|
20
|
+
"lint": "tsc --noEmit",
|
|
21
|
+
"test": "vitest run --passWithNoTests",
|
|
22
|
+
"typecheck": "tsc --noEmit"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"ali-oss": "^6.23.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@nec-oss/core": "workspace:*",
|
|
29
|
+
"tsdown": "^0.17.0",
|
|
30
|
+
"typescript": "^5.9.3",
|
|
31
|
+
"vitest": "^4.0.13"
|
|
32
|
+
}
|
|
33
|
+
}
|