@uploadista/data-store-filesystem 0.1.3 → 0.2.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.
Files changed (2) hide show
  1. package/dist/index.cjs +1 -1
  2. package/package.json +7 -7
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:fs/promises`);l=s(l);let u=require(`node:path`);u=s(u);let d=require(`@uploadista/core/errors`),f=require(`@uploadista/core/types`),p=require(`@uploadista/observability`),m=require(`effect`);const h=e=>m.Effect.tryPromise({try:()=>l.default.mkdir(e,{mode:`0777`,recursive:!0}),catch:e=>e instanceof Error&&`code`in e&&e.code===`EEXIST`?new d.UploadistaError({code:`UNKNOWN_ERROR`,status:200,body:`Directory already exists`,details:`Directory already exists`}):new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create directory`,details:`Directory creation failed: ${String(e)}`})}).pipe(m.Effect.orElse(()=>m.Effect.void)),g=(e,t)=>m.Effect.sync(()=>c.default.createWriteStream(e,{flags:`r+`,start:t})),_=({writeStream:e,bytesReceived:t,onProgress:n})=>r=>m.Effect.gen(function*(){yield*m.Effect.async(t=>{e.write(r,e=>{t(e?m.Effect.fail(new d.UploadistaError({code:`FILE_WRITE_ERROR`,status:500,body:`Failed to write chunk`,details:`Chunk write failed: ${String(e)}`})):m.Effect.succeed(void 0))})}),yield*m.Ref.update(t,e=>e+r.length),n?.(r.length)}),v=e=>m.Effect.async(t=>{e.end(e=>{t(e?m.Effect.fail(new d.UploadistaError({code:`FILE_WRITE_ERROR`,status:500,body:`Failed to close write stream`,details:`Stream close failed: ${String(e)}`})):m.Effect.succeed(void 0))})}),y=e=>m.Effect.sync(()=>{e.destroyed||e.destroy()}),b=({directory:e,deliveryUrl:t})=>m.Effect.gen(function*(){yield*h(e);let n=yield*f.UploadFileKVStore,r=()=>({supportsParallelUploads:!1,supportsConcatenation:!1,supportsDeferredLength:!0,supportsResumableUploads:!0,supportsTransactionalUploads:!1,supportsStreamingRead:!0,supportsStreamingWrite:!0,maxConcurrentUploads:1,minChunkSize:void 0,maxChunkSize:void 0,maxParts:void 0,optimalChunkSize:1024*1024,requiresOrderedChunks:!0,requiresMimeTypeValidation:!0,maxValidationSize:void 0});return{bucket:e,create:r=>{let i=(r.metadata?.fileName?.toString())?.split(`.`).pop(),a=r.id.split(`/`).slice(0,-1),o=u.default.join(e,i?`${r.id}.${i}`:r.id);return m.Effect.gen(function*(){yield*(0,p.filesystemUploadRequestsTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(1)),yield*(0,p.filesystemFileSizeHistogram)(m.Effect.succeed(r.size||0)),yield*m.Effect.tryPromise({try:()=>l.default.mkdir(u.default.join(e,...a),{recursive:!0}),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`create`,e,{upload_id:r.id,path:o})),new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create file directory`,details:`Directory creation failed: ${String(e)}`}))}),yield*m.Effect.tryPromise({try:()=>l.default.writeFile(o,``),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`create`,e,{upload_id:r.id,path:o})),new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create file`,details:`File creation failed: ${String(e)}`}))});let s=i?`${r.id}.${i}`:r.id;return r.storage={id:s,type:r.storage.type,path:o,bucket:e},r.url=`${t}/${s}`,yield*n.set(r.id,r),r})},remove:t=>m.Effect.gen(function*(){let r=(yield*n.get(t)).storage.path||u.default.join(e,t);yield*m.Effect.tryPromise({try:()=>l.default.unlink(r),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`remove`,e,{upload_id:t,path:r})),d.UploadistaError.fromCode(`FILE_NOT_FOUND`))}),yield*n.delete(t),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(-1))}),write:({file_id:t,stream:r,offset:i},{onProgress:a})=>(0,p.withFilesystemUploadMetrics)(t,(0,p.withFilesystemTimingMetrics)(p.filesystemUploadDurationHistogram,m.Effect.gen(function*(){let o=Date.now(),s=yield*n.get(t),c=s.storage.path||u.default.join(e,t),l=yield*m.Ref.make(0);try{let e=yield*m.Effect.acquireUseRelease(g(c,i),e=>m.Effect.gen(function*(){let t=m.Sink.forEach(_({writeStream:e,bytesReceived:l,onProgress:a}));yield*(0,p.filesystemUploadPartsTotal)(m.Effect.succeed(1)),yield*m.Stream.run(r,t),yield*v(e);let n=yield*m.Ref.get(l);return yield*(0,p.filesystemPartSizeHistogram)(m.Effect.succeed(n)),i+n}),y);return s.size&&e===s.size&&(yield*(0,p.logFilesystemUploadCompletion)(t,{fileSize:s.size,totalDurationMs:Date.now()-o,partsCount:1,averagePartSize:s.size,throughputBps:s.size/(Date.now()-o),retryCount:0}),yield*(0,p.filesystemUploadSuccessTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(-1))),e}catch(e){throw m.Effect.runSync((0,p.trackFilesystemError)(`write`,e,{upload_id:t,path:c,offset:i})),e}}))),getUpload:t=>m.Effect.gen(function*(){let r=yield*n.get(t),i=r.storage.path||u.default.join(e,t),a=yield*m.Effect.tryPromise({try:()=>l.default.stat(i),catch:()=>d.UploadistaError.fromCode(`FILE_NOT_FOUND`)});return{...r,offset:a.size,size:r.size}}),read:t=>m.Effect.gen(function*(){let r=(yield*n.get(t)).storage.path||u.default.join(e,t),i=yield*m.Effect.tryPromise({try:()=>l.default.readFile(r),catch:()=>d.UploadistaError.fromCode(`FILE_READ_ERROR`)});return new Uint8Array(i)}),readStream:(t,r)=>m.Effect.gen(function*(){let i=(yield*n.get(t)).storage.path||u.default.join(e,t),a={...f.DEFAULT_STREAMING_CONFIG,...r};yield*m.Effect.tryPromise({try:()=>l.default.access(i,c.default.constants.R_OK),catch:()=>d.UploadistaError.fromCode(`FILE_NOT_FOUND`)});let o=c.default.createReadStream(i,{highWaterMark:a.chunkSize});return m.Stream.async(e=>(o.on(`data`,t=>{let n=typeof t==`string`?Buffer.from(t):t;e.single(new Uint8Array(n))}),o.on(`end`,()=>{e.end()}),o.on(`error`,t=>{e.fail(new d.UploadistaError({code:`FILE_READ_ERROR`,status:500,body:`Failed to read file stream`,details:`Stream read failed: ${String(t)}`}))}),m.Effect.sync(()=>{o.destroyed||o.destroy()})))}),writeStream:(t,n)=>(0,p.withFilesystemTimingMetrics)(p.filesystemUploadDurationHistogram,m.Effect.gen(function*(){let r=Date.now(),i=t.split(`/`).slice(0,-1),a=u.default.join(e,t);yield*(0,p.filesystemUploadRequestsTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(1)),i.length>0&&(yield*m.Effect.tryPromise({try:()=>l.default.mkdir(u.default.join(e,...i),{recursive:!0}),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`writeStream`,e,{upload_id:t,path:a})),new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create file directory`,details:`Directory creation failed: ${String(e)}`}))}));let o=yield*m.Ref.make(0),s=yield*m.Effect.acquireUseRelease((e=>m.Effect.sync(()=>c.default.createWriteStream(e,{flags:`w`})))(a),e=>m.Effect.gen(function*(){let t=m.Sink.forEach(_({writeStream:e,bytesReceived:o}));yield*(0,p.filesystemUploadPartsTotal)(m.Effect.succeed(1)),yield*m.Stream.run(n.stream,t),yield*v(e);let r=yield*m.Ref.get(o);return yield*(0,p.filesystemPartSizeHistogram)(m.Effect.succeed(r)),r}),y);return yield*(0,p.logFilesystemUploadCompletion)(t,{fileSize:s,totalDurationMs:Date.now()-r,partsCount:1,averagePartSize:s,throughputBps:s/Math.max(1,Date.now()-r),retryCount:0}),yield*(0,p.filesystemUploadSuccessTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(-1)),yield*(0,p.filesystemFileSizeHistogram)(m.Effect.succeed(s)),{id:t,size:s,path:a,bucket:e}})),getCapabilities:r,validateUploadStrategy:e=>{let t=r();switch(e){case`parallel`:return m.Effect.succeed(t.supportsParallelUploads);case`single`:return m.Effect.succeed(!0);default:return m.Effect.succeed(!1)}}}});exports.fileStore=b;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:fs/promises`);l=s(l);let u=require(`node:path`);u=s(u);let d=require(`@uploadista/core/errors`),f=require(`@uploadista/core/types`),p=require(`@uploadista/observability`),m=require(`effect`);const h=e=>m.Effect.tryPromise({try:()=>l.default.mkdir(e,{mode:`0777`,recursive:!0}),catch:e=>e instanceof Error&&`code`in e&&e.code===`EEXIST`?new d.UploadistaError({code:`UNKNOWN_ERROR`,status:200,body:`Directory already exists`,details:`Directory already exists`}):new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create directory`,details:`Directory creation failed: ${String(e)}`})}).pipe(m.Effect.orElse(()=>m.Effect.void)),g=(e,t)=>m.Effect.sync(()=>c.default.createWriteStream(e,{flags:`r+`,start:t})),_=({writeStream:e,bytesReceived:t,onProgress:n})=>r=>m.Effect.gen(function*(){yield*m.Effect.async(t=>{e.write(r,e=>{t(e?m.Effect.fail(new d.UploadistaError({code:`FILE_WRITE_ERROR`,status:500,body:`Failed to write chunk`,details:`Chunk write failed: ${String(e)}`})):m.Effect.succeed(void 0))})}),yield*m.Ref.update(t,e=>e+r.length),n?.(r.length)}),v=e=>m.Effect.async(t=>{e.end(e=>{t(e?m.Effect.fail(new d.UploadistaError({code:`FILE_WRITE_ERROR`,status:500,body:`Failed to close write stream`,details:`Stream close failed: ${String(e)}`})):m.Effect.succeed(void 0))})}),y=e=>m.Effect.sync(()=>{e.destroyed||e.destroy()}),b=({directory:e,deliveryUrl:t})=>m.Effect.gen(function*(){yield*h(e);let n=yield*f.UploadFileKVStore,r=()=>({supportsParallelUploads:!1,supportsConcatenation:!1,supportsDeferredLength:!0,supportsResumableUploads:!0,supportsTransactionalUploads:!1,supportsStreamingRead:!0,supportsStreamingWrite:!0,maxConcurrentUploads:1,minChunkSize:void 0,maxChunkSize:void 0,maxParts:void 0,optimalChunkSize:1024*1024,requiresOrderedChunks:!0,requiresMimeTypeValidation:!0,maxValidationSize:void 0});return{bucket:e,create:r=>{let i=(r.metadata?.fileName?.toString())?.split(`.`).pop(),a=r.id.split(`/`).slice(0,-1),o=u.default.join(e,i?`${r.id}.${i}`:r.id);return m.Effect.gen(function*(){yield*(0,p.filesystemUploadRequestsTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(1)),yield*(0,p.filesystemFileSizeHistogram)(m.Effect.succeed(r.size||0)),yield*m.Effect.tryPromise({try:()=>l.default.mkdir(u.default.join(e,...a),{recursive:!0}),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`create`,e,{upload_id:r.id,path:o})),new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create file directory`,details:`Directory creation failed: ${String(e)}`}))}),yield*m.Effect.tryPromise({try:()=>l.default.writeFile(o,``),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`create`,e,{upload_id:r.id,path:o})),new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create file`,details:`File creation failed: ${String(e)}`}))});let s=i?`${r.id}.${i}`:r.id;return r.storage={id:s,type:r.storage.type,path:o,bucket:e},r.url=`${t}/${s}`,yield*n.set(r.id,r),r})},remove:t=>m.Effect.gen(function*(){let r=(yield*n.get(t)).storage.path||u.default.join(e,t);yield*m.Effect.tryPromise({try:()=>l.default.unlink(r),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`remove`,e,{upload_id:t,path:r})),d.UploadistaError.fromCode(`FILE_NOT_FOUND`))}),yield*n.delete(t),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(-1))}),write:({file_id:t,stream:r,offset:i},{onProgress:a})=>(0,p.withFilesystemUploadMetrics)(t,(0,p.withFilesystemTimingMetrics)(p.filesystemUploadDurationHistogram,m.Effect.gen(function*(){let o=Date.now(),s=yield*n.get(t),c=s.storage.path||u.default.join(e,t),l=yield*m.Ref.make(0);try{let e=yield*m.Effect.acquireUseRelease(g(c,i),e=>m.Effect.gen(function*(){let t=m.Sink.forEach(_({writeStream:e,bytesReceived:l,onProgress:a}));yield*(0,p.filesystemUploadPartsTotal)(m.Effect.succeed(1)),yield*m.Stream.run(r,t),yield*v(e);let n=yield*m.Ref.get(l);return yield*(0,p.filesystemPartSizeHistogram)(m.Effect.succeed(n)),i+n}),y);return s.size&&e===s.size&&(yield*(0,p.logFilesystemUploadCompletion)(t,{fileSize:s.size,totalDurationMs:Date.now()-o,partsCount:1,averagePartSize:s.size,throughputBps:s.size/(Date.now()-o),retryCount:0}),yield*(0,p.filesystemUploadSuccessTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(-1))),e}catch(e){throw m.Effect.runSync((0,p.trackFilesystemError)(`write`,e,{upload_id:t,path:c,offset:i})),e}}))),getUpload:t=>m.Effect.gen(function*(){let r=yield*n.get(t),i=r.storage.path||u.default.join(e,t),a=yield*m.Effect.tryPromise({try:()=>l.default.stat(i),catch:()=>d.UploadistaError.fromCode(`FILE_NOT_FOUND`)});return{...r,offset:a.size,size:r.size}}),read:t=>m.Effect.gen(function*(){let r=(yield*n.get(t)).storage.path||u.default.join(e,t),i=yield*m.Effect.tryPromise({try:()=>l.default.readFile(r),catch:()=>d.UploadistaError.fromCode(`FILE_READ_ERROR`)});return new Uint8Array(i)}),readStream:(t,r)=>m.Effect.gen(function*(){let i=(yield*n.get(t)).storage.path||u.default.join(e,t),a={...f.DEFAULT_STREAMING_CONFIG,...r};yield*m.Effect.tryPromise({try:()=>l.default.access(i,c.default.constants.R_OK),catch:()=>d.UploadistaError.fromCode(`FILE_NOT_FOUND`)});let o=c.default.createReadStream(i,{highWaterMark:a.chunkSize});return m.Stream.async(e=>(o.on(`data`,t=>{let n=typeof t==`string`?Buffer.from(t):t;e.single(new Uint8Array(n))}),o.on(`end`,()=>{e.end()}),o.on(`error`,t=>{e.fail(new d.UploadistaError({code:`FILE_READ_ERROR`,status:500,body:`Failed to read file stream`,details:`Stream read failed: ${String(t)}`}))}),m.Effect.sync(()=>{o.destroyed||o.destroy()})))}),writeStream:(t,n)=>(0,p.withFilesystemTimingMetrics)(p.filesystemUploadDurationHistogram,m.Effect.gen(function*(){let r=Date.now(),i=t.split(`/`).slice(0,-1),a=u.default.join(e,t);yield*(0,p.filesystemUploadRequestsTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(1)),i.length>0&&(yield*m.Effect.tryPromise({try:()=>l.default.mkdir(u.default.join(e,...i),{recursive:!0}),catch:e=>(m.Effect.runSync((0,p.trackFilesystemError)(`writeStream`,e,{upload_id:t,path:a})),new d.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Failed to create file directory`,details:`Directory creation failed: ${String(e)}`}))}));let o=yield*m.Ref.make(0),s=yield*m.Effect.acquireUseRelease((e=>m.Effect.sync(()=>c.default.createWriteStream(e,{flags:`w`})))(a),e=>m.Effect.gen(function*(){let t=m.Sink.forEach(_({writeStream:e,bytesReceived:o}));yield*(0,p.filesystemUploadPartsTotal)(m.Effect.succeed(1)),yield*m.Stream.run(n.stream,t),yield*v(e);let r=yield*m.Ref.get(o);return yield*(0,p.filesystemPartSizeHistogram)(m.Effect.succeed(r)),r}),y);return yield*(0,p.logFilesystemUploadCompletion)(t,{fileSize:s,totalDurationMs:Date.now()-r,partsCount:1,averagePartSize:s,throughputBps:s/Math.max(1,Date.now()-r),retryCount:0}),yield*(0,p.filesystemUploadSuccessTotal)(m.Effect.succeed(1)),yield*(0,p.filesystemActiveUploadsGauge)(m.Effect.succeed(-1)),yield*(0,p.filesystemFileSizeHistogram)(m.Effect.succeed(s)),{id:t,size:s,path:a,bucket:e}})),getCapabilities:r,validateUploadStrategy:e=>{let t=r();switch(e){case`parallel`:return m.Effect.succeed(t.supportsParallelUploads);case`single`:return m.Effect.succeed(!0);default:return m.Effect.succeed(!1)}}}});exports.fileStore=b;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uploadista/data-store-filesystem",
3
3
  "type": "module",
4
- "version": "0.1.3",
4
+ "version": "0.2.0",
5
5
  "description": "File system data store for Uploadista",
6
6
  "license": "MIT",
7
7
  "author": "Uploadista",
@@ -14,8 +14,8 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "@uploadista/core": "0.1.3",
18
- "@uploadista/observability": "0.1.3"
17
+ "@uploadista/core": "0.2.0",
18
+ "@uploadista/observability": "0.2.0"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "effect": "^3.0.0"
@@ -23,11 +23,11 @@
23
23
  "devDependencies": {
24
24
  "@effect/vitest": "0.27.0",
25
25
  "@types/node": "24.10.9",
26
- "effect": "3.19.15",
27
- "tsdown": "0.20.1",
26
+ "effect": "3.19.17",
27
+ "tsdown": "0.20.3",
28
28
  "vitest": "4.0.18",
29
- "@uploadista/kv-store-memory": "0.1.3",
30
- "@uploadista/typescript-config": "0.1.3"
29
+ "@uploadista/typescript-config": "0.2.0",
30
+ "@uploadista/kv-store-memory": "0.2.0"
31
31
  },
32
32
  "scripts": {
33
33
  "build": "tsc --noEmit && tsdown",