@twin.org/blob-storage-connector-file 0.0.3-next.6 → 0.0.3-next.8

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # TWIN Blob Storage Connector File
2
2
 
3
- Blob Storage connector implementation using file storage.
3
+ This package stores and retrieves blobs using local file system directories or mounted volumes. It is useful for straightforward deployments and development environments that rely on direct disk-backed storage.
4
4
 
5
5
  ## Installation
6
6
 
@@ -3,7 +3,7 @@
3
3
  import { access, mkdir, readFile, unlink, writeFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
5
  import { ContextIdHelper, ContextIdStore } from "@twin.org/context";
6
- import { BaseError, ComponentFactory, Converter, GeneralError, Guards, Is, Urn } from "@twin.org/core";
6
+ import { BaseError, ComponentFactory, Converter, GeneralError, Guards, HealthStatus, Is, Urn } from "@twin.org/core";
7
7
  import { Sha256 } from "@twin.org/crypto";
8
8
  /**
9
9
  * Class for performing blob storage operations in file.
@@ -51,6 +51,29 @@ export class FileBlobStorageConnector {
51
51
  className() {
52
52
  return FileBlobStorageConnector.CLASS_NAME;
53
53
  }
54
+ /**
55
+ * Returns the health status of the component.
56
+ * @returns The health status of the component.
57
+ */
58
+ async health() {
59
+ if (await this.dirExists(this._directory)) {
60
+ return [
61
+ {
62
+ source: FileBlobStorageConnector.CLASS_NAME,
63
+ status: HealthStatus.Ok,
64
+ description: "healthDescription"
65
+ }
66
+ ];
67
+ }
68
+ return [
69
+ {
70
+ source: FileBlobStorageConnector.CLASS_NAME,
71
+ status: HealthStatus.Error,
72
+ description: "healthDescription",
73
+ message: "healthCheckFailed"
74
+ }
75
+ ];
76
+ }
54
77
  /**
55
78
  * Bootstrap the component by creating and initializing any resources it needs.
56
79
  * @param nodeLoggingComponentType The node logging component type.
@@ -1 +1 @@
1
- {"version":3,"file":"fileBlobStorageConnector.js","sourceRoot":"","sources":["../../src/fileBlobStorageConnector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { IBlobStorageConnector } from \"@twin.org/blob-storage-models\";\nimport { ContextIdHelper, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tUrn\n} from \"@twin.org/core\";\nimport { Sha256 } from \"@twin.org/crypto\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IFileBlobStorageConnectorConstructorOptions } from \"./models/IFileBlobStorageConnectorConstructorOptions.js\";\n\n/**\n * Class for performing blob storage operations in file.\n */\nexport class FileBlobStorageConnector implements IBlobStorageConnector {\n\t/**\n\t * The namespace for the items.\n\t */\n\tpublic static readonly NAMESPACE: string = \"file\";\n\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<FileBlobStorageConnector>();\n\n\t/**\n\t * The directory to use for storage.\n\t * @internal\n\t */\n\tprivate readonly _directory: string;\n\n\t/**\n\t * The extension to use for storage.\n\t * @internal\n\t */\n\tprivate readonly _extension: string;\n\n\t/**\n\t * The keys to use from the context ids to create partitions.\n\t * @internal\n\t */\n\tprivate readonly _partitionContextIds?: string[];\n\n\t/**\n\t * Create a new instance of FileBlobStorageConnector.\n\t * @param options The options for the connector.\n\t */\n\tconstructor(options: IFileBlobStorageConnectorConstructorOptions) {\n\t\tGuards.object(FileBlobStorageConnector.CLASS_NAME, nameof(options), options);\n\t\tGuards.object(FileBlobStorageConnector.CLASS_NAME, nameof(options.config), options.config);\n\t\tGuards.stringValue(\n\t\t\tFileBlobStorageConnector.CLASS_NAME,\n\t\t\tnameof(options.config.directory),\n\t\t\toptions.config.directory\n\t\t);\n\t\tthis._directory = path.resolve(options.config.directory);\n\t\tthis._extension = options.config.extension ?? \".blob\";\n\t\tthis._partitionContextIds = options.partitionContextIds;\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn FileBlobStorageConnector.CLASS_NAME;\n\t}\n\n\t/**\n\t * Bootstrap the component by creating and initializing any resources it needs.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t * @returns True if the bootstrapping process was successful.\n\t */\n\tpublic async bootstrap(nodeLoggingComponentType?: string): Promise<boolean> {\n\t\tconst nodeLogging = ComponentFactory.getIfExists<ILoggingComponent>(nodeLoggingComponentType);\n\n\t\tif (!(await this.dirExists(this._directory))) {\n\t\t\ttry {\n\t\t\t\tawait nodeLogging?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\t\tmessage: \"directoryCreating\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdirectory: this._directory\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tawait mkdir(this._directory, { recursive: true });\n\t\t\t} catch (err) {\n\t\t\t\tawait nodeLogging?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\t\tmessage: \"directoryCreateFailed\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdirectory: this._directory\n\t\t\t\t\t},\n\t\t\t\t\terror: BaseError.fromError(err)\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\tawait nodeLogging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\tmessage: \"directoryExists\",\n\t\t\t\tdata: {\n\t\t\t\t\tdirectory: this._directory\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the blob.\n\t * @param blob The data for the blob.\n\t * @returns The id of the stored blob in urn format.\n\t */\n\tpublic async set(blob: Uint8Array): Promise<string> {\n\t\tGuards.uint8Array(FileBlobStorageConnector.CLASS_NAME, nameof(blob), blob);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst partitionKey = ContextIdHelper.combinedContextKey(contextIds, this._partitionContextIds);\n\n\t\ttry {\n\t\t\tconst id = Converter.bytesToHex(Sha256.sum256(blob));\n\n\t\t\tconst fullPath = this.createFullPath(id, partitionKey);\n\n\t\t\tconst dir = path.dirname(fullPath);\n\t\t\tif (!(await this.dirExists(dir))) {\n\t\t\t\tawait mkdir(dir, { recursive: true });\n\t\t\t}\n\n\t\t\tawait writeFile(fullPath, blob);\n\n\t\t\treturn `blob:${new Urn(FileBlobStorageConnector.NAMESPACE, id).toString()}`;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"setBlobFailed\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Get the blob.\n\t * @param id The id of the blob to get in urn format.\n\t * @returns The data for the blob if it can be found or undefined.\n\t */\n\tpublic async get(id: string): Promise<Uint8Array | undefined> {\n\t\tUrn.guard(FileBlobStorageConnector.CLASS_NAME, nameof(id), id);\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst partitionKey = ContextIdHelper.combinedContextKey(contextIds, this._partitionContextIds);\n\n\t\tif (urnParsed.namespaceMethod() !== FileBlobStorageConnector.NAMESPACE) {\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: FileBlobStorageConnector.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst fullPath = this.createFullPath(urnParsed.namespaceSpecific(1), partitionKey);\n\n\t\t\treturn await readFile(fullPath);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorCode(err, \"ENOENT\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"getBlobFailed\", { id }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the blob.\n\t * @param id The id of the blob to remove in urn format.\n\t * @returns True if the blob was found.\n\t */\n\tpublic async remove(id: string): Promise<boolean> {\n\t\tUrn.guard(FileBlobStorageConnector.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst partitionKey = ContextIdHelper.combinedContextKey(contextIds, this._partitionContextIds);\n\n\t\tif (urnParsed.namespaceMethod() !== FileBlobStorageConnector.NAMESPACE) {\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: FileBlobStorageConnector.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst fullPath = this.createFullPath(urnParsed.namespaceSpecific(1), partitionKey);\n\n\t\t\tawait unlink(fullPath);\n\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorCode(err, \"ENOENT\")) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"removeBlobFailed\", { id }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Check if the dir exists.\n\t * @param dir The directory to check.\n\t * @returns True if the dir exists.\n\t * @internal\n\t */\n\tprivate async dirExists(dir: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait access(dir);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Create the full path for the blob.\n\t * @param id The id of the blob.\n\t * @param partitionKey The partition key.\n\t * @returns The full path for the blob.\n\t * @internal\n\t */\n\tprivate createFullPath(id: string, partitionKey?: string): string {\n\t\tconst partitionPath = Is.stringValue(partitionKey) ? path.join(partitionKey, id) : id;\n\t\treturn path.join(this._directory, `${partitionPath}${this._extension}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"fileBlobStorageConnector.js","sourceRoot":"","sources":["../../src/fileBlobStorageConnector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { IBlobStorageConnector } from \"@twin.org/blob-storage-models\";\nimport { ContextIdHelper, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tHealthStatus,\n\tIs,\n\tUrn,\n\ttype IHealth\n} from \"@twin.org/core\";\nimport { Sha256 } from \"@twin.org/crypto\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { IFileBlobStorageConnectorConstructorOptions } from \"./models/IFileBlobStorageConnectorConstructorOptions.js\";\n\n/**\n * Class for performing blob storage operations in file.\n */\nexport class FileBlobStorageConnector implements IBlobStorageConnector {\n\t/**\n\t * The namespace for the items.\n\t */\n\tpublic static readonly NAMESPACE: string = \"file\";\n\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<FileBlobStorageConnector>();\n\n\t/**\n\t * The directory to use for storage.\n\t * @internal\n\t */\n\tprivate readonly _directory: string;\n\n\t/**\n\t * The extension to use for storage.\n\t * @internal\n\t */\n\tprivate readonly _extension: string;\n\n\t/**\n\t * The keys to use from the context ids to create partitions.\n\t * @internal\n\t */\n\tprivate readonly _partitionContextIds?: string[];\n\n\t/**\n\t * Create a new instance of FileBlobStorageConnector.\n\t * @param options The options for the connector.\n\t */\n\tconstructor(options: IFileBlobStorageConnectorConstructorOptions) {\n\t\tGuards.object(FileBlobStorageConnector.CLASS_NAME, nameof(options), options);\n\t\tGuards.object(FileBlobStorageConnector.CLASS_NAME, nameof(options.config), options.config);\n\t\tGuards.stringValue(\n\t\t\tFileBlobStorageConnector.CLASS_NAME,\n\t\t\tnameof(options.config.directory),\n\t\t\toptions.config.directory\n\t\t);\n\t\tthis._directory = path.resolve(options.config.directory);\n\t\tthis._extension = options.config.extension ?? \".blob\";\n\t\tthis._partitionContextIds = options.partitionContextIds;\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn FileBlobStorageConnector.CLASS_NAME;\n\t}\n\n\t/**\n\t * Returns the health status of the component.\n\t * @returns The health status of the component.\n\t */\n\tpublic async health(): Promise<IHealth[]> {\n\t\tif (await this.dirExists(this._directory)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\tdescription: \"healthDescription\"\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\tmessage: \"healthCheckFailed\"\n\t\t\t}\n\t\t];\n\t}\n\n\t/**\n\t * Bootstrap the component by creating and initializing any resources it needs.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t * @returns True if the bootstrapping process was successful.\n\t */\n\tpublic async bootstrap(nodeLoggingComponentType?: string): Promise<boolean> {\n\t\tconst nodeLogging = ComponentFactory.getIfExists<ILoggingComponent>(nodeLoggingComponentType);\n\n\t\tif (!(await this.dirExists(this._directory))) {\n\t\t\ttry {\n\t\t\t\tawait nodeLogging?.log({\n\t\t\t\t\tlevel: \"info\",\n\t\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\t\tmessage: \"directoryCreating\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdirectory: this._directory\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tawait mkdir(this._directory, { recursive: true });\n\t\t\t} catch (err) {\n\t\t\t\tawait nodeLogging?.log({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\t\tmessage: \"directoryCreateFailed\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tdirectory: this._directory\n\t\t\t\t\t},\n\t\t\t\t\terror: BaseError.fromError(err)\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\tawait nodeLogging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: FileBlobStorageConnector.CLASS_NAME,\n\t\t\t\tmessage: \"directoryExists\",\n\t\t\t\tdata: {\n\t\t\t\t\tdirectory: this._directory\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the blob.\n\t * @param blob The data for the blob.\n\t * @returns The id of the stored blob in urn format.\n\t */\n\tpublic async set(blob: Uint8Array): Promise<string> {\n\t\tGuards.uint8Array(FileBlobStorageConnector.CLASS_NAME, nameof(blob), blob);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst partitionKey = ContextIdHelper.combinedContextKey(contextIds, this._partitionContextIds);\n\n\t\ttry {\n\t\t\tconst id = Converter.bytesToHex(Sha256.sum256(blob));\n\n\t\t\tconst fullPath = this.createFullPath(id, partitionKey);\n\n\t\t\tconst dir = path.dirname(fullPath);\n\t\t\tif (!(await this.dirExists(dir))) {\n\t\t\t\tawait mkdir(dir, { recursive: true });\n\t\t\t}\n\n\t\t\tawait writeFile(fullPath, blob);\n\n\t\t\treturn `blob:${new Urn(FileBlobStorageConnector.NAMESPACE, id).toString()}`;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"setBlobFailed\", undefined, err);\n\t\t}\n\t}\n\n\t/**\n\t * Get the blob.\n\t * @param id The id of the blob to get in urn format.\n\t * @returns The data for the blob if it can be found or undefined.\n\t */\n\tpublic async get(id: string): Promise<Uint8Array | undefined> {\n\t\tUrn.guard(FileBlobStorageConnector.CLASS_NAME, nameof(id), id);\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst partitionKey = ContextIdHelper.combinedContextKey(contextIds, this._partitionContextIds);\n\n\t\tif (urnParsed.namespaceMethod() !== FileBlobStorageConnector.NAMESPACE) {\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: FileBlobStorageConnector.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst fullPath = this.createFullPath(urnParsed.namespaceSpecific(1), partitionKey);\n\n\t\t\treturn await readFile(fullPath);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorCode(err, \"ENOENT\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"getBlobFailed\", { id }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the blob.\n\t * @param id The id of the blob to remove in urn format.\n\t * @returns True if the blob was found.\n\t */\n\tpublic async remove(id: string): Promise<boolean> {\n\t\tUrn.guard(FileBlobStorageConnector.CLASS_NAME, nameof(id), id);\n\n\t\tconst urnParsed = Urn.fromValidString(id);\n\n\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\tconst partitionKey = ContextIdHelper.combinedContextKey(contextIds, this._partitionContextIds);\n\n\t\tif (urnParsed.namespaceMethod() !== FileBlobStorageConnector.NAMESPACE) {\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: FileBlobStorageConnector.NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst fullPath = this.createFullPath(urnParsed.namespaceSpecific(1), partitionKey);\n\n\t\t\tawait unlink(fullPath);\n\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorCode(err, \"ENOENT\")) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow new GeneralError(FileBlobStorageConnector.CLASS_NAME, \"removeBlobFailed\", { id }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Check if the dir exists.\n\t * @param dir The directory to check.\n\t * @returns True if the dir exists.\n\t * @internal\n\t */\n\tprivate async dirExists(dir: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait access(dir);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Create the full path for the blob.\n\t * @param id The id of the blob.\n\t * @param partitionKey The partition key.\n\t * @returns The full path for the blob.\n\t * @internal\n\t */\n\tprivate createFullPath(id: string, partitionKey?: string): string {\n\t\tconst partitionPath = Is.stringValue(partitionKey) ? path.join(partitionKey, id) : id;\n\t\treturn path.join(this._directory, `${partitionPath}${this._extension}`);\n\t}\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { IBlobStorageConnector } from "@twin.org/blob-storage-models";
2
+ import { type IHealth } from "@twin.org/core";
2
3
  import type { IFileBlobStorageConnectorConstructorOptions } from "./models/IFileBlobStorageConnectorConstructorOptions.js";
3
4
  /**
4
5
  * Class for performing blob storage operations in file.
@@ -22,6 +23,11 @@ export declare class FileBlobStorageConnector implements IBlobStorageConnector {
22
23
  * @returns The class name of the component.
23
24
  */
24
25
  className(): string;
26
+ /**
27
+ * Returns the health status of the component.
28
+ * @returns The health status of the component.
29
+ */
30
+ health(): Promise<IHealth[]>;
25
31
  /**
26
32
  * Bootstrap the component by creating and initializing any resources it needs.
27
33
  * @param nodeLoggingComponentType The node logging component type.
package/docs/changelog.md CHANGED
@@ -1,6 +1,34 @@
1
- # @twin.org/blob-storage-connector-file - Changelog
1
+ # Changelog
2
2
 
3
- ## [0.0.3-next.6](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.3-next.5...blob-storage-connector-file-v0.0.3-next.6) (2026-02-09)
3
+ ## [0.0.3-next.8](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.7...blob-storage-connector-file-v0.0.3-next.8) (2026-05-07)
4
+
5
+
6
+ ### Features
7
+
8
+ * health checks ([#44](https://github.com/iotaledger/twin-blob-storage/issues/44)) ([4a4041c](https://github.com/iotaledger/twin-blob-storage/commit/4a4041c19b68c40ed1aba6d1cdb4318ac4208b7d))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/blob-storage-models bumped from 0.0.3-next.7 to 0.0.3-next.8
16
+
17
+ ## [0.0.3-next.7](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.6...blob-storage-connector-file-v0.0.3-next.7) (2026-02-25)
18
+
19
+
20
+ ### Miscellaneous Chores
21
+
22
+ * **blob-storage-connector-file:** Synchronize repo versions
23
+
24
+
25
+ ### Dependencies
26
+
27
+ * The following workspace dependencies were updated
28
+ * dependencies
29
+ * @twin.org/blob-storage-models bumped from 0.0.3-next.6 to 0.0.3-next.7
30
+
31
+ ## [0.0.3-next.6](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.5...blob-storage-connector-file-v0.0.3-next.6) (2026-02-09)
4
32
 
5
33
 
6
34
  ### Miscellaneous Chores
@@ -14,7 +42,7 @@
14
42
  * dependencies
15
43
  * @twin.org/blob-storage-models bumped from 0.0.3-next.5 to 0.0.3-next.6
16
44
 
17
- ## [0.0.3-next.5](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.3-next.4...blob-storage-connector-file-v0.0.3-next.5) (2026-01-26)
45
+ ## [0.0.3-next.5](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.4...blob-storage-connector-file-v0.0.3-next.5) (2026-01-26)
18
46
 
19
47
 
20
48
  ### Miscellaneous Chores
@@ -28,7 +56,7 @@
28
56
  * dependencies
29
57
  * @twin.org/blob-storage-models bumped from 0.0.3-next.4 to 0.0.3-next.5
30
58
 
31
- ## [0.0.3-next.4](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.3-next.3...blob-storage-connector-file-v0.0.3-next.4) (2026-01-23)
59
+ ## [0.0.3-next.4](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.3...blob-storage-connector-file-v0.0.3-next.4) (2026-01-23)
32
60
 
33
61
 
34
62
  ### Miscellaneous Chores
@@ -42,7 +70,7 @@
42
70
  * dependencies
43
71
  * @twin.org/blob-storage-models bumped from 0.0.3-next.3 to 0.0.3-next.4
44
72
 
45
- ## [0.0.3-next.3](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.3-next.2...blob-storage-connector-file-v0.0.3-next.3) (2026-01-21)
73
+ ## [0.0.3-next.3](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.2...blob-storage-connector-file-v0.0.3-next.3) (2026-01-21)
46
74
 
47
75
 
48
76
  ### Miscellaneous Chores
@@ -56,7 +84,7 @@
56
84
  * dependencies
57
85
  * @twin.org/blob-storage-models bumped from 0.0.3-next.2 to 0.0.3-next.3
58
86
 
59
- ## [0.0.3-next.2](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.3-next.1...blob-storage-connector-file-v0.0.3-next.2) (2026-01-14)
87
+ ## [0.0.3-next.2](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.1...blob-storage-connector-file-v0.0.3-next.2) (2026-01-14)
60
88
 
61
89
 
62
90
  ### Miscellaneous Chores
@@ -70,17 +98,17 @@
70
98
  * dependencies
71
99
  * @twin.org/blob-storage-models bumped from 0.0.3-next.1 to 0.0.3-next.2
72
100
 
73
- ## [0.0.3-next.1](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.3-next.0...blob-storage-connector-file-v0.0.3-next.1) (2025-11-11)
101
+ ## [0.0.3-next.1](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.3-next.0...blob-storage-connector-file-v0.0.3-next.1) (2025-11-11)
74
102
 
75
103
 
76
104
  ### Features
77
105
 
78
- * add context id features ([#30](https://github.com/twinfoundation/blob-storage/issues/30)) ([fbf1c92](https://github.com/twinfoundation/blob-storage/commit/fbf1c9276424c841ef5ef3f4de8469ab3fba7e9c))
79
- * add validate-locales ([f20fcec](https://github.com/twinfoundation/blob-storage/commit/f20fceced91e39a0c9edb770b2e43ce944c92f3c))
80
- * eslint migration to flat config ([e4239dd](https://github.com/twinfoundation/blob-storage/commit/e4239dd1c721955cff7f0357255d2bba15319972))
81
- * update dependencies ([56f0094](https://github.com/twinfoundation/blob-storage/commit/56f0094b68d8bd22864cd899ac1b61d95540f719))
82
- * update framework core ([ff339fe](https://github.com/twinfoundation/blob-storage/commit/ff339fe7e3f09ddff429907834bdf43617e9c05e))
83
- * use shared store mechanism ([#12](https://github.com/twinfoundation/blob-storage/issues/12)) ([cae8110](https://github.com/twinfoundation/blob-storage/commit/cae8110681847a1ac4fcac968b8196694e49c320))
106
+ * add context id features ([#30](https://github.com/iotaledger/twin-blob-storage/issues/30)) ([fbf1c92](https://github.com/iotaledger/twin-blob-storage/commit/fbf1c9276424c841ef5ef3f4de8469ab3fba7e9c))
107
+ * add validate-locales ([f20fcec](https://github.com/iotaledger/twin-blob-storage/commit/f20fceced91e39a0c9edb770b2e43ce944c92f3c))
108
+ * eslint migration to flat config ([e4239dd](https://github.com/iotaledger/twin-blob-storage/commit/e4239dd1c721955cff7f0357255d2bba15319972))
109
+ * update dependencies ([56f0094](https://github.com/iotaledger/twin-blob-storage/commit/56f0094b68d8bd22864cd899ac1b61d95540f719))
110
+ * update framework core ([ff339fe](https://github.com/iotaledger/twin-blob-storage/commit/ff339fe7e3f09ddff429907834bdf43617e9c05e))
111
+ * use shared store mechanism ([#12](https://github.com/iotaledger/twin-blob-storage/issues/12)) ([cae8110](https://github.com/iotaledger/twin-blob-storage/commit/cae8110681847a1ac4fcac968b8196694e49c320))
84
112
 
85
113
 
86
114
  ### Dependencies
@@ -89,12 +117,12 @@
89
117
  * dependencies
90
118
  * @twin.org/blob-storage-models bumped from 0.0.3-next.0 to 0.0.3-next.1
91
119
 
92
- ## [0.0.2-next.5](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.2-next.4...blob-storage-connector-file-v0.0.2-next.5) (2025-10-09)
120
+ ## [0.0.2-next.5](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.2-next.4...blob-storage-connector-file-v0.0.2-next.5) (2025-10-09)
93
121
 
94
122
 
95
123
  ### Features
96
124
 
97
- * add validate-locales ([f20fcec](https://github.com/twinfoundation/blob-storage/commit/f20fceced91e39a0c9edb770b2e43ce944c92f3c))
125
+ * add validate-locales ([f20fcec](https://github.com/iotaledger/twin-blob-storage/commit/f20fceced91e39a0c9edb770b2e43ce944c92f3c))
98
126
 
99
127
 
100
128
  ### Dependencies
@@ -103,7 +131,7 @@
103
131
  * dependencies
104
132
  * @twin.org/blob-storage-models bumped from 0.0.2-next.4 to 0.0.2-next.5
105
133
 
106
- ## [0.0.2-next.4](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.2-next.3...blob-storage-connector-file-v0.0.2-next.4) (2025-10-02)
134
+ ## [0.0.2-next.4](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.2-next.3...blob-storage-connector-file-v0.0.2-next.4) (2025-10-02)
107
135
 
108
136
 
109
137
  ### Miscellaneous Chores
@@ -117,12 +145,12 @@
117
145
  * dependencies
118
146
  * @twin.org/blob-storage-models bumped from 0.0.2-next.3 to 0.0.2-next.4
119
147
 
120
- ## [0.0.2-next.3](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.2-next.2...blob-storage-connector-file-v0.0.2-next.3) (2025-08-29)
148
+ ## [0.0.2-next.3](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.2-next.2...blob-storage-connector-file-v0.0.2-next.3) (2025-08-29)
121
149
 
122
150
 
123
151
  ### Features
124
152
 
125
- * eslint migration to flat config ([e4239dd](https://github.com/twinfoundation/blob-storage/commit/e4239dd1c721955cff7f0357255d2bba15319972))
153
+ * eslint migration to flat config ([e4239dd](https://github.com/iotaledger/twin-blob-storage/commit/e4239dd1c721955cff7f0357255d2bba15319972))
126
154
 
127
155
 
128
156
  ### Dependencies
@@ -131,12 +159,12 @@
131
159
  * dependencies
132
160
  * @twin.org/blob-storage-models bumped from 0.0.2-next.2 to 0.0.2-next.3
133
161
 
134
- ## [0.0.2-next.2](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.2-next.1...blob-storage-connector-file-v0.0.2-next.2) (2025-08-20)
162
+ ## [0.0.2-next.2](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.2-next.1...blob-storage-connector-file-v0.0.2-next.2) (2025-08-20)
135
163
 
136
164
 
137
165
  ### Features
138
166
 
139
- * update framework core ([ff339fe](https://github.com/twinfoundation/blob-storage/commit/ff339fe7e3f09ddff429907834bdf43617e9c05e))
167
+ * update framework core ([ff339fe](https://github.com/iotaledger/twin-blob-storage/commit/ff339fe7e3f09ddff429907834bdf43617e9c05e))
140
168
 
141
169
 
142
170
  ### Dependencies
@@ -145,13 +173,13 @@
145
173
  * dependencies
146
174
  * @twin.org/blob-storage-models bumped from 0.0.2-next.1 to 0.0.2-next.2
147
175
 
148
- ## [0.0.2-next.1](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.2-next.0...blob-storage-connector-file-v0.0.2-next.1) (2025-07-24)
176
+ ## [0.0.2-next.1](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.2-next.0...blob-storage-connector-file-v0.0.2-next.1) (2025-07-24)
149
177
 
150
178
 
151
179
  ### Features
152
180
 
153
- * update dependencies ([56f0094](https://github.com/twinfoundation/blob-storage/commit/56f0094b68d8bd22864cd899ac1b61d95540f719))
154
- * use shared store mechanism ([#12](https://github.com/twinfoundation/blob-storage/issues/12)) ([cae8110](https://github.com/twinfoundation/blob-storage/commit/cae8110681847a1ac4fcac968b8196694e49c320))
181
+ * update dependencies ([56f0094](https://github.com/iotaledger/twin-blob-storage/commit/56f0094b68d8bd22864cd899ac1b61d95540f719))
182
+ * use shared store mechanism ([#12](https://github.com/iotaledger/twin-blob-storage/issues/12)) ([cae8110](https://github.com/iotaledger/twin-blob-storage/commit/cae8110681847a1ac4fcac968b8196694e49c320))
155
183
 
156
184
 
157
185
  ### Dependencies
@@ -165,7 +193,7 @@
165
193
 
166
194
  ### Features
167
195
 
168
- * release to production ([eacfe75](https://github.com/twinfoundation/blob-storage/commit/eacfe754a0dcd9243d9e13d86422327d0a605164))
196
+ * release to production ([eacfe75](https://github.com/iotaledger/twin-blob-storage/commit/eacfe754a0dcd9243d9e13d86422327d0a605164))
169
197
 
170
198
 
171
199
  ### Dependencies
@@ -174,7 +202,7 @@
174
202
  * dependencies
175
203
  * @twin.org/blob-storage-models bumped from ^0.0.0 to ^0.0.1
176
204
 
177
- ## [0.0.1-next.37](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.36...blob-storage-connector-file-v0.0.1-next.37) (2025-06-20)
205
+ ## [0.0.1-next.37](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.36...blob-storage-connector-file-v0.0.1-next.37) (2025-06-20)
178
206
 
179
207
 
180
208
  ### Miscellaneous Chores
@@ -188,7 +216,7 @@
188
216
  * dependencies
189
217
  * @twin.org/blob-storage-models bumped from 0.0.1-next.36 to 0.0.1-next.37
190
218
 
191
- ## [0.0.1-next.36](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.35...blob-storage-connector-file-v0.0.1-next.36) (2025-06-19)
219
+ ## [0.0.1-next.36](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.35...blob-storage-connector-file-v0.0.1-next.36) (2025-06-19)
192
220
 
193
221
 
194
222
  ### Miscellaneous Chores
@@ -202,7 +230,7 @@
202
230
  * dependencies
203
231
  * @twin.org/blob-storage-models bumped from 0.0.1-next.35 to 0.0.1-next.36
204
232
 
205
- ## [0.0.1-next.35](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.34...blob-storage-connector-file-v0.0.1-next.35) (2025-06-17)
233
+ ## [0.0.1-next.35](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.34...blob-storage-connector-file-v0.0.1-next.35) (2025-06-17)
206
234
 
207
235
 
208
236
  ### Miscellaneous Chores
@@ -216,12 +244,12 @@
216
244
  * dependencies
217
245
  * @twin.org/blob-storage-models bumped from 0.0.1-next.34 to 0.0.1-next.35
218
246
 
219
- ## [0.0.1-next.34](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.33...blob-storage-connector-file-v0.0.1-next.34) (2025-06-12)
247
+ ## [0.0.1-next.34](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.33...blob-storage-connector-file-v0.0.1-next.34) (2025-06-12)
220
248
 
221
249
 
222
250
  ### Features
223
251
 
224
- * update dependencies ([56f0094](https://github.com/twinfoundation/blob-storage/commit/56f0094b68d8bd22864cd899ac1b61d95540f719))
252
+ * update dependencies ([56f0094](https://github.com/iotaledger/twin-blob-storage/commit/56f0094b68d8bd22864cd899ac1b61d95540f719))
225
253
 
226
254
 
227
255
  ### Dependencies
@@ -230,7 +258,7 @@
230
258
  * dependencies
231
259
  * @twin.org/blob-storage-models bumped from 0.0.1-next.33 to 0.0.1-next.34
232
260
 
233
- ## [0.0.1-next.33](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.32...blob-storage-connector-file-v0.0.1-next.33) (2025-06-03)
261
+ ## [0.0.1-next.33](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.32...blob-storage-connector-file-v0.0.1-next.33) (2025-06-03)
234
262
 
235
263
 
236
264
  ### Miscellaneous Chores
@@ -244,7 +272,7 @@
244
272
  * dependencies
245
273
  * @twin.org/blob-storage-models bumped from 0.0.1-next.32 to 0.0.1-next.33
246
274
 
247
- ## [0.0.1-next.32](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.31...blob-storage-connector-file-v0.0.1-next.32) (2025-05-28)
275
+ ## [0.0.1-next.32](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.31...blob-storage-connector-file-v0.0.1-next.32) (2025-05-28)
248
276
 
249
277
 
250
278
  ### Miscellaneous Chores
@@ -258,7 +286,7 @@
258
286
  * dependencies
259
287
  * @twin.org/blob-storage-models bumped from 0.0.1-next.31 to 0.0.1-next.32
260
288
 
261
- ## [0.0.1-next.31](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.30...blob-storage-connector-file-v0.0.1-next.31) (2025-05-08)
289
+ ## [0.0.1-next.31](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.30...blob-storage-connector-file-v0.0.1-next.31) (2025-05-08)
262
290
 
263
291
 
264
292
  ### Miscellaneous Chores
@@ -272,12 +300,12 @@
272
300
  * dependencies
273
301
  * @twin.org/blob-storage-models bumped from 0.0.1-next.30 to 0.0.1-next.31
274
302
 
275
- ## [0.0.1-next.30](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.29...blob-storage-connector-file-v0.0.1-next.30) (2025-04-17)
303
+ ## [0.0.1-next.30](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.29...blob-storage-connector-file-v0.0.1-next.30) (2025-04-17)
276
304
 
277
305
 
278
306
  ### Features
279
307
 
280
- * use shared store mechanism ([#12](https://github.com/twinfoundation/blob-storage/issues/12)) ([cae8110](https://github.com/twinfoundation/blob-storage/commit/cae8110681847a1ac4fcac968b8196694e49c320))
308
+ * use shared store mechanism ([#12](https://github.com/iotaledger/twin-blob-storage/issues/12)) ([cae8110](https://github.com/iotaledger/twin-blob-storage/commit/cae8110681847a1ac4fcac968b8196694e49c320))
281
309
 
282
310
 
283
311
  ### Dependencies
@@ -286,7 +314,7 @@
286
314
  * dependencies
287
315
  * @twin.org/blob-storage-models bumped from 0.0.1-next.29 to 0.0.1-next.30
288
316
 
289
- ## [0.0.1-next.29](https://github.com/twinfoundation/blob-storage/compare/blob-storage-connector-file-v0.0.1-next.28...blob-storage-connector-file-v0.0.1-next.29) (2025-03-28)
317
+ ## [0.0.1-next.29](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-connector-file-v0.0.1-next.28...blob-storage-connector-file-v0.0.1-next.29) (2025-03-28)
290
318
 
291
319
 
292
320
  ### Miscellaneous Chores
package/docs/examples.md CHANGED
@@ -1 +1,42 @@
1
- # @twin.org/blob-storage-connector-file - Examples
1
+ # File Connector Examples
2
+
3
+ Use these snippets to store blobs on local disk for development, integration testing, or offline processing pipelines.
4
+
5
+ ## FileBlobStorageConnector
6
+
7
+ ```typescript
8
+ import { FileBlobStorageConnector } from '@twin.org/blob-storage-connector-file';
9
+
10
+ const connector = new FileBlobStorageConnector({
11
+ config: {
12
+ directory: './local-blob-store',
13
+ extension: '.bin'
14
+ },
15
+ partitionContextIds: ['tenant', 'environment']
16
+ });
17
+
18
+ const bootstrapped = await connector.bootstrap();
19
+ console.log(bootstrapped); // true
20
+ console.log(connector.className()); // FileBlobStorageConnector
21
+ ```
22
+
23
+ ```typescript
24
+ import { Converter } from '@twin.org/core';
25
+ import { FileBlobStorageConnector } from '@twin.org/blob-storage-connector-file';
26
+
27
+ const connector = new FileBlobStorageConnector({
28
+ config: {
29
+ directory: './local-blob-store'
30
+ }
31
+ });
32
+
33
+ const blobData = Converter.utf8ToBytes('Local connector payload');
34
+ const blobId = await connector.set(blobData);
35
+ console.log(blobId); // blob:urn:blob:file:...
36
+
37
+ const storedBlob = await connector.get(blobId);
38
+ console.log(storedBlob?.length); // 23
39
+
40
+ const removed = await connector.remove(blobId);
41
+ console.log(removed); // true
42
+ ```
@@ -28,7 +28,7 @@ The options for the connector.
28
28
 
29
29
  ## Properties
30
30
 
31
- ### NAMESPACE
31
+ ### NAMESPACE {#namespace}
32
32
 
33
33
  > `readonly` `static` **NAMESPACE**: `string` = `"file"`
34
34
 
@@ -36,7 +36,7 @@ The namespace for the items.
36
36
 
37
37
  ***
38
38
 
39
- ### CLASS\_NAME
39
+ ### CLASS\_NAME {#class_name}
40
40
 
41
41
  > `readonly` `static` **CLASS\_NAME**: `string`
42
42
 
@@ -44,7 +44,7 @@ Runtime name for the class.
44
44
 
45
45
  ## Methods
46
46
 
47
- ### className()
47
+ ### className() {#classname}
48
48
 
49
49
  > **className**(): `string`
50
50
 
@@ -62,7 +62,25 @@ The class name of the component.
62
62
 
63
63
  ***
64
64
 
65
- ### bootstrap()
65
+ ### health() {#health}
66
+
67
+ > **health**(): `Promise`\<`IHealth`[]\>
68
+
69
+ Returns the health status of the component.
70
+
71
+ #### Returns
72
+
73
+ `Promise`\<`IHealth`[]\>
74
+
75
+ The health status of the component.
76
+
77
+ #### Implementation of
78
+
79
+ `IBlobStorageConnector.health`
80
+
81
+ ***
82
+
83
+ ### bootstrap() {#bootstrap}
66
84
 
67
85
  > **bootstrap**(`nodeLoggingComponentType?`): `Promise`\<`boolean`\>
68
86
 
@@ -88,7 +106,7 @@ True if the bootstrapping process was successful.
88
106
 
89
107
  ***
90
108
 
91
- ### set()
109
+ ### set() {#set}
92
110
 
93
111
  > **set**(`blob`): `Promise`\<`string`\>
94
112
 
@@ -114,7 +132,7 @@ The id of the stored blob in urn format.
114
132
 
115
133
  ***
116
134
 
117
- ### get()
135
+ ### get() {#get}
118
136
 
119
137
  > **get**(`id`): `Promise`\<`Uint8Array`\<`ArrayBufferLike`\> \| `undefined`\>
120
138
 
@@ -140,7 +158,7 @@ The data for the blob if it can be found or undefined.
140
158
 
141
159
  ***
142
160
 
143
- ### remove()
161
+ ### remove() {#remove}
144
162
 
145
163
  > **remove**(`id`): `Promise`\<`boolean`\>
146
164
 
@@ -4,7 +4,7 @@ Configuration for the File Blob Storage Connector.
4
4
 
5
5
  ## Properties
6
6
 
7
- ### directory
7
+ ### directory {#directory}
8
8
 
9
9
  > **directory**: `string`
10
10
 
@@ -12,8 +12,8 @@ The directory to use for storage.
12
12
 
13
13
  ***
14
14
 
15
- ### extension?
15
+ ### extension? {#extension}
16
16
 
17
- > `optional` **extension**: `string`
17
+ > `optional` **extension?**: `string`
18
18
 
19
19
  The extension to add to files when they are stored.
@@ -4,15 +4,15 @@ Options for the File Blob Storage Connector constructor.
4
4
 
5
5
  ## Properties
6
6
 
7
- ### partitionContextIds?
7
+ ### partitionContextIds? {#partitioncontextids}
8
8
 
9
- > `optional` **partitionContextIds**: `string`[]
9
+ > `optional` **partitionContextIds?**: `string`[]
10
10
 
11
11
  The keys to use from the context ids to create partitions.
12
12
 
13
13
  ***
14
14
 
15
- ### config
15
+ ### config {#config}
16
16
 
17
17
  > **config**: [`IFileBlobStorageConnectorConfig`](IFileBlobStorageConnectorConfig.md)
18
18
 
package/locales/en.json CHANGED
@@ -5,6 +5,12 @@
5
5
  "directoryExists": "Skipping create directory \"{directory}\" as it already exists"
6
6
  }
7
7
  },
8
+ "health": {
9
+ "fileBlobStorageConnector": {
10
+ "healthDescription": "File blob storage connector is healthy",
11
+ "healthCheckFailed": "Failed to access the storage directory"
12
+ }
13
+ },
8
14
  "error": {
9
15
  "fileBlobStorageConnector": {
10
16
  "directoryCreateFailed": "Creating directory \"{directory}\" failed",
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@twin.org/blob-storage-connector-file",
3
- "version": "0.0.3-next.6",
4
- "description": "Blob Storage connector implementation using file storage",
3
+ "version": "0.0.3-next.8",
4
+ "description": "Persists blobs to local directories or mounted volumes through a file system connector.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/twinfoundation/blob-storage.git",
7
+ "url": "git+https://github.com/iotaledger/blob-storage.git",
8
8
  "directory": "packages/blob-storage-connector-file"
9
9
  },
10
10
  "author": "martyn.janes@iota.org",
@@ -14,7 +14,7 @@
14
14
  "node": ">=20.0.0"
15
15
  },
16
16
  "dependencies": {
17
- "@twin.org/blob-storage-models": "0.0.3-next.6",
17
+ "@twin.org/blob-storage-models": "0.0.3-next.8",
18
18
  "@twin.org/context": "next",
19
19
  "@twin.org/core": "next",
20
20
  "@twin.org/crypto": "next",
@@ -53,7 +53,7 @@
53
53
  "integration"
54
54
  ],
55
55
  "bugs": {
56
- "url": "git+https://github.com/twinfoundation/blob-storage/issues"
56
+ "url": "git+https://github.com/iotaledger/blob-storage/issues"
57
57
  },
58
58
  "homepage": "https://twindev.org"
59
59
  }