@vankyle/storage-azure 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.
Files changed (66) hide show
  1. package/README.md +123 -0
  2. package/dist/index.d.ts +5 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +3 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/metadata/cosmos-metadata-store.d.ts +14 -0
  7. package/dist/metadata/cosmos-metadata-store.d.ts.map +1 -0
  8. package/dist/metadata/cosmos-metadata-store.js +39 -0
  9. package/dist/metadata/cosmos-metadata-store.js.map +1 -0
  10. package/dist/metadata/index.d.ts +5 -0
  11. package/dist/metadata/index.d.ts.map +1 -0
  12. package/dist/metadata/index.js +5 -0
  13. package/dist/metadata/index.js.map +1 -0
  14. package/dist/metadata/mappers/blob-doc.mapper.d.ts +30 -0
  15. package/dist/metadata/mappers/blob-doc.mapper.d.ts.map +1 -0
  16. package/dist/metadata/mappers/blob-doc.mapper.js +28 -0
  17. package/dist/metadata/mappers/blob-doc.mapper.js.map +1 -0
  18. package/dist/metadata/mappers/file-doc.mapper.d.ts +33 -0
  19. package/dist/metadata/mappers/file-doc.mapper.d.ts.map +1 -0
  20. package/dist/metadata/mappers/file-doc.mapper.js +31 -0
  21. package/dist/metadata/mappers/file-doc.mapper.js.map +1 -0
  22. package/dist/metadata/mappers/index.d.ts +4 -0
  23. package/dist/metadata/mappers/index.d.ts.map +1 -0
  24. package/dist/metadata/mappers/index.js +4 -0
  25. package/dist/metadata/mappers/index.js.map +1 -0
  26. package/dist/metadata/mappers/upload-session-doc.mapper.d.ts +40 -0
  27. package/dist/metadata/mappers/upload-session-doc.mapper.d.ts.map +1 -0
  28. package/dist/metadata/mappers/upload-session-doc.mapper.js +38 -0
  29. package/dist/metadata/mappers/upload-session-doc.mapper.js.map +1 -0
  30. package/dist/metadata/stores/cosmos-blob-store.d.ts +16 -0
  31. package/dist/metadata/stores/cosmos-blob-store.d.ts.map +1 -0
  32. package/dist/metadata/stores/cosmos-blob-store.js +109 -0
  33. package/dist/metadata/stores/cosmos-blob-store.js.map +1 -0
  34. package/dist/metadata/stores/cosmos-file-store.d.ts +15 -0
  35. package/dist/metadata/stores/cosmos-file-store.d.ts.map +1 -0
  36. package/dist/metadata/stores/cosmos-file-store.js +114 -0
  37. package/dist/metadata/stores/cosmos-file-store.js.map +1 -0
  38. package/dist/metadata/stores/cosmos-upload-session-store.d.ts +14 -0
  39. package/dist/metadata/stores/cosmos-upload-session-store.d.ts.map +1 -0
  40. package/dist/metadata/stores/cosmos-upload-session-store.js +105 -0
  41. package/dist/metadata/stores/cosmos-upload-session-store.js.map +1 -0
  42. package/dist/metadata/stores/index.d.ts +4 -0
  43. package/dist/metadata/stores/index.d.ts.map +1 -0
  44. package/dist/metadata/stores/index.js +4 -0
  45. package/dist/metadata/stores/index.js.map +1 -0
  46. package/dist/storage/azure-blob-storage.d.ts +23 -0
  47. package/dist/storage/azure-blob-storage.d.ts.map +1 -0
  48. package/dist/storage/azure-blob-storage.js +255 -0
  49. package/dist/storage/azure-blob-storage.js.map +1 -0
  50. package/dist/storage/index.d.ts +2 -0
  51. package/dist/storage/index.d.ts.map +1 -0
  52. package/dist/storage/index.js +2 -0
  53. package/dist/storage/index.js.map +1 -0
  54. package/dist/types/azure-options.d.ts +9 -0
  55. package/dist/types/azure-options.d.ts.map +1 -0
  56. package/dist/types/azure-options.js +2 -0
  57. package/dist/types/azure-options.js.map +1 -0
  58. package/dist/types/cosmos-options.d.ts +7 -0
  59. package/dist/types/cosmos-options.d.ts.map +1 -0
  60. package/dist/types/cosmos-options.js +2 -0
  61. package/dist/types/cosmos-options.js.map +1 -0
  62. package/dist/types/index.d.ts +3 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +2 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,123 @@
1
+ # @vankyle-hub/storage-azure
2
+
3
+ `IStorage` and `IMetadataStore` implementations for the Azure ecosystem.
4
+
5
+ ## What's included
6
+
7
+ | Class | Interface | Backend |
8
+ |---|---|---|
9
+ | `AzureBlobStorage` | `IStorage` | Azure Blob Storage |
10
+ | `CosmosMetadataStore` | `IMetadataStore` | Azure Cosmos DB |
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ pnpm add @vankyle-hub/storage-azure @vankyle-hub/storage-core @vankyle-hub/storage-shared
16
+ ```
17
+
18
+ ## Azure Blob Storage
19
+
20
+ ### Setup
21
+
22
+ ```typescript
23
+ import { AzureBlobStorage } from "@vankyle-hub/storage-azure";
24
+
25
+ // Option 1: connection string
26
+ const storage = new AzureBlobStorage({
27
+ connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,
28
+ });
29
+
30
+ // Option 2: account name + key
31
+ const storage = new AzureBlobStorage({
32
+ accountName: process.env.AZURE_STORAGE_ACCOUNT!,
33
+ accountKey: process.env.AZURE_STORAGE_KEY!,
34
+ });
35
+
36
+ // Option 3: pre-constructed BlobServiceClient
37
+ import { BlobServiceClient } from "@azure/storage-blob";
38
+ const storage = new AzureBlobStorage({
39
+ blobServiceClient: new BlobServiceClient(url, credential),
40
+ });
41
+ ```
42
+
43
+ ### Capabilities
44
+
45
+ | Capability | Supported |
46
+ |---|---|
47
+ | `multipartUpload` | ✓ (via Block Blob staging) |
48
+ | `signedReadUrl` | ✓ (SAS token) |
49
+ | `signedPutUrl` | ✓ (SAS token) |
50
+ | `signedPartUrl` | ✗ |
51
+
52
+ > Signed URLs require a `StorageSharedKeyCredential`. If you initialize with a pre-built `BlobServiceClient` that uses a different credential type, `createReadUrl` and `createPutUrl` will throw `CapabilityNotSupportedError`.
53
+
54
+ ### Multipart upload
55
+
56
+ Azure Blob Storage does not have a native multipart upload API. `AzureBlobStorage` simulates it using [Block Blob staging](https://learn.microsoft.com/azure/storage/blobs/storage-blob-block-blob-upload):
57
+
58
+ | `IStorage` method | Azure API |
59
+ |---|---|
60
+ | `initUploadSession` | Generates a session UUID (no API call needed) |
61
+ | `uploadPart` | `stageBlock` — block ID is base64 of the part number |
62
+ | `completeUploadSession` | `commitBlockList` — blocks sorted by `partNumber` |
63
+ | `abortUploadSession` | No-op (Azure auto-discards uncommitted blocks) |
64
+
65
+ ## Cosmos DB Metadata Store
66
+
67
+ All six entity types (`upload-session`, `uploaded-part`, `blob`, `blob-reference`, `file`, `file-version`) are stored in a **single Cosmos container**, discriminated by a `type` field.
68
+
69
+ ### Setup
70
+
71
+ ```typescript
72
+ import { CosmosMetadataStore } from "@vankyle-hub/storage-azure";
73
+
74
+ // Option 1: connection string
75
+ const metadata = new CosmosMetadataStore({
76
+ connectionString: process.env.COSMOS_CONNECTION_STRING!,
77
+ databaseId: "my-database",
78
+ });
79
+
80
+ // Option 2: endpoint + key
81
+ const metadata = new CosmosMetadataStore({
82
+ endpoint: process.env.COSMOS_ENDPOINT!,
83
+ key: process.env.COSMOS_KEY!,
84
+ databaseId: "my-database",
85
+ });
86
+ ```
87
+
88
+ The default container ID is `"storage"`. The container must exist before first use and must have `/id` as the partition key.
89
+
90
+ ### Options reference
91
+
92
+ ```typescript
93
+ interface CosmosMetadataOptions {
94
+ /** Full connection string (alternative to endpoint+key) */
95
+ connectionString?: string;
96
+ /** Cosmos DB account endpoint */
97
+ endpoint?: string;
98
+ /** Cosmos DB account key */
99
+ key?: string;
100
+ /** Database ID (required) */
101
+ databaseId: string;
102
+ /** Container ID — defaults to "storage" */
103
+ containerId?: string;
104
+ }
105
+ ```
106
+
107
+ ## Using both together
108
+
109
+ ```typescript
110
+ import { AzureBlobStorage, CosmosMetadataStore } from "@vankyle-hub/storage-azure";
111
+ import { DefaultStorageService } from "@vankyle-hub/storage-core";
112
+
113
+ const service = new DefaultStorageService({
114
+ storage: new AzureBlobStorage({
115
+ connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING!,
116
+ }),
117
+ metadata: new CosmosMetadataStore({
118
+ connectionString: process.env.COSMOS_CONNECTION_STRING!,
119
+ databaseId: "storage-db",
120
+ }),
121
+ bucket: process.env.AZURE_CONTAINER!,
122
+ });
123
+ ```
@@ -0,0 +1,5 @@
1
+ export { AzureBlobStorage } from "./storage/index.js";
2
+ export { CosmosMetadataStore } from "./metadata/index.js";
3
+ export type { AzureBlobStorageOptions } from "./types/azure-options.js";
4
+ export type { CosmosMetadataOptions } from "./types/cosmos-options.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { AzureBlobStorage } from "./storage/index.js";
2
+ export { CosmosMetadataStore } from "./metadata/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type Container } from "@azure/cosmos";
2
+ import type { IMetadataStore } from "@vankyle-hub/storage-core";
3
+ import type { CosmosMetadataOptions } from "../types/cosmos-options.js";
4
+ import { CosmosUploadSessionStore } from "./stores/cosmos-upload-session-store.js";
5
+ import { CosmosBlobStore } from "./stores/cosmos-blob-store.js";
6
+ import { CosmosFileStore } from "./stores/cosmos-file-store.js";
7
+ export declare class CosmosMetadataStore implements IMetadataStore {
8
+ readonly uploads: CosmosUploadSessionStore;
9
+ readonly blobs: CosmosBlobStore;
10
+ readonly files: CosmosFileStore;
11
+ constructor(container: Container);
12
+ constructor(options: CosmosMetadataOptions, containerId?: string);
13
+ }
14
+ //# sourceMappingURL=cosmos-metadata-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosmos-metadata-store.d.ts","sourceRoot":"","sources":["../../src/metadata/cosmos-metadata-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIhE,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;gBAEpB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,qBAAqB,EAAE,WAAW,CAAC,EAAE,MAAM;CAmCjE"}
@@ -0,0 +1,39 @@
1
+ import { CosmosClient } from "@azure/cosmos";
2
+ import { CosmosUploadSessionStore } from "./stores/cosmos-upload-session-store.js";
3
+ import { CosmosBlobStore } from "./stores/cosmos-blob-store.js";
4
+ import { CosmosFileStore } from "./stores/cosmos-file-store.js";
5
+ const DEFAULT_CONTAINER_ID = "storage";
6
+ export class CosmosMetadataStore {
7
+ uploads;
8
+ blobs;
9
+ files;
10
+ constructor(containerOrOptions, containerId) {
11
+ let container;
12
+ if ("items" in containerOrOptions) {
13
+ container = containerOrOptions;
14
+ }
15
+ else {
16
+ const options = containerOrOptions;
17
+ let client;
18
+ if (options.connectionString) {
19
+ client = new CosmosClient(options.connectionString);
20
+ }
21
+ else if (options.endpoint && options.key) {
22
+ client = new CosmosClient({
23
+ endpoint: options.endpoint,
24
+ key: options.key,
25
+ });
26
+ }
27
+ else {
28
+ throw new Error("CosmosMetadataStore requires connectionString or endpoint+key");
29
+ }
30
+ container = client
31
+ .database(options.databaseId)
32
+ .container(containerId ?? DEFAULT_CONTAINER_ID);
33
+ }
34
+ this.uploads = new CosmosUploadSessionStore(container);
35
+ this.blobs = new CosmosBlobStore(container);
36
+ this.files = new CosmosFileStore(container);
37
+ }
38
+ }
39
+ //# sourceMappingURL=cosmos-metadata-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosmos-metadata-store.js","sourceRoot":"","sources":["../../src/metadata/cosmos-metadata-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAEvC,MAAM,OAAO,mBAAmB;IACrB,OAAO,CAA2B;IAClC,KAAK,CAAkB;IACvB,KAAK,CAAkB;IAIhC,YACE,kBAAqD,EACrD,WAAoB;QAEpB,IAAI,SAAoB,CAAC;QAEzB,IAAI,OAAO,IAAI,kBAAkB,EAAE,CAAC;YAClC,SAAS,GAAG,kBAA+B,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACnC,IAAI,MAAoB,CAAC;YAEzB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC7B,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC3C,MAAM,GAAG,IAAI,YAAY,CAAC;oBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;YACJ,CAAC;YAED,SAAS,GAAG,MAAM;iBACf,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC;iBAC5B,SAAS,CAAC,WAAW,IAAI,oBAAoB,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,wBAAwB,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { CosmosMetadataStore } from "./cosmos-metadata-store.js";
2
+ export { CosmosUploadSessionStore } from "./stores/cosmos-upload-session-store.js";
3
+ export { CosmosBlobStore } from "./stores/cosmos-blob-store.js";
4
+ export { CosmosFileStore } from "./stores/cosmos-file-store.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { CosmosMetadataStore } from "./cosmos-metadata-store.js";
2
+ export { CosmosUploadSessionStore } from "./stores/cosmos-upload-session-store.js";
3
+ export { CosmosBlobStore } from "./stores/cosmos-blob-store.js";
4
+ export { CosmosFileStore } from "./stores/cosmos-file-store.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { JsonObject } from "@vankyle-hub/storage-shared";
2
+ import type { Blob, BlobReference } from "@vankyle-hub/storage-core";
3
+ export interface BlobDoc {
4
+ id: string;
5
+ type: "blob";
6
+ provider: string;
7
+ bucket: string;
8
+ objectKey: string;
9
+ size: number;
10
+ mimeType?: string | undefined;
11
+ sha256?: string | undefined;
12
+ etag?: string | undefined;
13
+ storageClass?: string | undefined;
14
+ status: string;
15
+ createdAt: string;
16
+ updatedAt: string;
17
+ deletedAt?: string | undefined;
18
+ metadata?: JsonObject | undefined;
19
+ }
20
+ export interface BlobReferenceDoc {
21
+ id: string;
22
+ type: "blob-reference";
23
+ blobId: string;
24
+ refType: string;
25
+ refId: string;
26
+ createdAt: string;
27
+ }
28
+ export declare function blobDocToModel(doc: BlobDoc): Blob;
29
+ export declare function blobReferenceDocToModel(doc: BlobReferenceDoc): BlobReference;
30
+ //# sourceMappingURL=blob-doc.mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-doc.mapper.d.ts","sourceRoot":"","sources":["../../../src/metadata/mappers/blob-doc.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAA+B,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAElG,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAiBjD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAQ5E"}
@@ -0,0 +1,28 @@
1
+ export function blobDocToModel(doc) {
2
+ return {
3
+ id: doc.id,
4
+ provider: doc.provider,
5
+ bucket: doc.bucket,
6
+ objectKey: doc.objectKey,
7
+ size: doc.size,
8
+ mimeType: doc.mimeType,
9
+ sha256: doc.sha256,
10
+ etag: doc.etag,
11
+ storageClass: doc.storageClass,
12
+ status: doc.status,
13
+ createdAt: new Date(doc.createdAt),
14
+ updatedAt: new Date(doc.updatedAt),
15
+ deletedAt: doc.deletedAt ? new Date(doc.deletedAt) : undefined,
16
+ metadata: doc.metadata,
17
+ };
18
+ }
19
+ export function blobReferenceDocToModel(doc) {
20
+ return {
21
+ id: doc.id,
22
+ blobId: doc.blobId,
23
+ refType: doc.refType,
24
+ refId: doc.refId,
25
+ createdAt: new Date(doc.createdAt),
26
+ };
27
+ }
28
+ //# sourceMappingURL=blob-doc.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-doc.mapper.js","sourceRoot":"","sources":["../../../src/metadata/mappers/blob-doc.mapper.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAA2B;QACzC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,MAAM,EAAE,GAAG,CAAC,MAAoB;QAChC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9D,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { JsonObject } from "@vankyle-hub/storage-shared";
2
+ import type { File, FileVersion } from "@vankyle-hub/storage-core";
3
+ export interface FileDoc {
4
+ id: string;
5
+ type: "file";
6
+ ownerId?: string | undefined;
7
+ displayName: string;
8
+ mimeType?: string | undefined;
9
+ currentVersionId?: string | undefined;
10
+ size?: number | undefined;
11
+ parentId?: string | undefined;
12
+ status: string;
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ deletedAt?: string | undefined;
16
+ metadata?: JsonObject | undefined;
17
+ }
18
+ export interface FileVersionDoc {
19
+ id: string;
20
+ type: "file-version";
21
+ fileId: string;
22
+ blobId: string;
23
+ version: number;
24
+ size: number;
25
+ mimeType?: string | undefined;
26
+ sha256?: string | undefined;
27
+ createdAt: string;
28
+ createdBy?: string | undefined;
29
+ metadata?: JsonObject | undefined;
30
+ }
31
+ export declare function fileDocToModel(doc: FileDoc): File;
32
+ export declare function fileVersionDocToModel(doc: FileVersionDoc): FileVersion;
33
+ //# sourceMappingURL=file-doc.mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-doc.mapper.d.ts","sourceRoot":"","sources":["../../../src/metadata/mappers/file-doc.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAc,MAAM,2BAA2B,CAAC;AAE/E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAejD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,WAAW,CAatE"}
@@ -0,0 +1,31 @@
1
+ export function fileDocToModel(doc) {
2
+ return {
3
+ id: doc.id,
4
+ ownerId: doc.ownerId,
5
+ displayName: doc.displayName,
6
+ mimeType: doc.mimeType,
7
+ currentVersionId: doc.currentVersionId,
8
+ size: doc.size,
9
+ parentId: doc.parentId,
10
+ status: doc.status,
11
+ createdAt: new Date(doc.createdAt),
12
+ updatedAt: new Date(doc.updatedAt),
13
+ deletedAt: doc.deletedAt ? new Date(doc.deletedAt) : undefined,
14
+ metadata: doc.metadata,
15
+ };
16
+ }
17
+ export function fileVersionDocToModel(doc) {
18
+ return {
19
+ id: doc.id,
20
+ fileId: doc.fileId,
21
+ blobId: doc.blobId,
22
+ version: doc.version,
23
+ size: doc.size,
24
+ mimeType: doc.mimeType,
25
+ sha256: doc.sha256,
26
+ createdAt: new Date(doc.createdAt),
27
+ createdBy: doc.createdBy,
28
+ metadata: doc.metadata,
29
+ };
30
+ }
31
+ //# sourceMappingURL=file-doc.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-doc.mapper.js","sourceRoot":"","sources":["../../../src/metadata/mappers/file-doc.mapper.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAoB;QAChC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9D,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACvD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { type UploadSessionDoc, type UploadedPartDoc, uploadSessionDocToModel, uploadedPartDocToModel, } from "./upload-session-doc.mapper.js";
2
+ export { type BlobDoc, type BlobReferenceDoc, blobDocToModel, blobReferenceDocToModel, } from "./blob-doc.mapper.js";
3
+ export { type FileDoc, type FileVersionDoc, fileDocToModel, fileVersionDocToModel, } from "./file-doc.mapper.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metadata/mappers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,cAAc,EACd,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,cAAc,EACd,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { uploadSessionDocToModel, uploadedPartDocToModel, } from "./upload-session-doc.mapper.js";
2
+ export { blobDocToModel, blobReferenceDocToModel, } from "./blob-doc.mapper.js";
3
+ export { fileDocToModel, fileVersionDocToModel, } from "./file-doc.mapper.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metadata/mappers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAGL,cAAc,EACd,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,cAAc,EACd,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { JsonObject } from "@vankyle-hub/storage-shared";
2
+ import type { UploadSession, UploadedPart } from "@vankyle-hub/storage-core";
3
+ export interface UploadSessionDoc {
4
+ id: string;
5
+ type: "upload-session";
6
+ provider: string;
7
+ bucket: string;
8
+ objectKey: string;
9
+ mode: string;
10
+ status: string;
11
+ fileName?: string | undefined;
12
+ mimeType?: string | undefined;
13
+ expectedSize?: number | undefined;
14
+ expectedSha256?: string | undefined;
15
+ providerUploadId?: string | undefined;
16
+ providerSessionData?: JsonObject | undefined;
17
+ createdBy?: string | undefined;
18
+ ownerId?: string | undefined;
19
+ metadata?: JsonObject | undefined;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ expiresAt?: string | undefined;
23
+ completedAt?: string | undefined;
24
+ abortedAt?: string | undefined;
25
+ }
26
+ export interface UploadedPartDoc {
27
+ id: string;
28
+ type: "uploaded-part";
29
+ sessionId: string;
30
+ partNumber: number;
31
+ size: number;
32
+ etag?: string | undefined;
33
+ checksumSha256?: string | undefined;
34
+ providerPartId?: string | undefined;
35
+ providerPartData?: JsonObject | undefined;
36
+ uploadedAt: string;
37
+ }
38
+ export declare function uploadSessionDocToModel(doc: UploadSessionDoc): UploadSession;
39
+ export declare function uploadedPartDocToModel(doc: UploadedPartDoc): UploadedPart;
40
+ //# sourceMappingURL=upload-session-doc.mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-session-doc.mapper.d.ts","sourceRoot":"","sources":["../../../src/metadata/mappers/upload-session-doc.mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EAIb,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,mBAAmB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,gBAAgB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAuB5E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,YAAY,CAYzE"}
@@ -0,0 +1,38 @@
1
+ export function uploadSessionDocToModel(doc) {
2
+ return {
3
+ id: doc.id,
4
+ provider: doc.provider,
5
+ bucket: doc.bucket,
6
+ objectKey: doc.objectKey,
7
+ mode: doc.mode,
8
+ status: doc.status,
9
+ fileName: doc.fileName,
10
+ mimeType: doc.mimeType,
11
+ expectedSize: doc.expectedSize,
12
+ expectedSha256: doc.expectedSha256,
13
+ providerUploadId: doc.providerUploadId,
14
+ providerSessionData: doc.providerSessionData,
15
+ createdBy: doc.createdBy,
16
+ ownerId: doc.ownerId,
17
+ metadata: doc.metadata,
18
+ createdAt: new Date(doc.createdAt),
19
+ updatedAt: new Date(doc.updatedAt),
20
+ expiresAt: doc.expiresAt ? new Date(doc.expiresAt) : undefined,
21
+ completedAt: doc.completedAt ? new Date(doc.completedAt) : undefined,
22
+ abortedAt: doc.abortedAt ? new Date(doc.abortedAt) : undefined,
23
+ };
24
+ }
25
+ export function uploadedPartDocToModel(doc) {
26
+ return {
27
+ id: doc.id,
28
+ sessionId: doc.sessionId,
29
+ partNumber: doc.partNumber,
30
+ size: doc.size,
31
+ etag: doc.etag,
32
+ checksumSha256: doc.checksumSha256,
33
+ providerPartId: doc.providerPartId,
34
+ providerPartData: doc.providerPartData,
35
+ uploadedAt: new Date(doc.uploadedAt),
36
+ };
37
+ }
38
+ //# sourceMappingURL=upload-session-doc.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-session-doc.mapper.js","sourceRoot":"","sources":["../../../src/metadata/mappers/upload-session-doc.mapper.ts"],"names":[],"mappings":"AA8CA,MAAM,UAAU,uBAAuB,CAAC,GAAqB;IAC3D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAA2B;QACzC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,IAAI,EAAE,GAAG,CAAC,IAAkB;QAC5B,MAAM,EAAE,GAAG,CAAC,MAA6B;QACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9D,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QACpE,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAoB;IACzD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Container } from "@azure/cosmos";
2
+ import type { IBlobStore, CreateBlobInput, UpdateBlobInput, CreateBlobReferenceInput } from "@vankyle-hub/storage-core";
3
+ import type { Blob, BlobReference, StorageProvider } from "@vankyle-hub/storage-core";
4
+ export declare class CosmosBlobStore implements IBlobStore {
5
+ private readonly container;
6
+ constructor(container: Container);
7
+ createBlob(input: CreateBlobInput): Promise<Blob>;
8
+ getBlob(id: string): Promise<Blob | undefined>;
9
+ updateBlob(id: string, input: UpdateBlobInput): Promise<Blob>;
10
+ findBlobBySha256(sha256: string): Promise<Blob | undefined>;
11
+ findBlobByLocator(provider: StorageProvider, bucket: string, objectKey: string): Promise<Blob | undefined>;
12
+ createReference(input: CreateBlobReferenceInput): Promise<BlobReference>;
13
+ listReferences(blobId: string): Promise<BlobReference[]>;
14
+ deleteReference(id: string): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=cosmos-blob-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosmos-blob-store.d.ts","sourceRoot":"","sources":["../../../src/metadata/stores/cosmos-blob-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,eAAe,EACf,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAStF,qBAAa,eAAgB,YAAW,UAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE3C,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAU9C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAe3D,iBAAiB,CACrB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAgBtB,eAAe,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC;IAcxE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAaxD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGjD"}
@@ -0,0 +1,109 @@
1
+ import { BlobStatus } from "@vankyle-hub/storage-core";
2
+ import { blobDocToModel, blobReferenceDocToModel, } from "../mappers/blob-doc.mapper.js";
3
+ export class CosmosBlobStore {
4
+ container;
5
+ constructor(container) {
6
+ this.container = container;
7
+ }
8
+ async createBlob(input) {
9
+ const now = new Date().toISOString();
10
+ const doc = {
11
+ id: input.id,
12
+ type: "blob",
13
+ provider: input.provider,
14
+ bucket: input.bucket,
15
+ objectKey: input.objectKey,
16
+ size: input.size,
17
+ mimeType: input.mimeType,
18
+ sha256: input.sha256,
19
+ etag: input.etag,
20
+ storageClass: input.storageClass,
21
+ status: BlobStatus.Active,
22
+ createdAt: now,
23
+ updatedAt: now,
24
+ metadata: input.metadata,
25
+ };
26
+ const { resource } = await this.container.items.create(doc);
27
+ return blobDocToModel(resource);
28
+ }
29
+ async getBlob(id) {
30
+ try {
31
+ const { resource } = await this.container.item(id, id).read();
32
+ if (!resource || resource.type !== "blob")
33
+ return undefined;
34
+ return blobDocToModel(resource);
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ async updateBlob(id, input) {
41
+ const { resource: existing } = await this.container.item(id, id).read();
42
+ if (!existing) {
43
+ throw new Error(`Blob not found: ${id}`);
44
+ }
45
+ const updated = {
46
+ ...existing,
47
+ updatedAt: new Date().toISOString(),
48
+ };
49
+ if (input.status !== undefined)
50
+ updated.status = input.status;
51
+ if (input.deletedAt !== undefined)
52
+ updated.deletedAt = input.deletedAt.toISOString();
53
+ const { resource } = await this.container.item(id, id).replace(updated);
54
+ return blobDocToModel(resource);
55
+ }
56
+ async findBlobBySha256(sha256) {
57
+ const query = {
58
+ query: "SELECT * FROM c WHERE c.type = 'blob' AND c.sha256 = @sha256 AND c.status = @status",
59
+ parameters: [
60
+ { name: "@sha256", value: sha256 },
61
+ { name: "@status", value: BlobStatus.Active },
62
+ ],
63
+ };
64
+ const { resources } = await this.container.items.query(query).fetchAll();
65
+ if (resources.length === 0)
66
+ return undefined;
67
+ return blobDocToModel(resources[0]);
68
+ }
69
+ async findBlobByLocator(provider, bucket, objectKey) {
70
+ const query = {
71
+ query: "SELECT * FROM c WHERE c.type = 'blob' AND c.provider = @provider AND c.bucket = @bucket AND c.objectKey = @objectKey",
72
+ parameters: [
73
+ { name: "@provider", value: provider },
74
+ { name: "@bucket", value: bucket },
75
+ { name: "@objectKey", value: objectKey },
76
+ ],
77
+ };
78
+ const { resources } = await this.container.items.query(query).fetchAll();
79
+ if (resources.length === 0)
80
+ return undefined;
81
+ return blobDocToModel(resources[0]);
82
+ }
83
+ async createReference(input) {
84
+ const doc = {
85
+ id: input.id,
86
+ type: "blob-reference",
87
+ blobId: input.blobId,
88
+ refType: input.refType,
89
+ refId: input.refId,
90
+ createdAt: new Date().toISOString(),
91
+ };
92
+ const { resource } = await this.container.items.create(doc);
93
+ return blobReferenceDocToModel(resource);
94
+ }
95
+ async listReferences(blobId) {
96
+ const query = {
97
+ query: "SELECT * FROM c WHERE c.type = 'blob-reference' AND c.blobId = @blobId",
98
+ parameters: [{ name: "@blobId", value: blobId }],
99
+ };
100
+ const { resources } = await this.container.items
101
+ .query(query)
102
+ .fetchAll();
103
+ return resources.map(blobReferenceDocToModel);
104
+ }
105
+ async deleteReference(id) {
106
+ await this.container.item(id, id).delete();
107
+ }
108
+ }
109
+ //# sourceMappingURL=cosmos-blob-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosmos-blob-store.js","sourceRoot":"","sources":["../../../src/metadata/stores/cosmos-blob-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Container } from "@azure/cosmos";
2
+ import type { IFileStore, CreateFileInput, UpdateFileInput, CreateFileVersionInput } from "@vankyle-hub/storage-core";
3
+ import type { File, FileVersion } from "@vankyle-hub/storage-core";
4
+ export declare class CosmosFileStore implements IFileStore {
5
+ private readonly container;
6
+ constructor(container: Container);
7
+ createFile(input: CreateFileInput): Promise<File>;
8
+ getFile(id: string): Promise<File | undefined>;
9
+ updateFile(id: string, input: UpdateFileInput): Promise<File>;
10
+ createVersion(input: CreateFileVersionInput): Promise<FileVersion>;
11
+ getVersion(id: string): Promise<FileVersion | undefined>;
12
+ listVersions(fileId: string): Promise<FileVersion[]>;
13
+ getLatestVersion(fileId: string): Promise<FileVersion | undefined>;
14
+ }
15
+ //# sourceMappingURL=cosmos-file-store.d.ts.map