@proteinjs/db-file-storage-driver-gcs 1.0.1

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/.eslintrc.js ADDED
@@ -0,0 +1,20 @@
1
+ module.exports = {
2
+ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended', 'prettier'],
3
+ parser: '@typescript-eslint/parser',
4
+ plugins: ['@typescript-eslint', 'prettier'],
5
+ root: true,
6
+ ignorePatterns: ['**/dist/*', '**/node_modules/*', '*.md'],
7
+
8
+ rules: {
9
+ 'prettier/prettier': ['warn'],
10
+ curly: ['warn'],
11
+ 'eol-last': ['warn', 'always'],
12
+ 'keyword-spacing': ['warn', { before: true }],
13
+ 'no-undef': 'off',
14
+ '@typescript-eslint/no-unused-vars': 'off',
15
+ '@typescript-eslint/no-var-requires': 'off',
16
+ '@typescript-eslint/no-explicit-any': 'off',
17
+ '@typescript-eslint/prefer-as-const': 'off',
18
+ '@typescript-eslint/ban-types': 'off',
19
+ },
20
+ };
@@ -0,0 +1,4 @@
1
+ node_modules/
2
+ dist/
3
+ .DS_Store
4
+ *.md
package/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "trailingComma": "es5",
3
+ "tabWidth": 2,
4
+ "semi": true,
5
+ "singleQuote": true,
6
+ "jsxSingleQuote": true,
7
+ "printWidth": 120
8
+ }
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Setup
2
+
3
+ 1. Create a new storage bucket in Google Cloud Storage
4
+ 2. Associate a Service Account with the bucket
5
+ 3. Create a new access key for the Service Account, or use a previously downloaded key if you have one, in Google Cloud Service Accounts. This is found in the IAM & Admin section of Google Cloud. Creating a new key will automatically download the file.
6
+ 4. Once the key is downloaded, navigate to the file location in your terminal to encode it. `cat your-key-abcde123456.json | base64` Keep the string that is returned to save as an environment variable on your machine.
7
+ 5. Edit your environment variables. For example:
8
+ - `nano ~/.zshrc`
9
+ - Add this line `export GCP_GCS_SA_KEY="paste the long string, that you copied from the previous step, here"`
10
+ 6. Reload your current terminal session to apply the environment variable changes `source ~/.zshrc`
11
+ 7. Implement a `FileStorageDriverFactory` to provide your GCS config as the default driver for the `FileStorage` api. Alternatively, you can pass the driver into `FileStorage` directly without the following convenience factory.
12
+
13
+ ```typescript
14
+ import { DefaultFileStorageDriverFactory, FileStorageDriver } from '@proteinjs/db-file';
15
+ import { GoogleCloudStorageDriver } from '@proteinjs/db-file-storage-driver-gcs';
16
+
17
+ export class FileStorageDriverFactory implements DefaultFileStorageDriverFactory {
18
+ getDriver(): FileStorageDriver {
19
+ const encodedCredentials = process.env.GCP_GCS_SA_KEY;
20
+ if (!encodedCredentials) {
21
+ throw new Error(
22
+ 'Unable to instantiate GoogleCloudStorageDriver. The GCP_GCS_SA_KEY environment variable is not set.'
23
+ );
24
+ }
25
+
26
+ const credentials = JSON.parse(Buffer.from(encodedCredentials, 'base64').toString('utf-8'));
27
+ return new GoogleCloudStorageDriver({
28
+ projectId: 'your-project-id',
29
+ bucketName: 'your-bucket-name',
30
+ storageOptions: {
31
+ credentials,
32
+ },
33
+ });
34
+ }
35
+ }
36
+ ```
@@ -0,0 +1,8 @@
1
+ /** Load Dependency Source Graphs */
2
+ import '@google-cloud/storage';
3
+ import '@proteinjs/db';
4
+ import '@proteinjs/db-file';
5
+ import '@proteinjs/reflection';
6
+ import '@proteinjs/util';
7
+ export * from '../index';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,OAAO,uBAAuB,CAAC;AAC/B,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,iBAAiB,CAAC;AAyBzB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /** Load Dependency Source Graphs */
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ require("@google-cloud/storage");
19
+ require("@proteinjs/db");
20
+ require("@proteinjs/db-file");
21
+ require("@proteinjs/reflection");
22
+ require("@proteinjs/util");
23
+ /** Generate Source Graph */
24
+ var sourceGraph = "{\"options\":{\"directed\":true,\"multigraph\":false,\"compound\":false},\"nodes\":[{\"v\":\"@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory\",\"value\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"DefaultGoogleCloudStorageConfigFactory\",\"filePath\":\"/Users/brentbahry/workspaces/n3xa/packages/proteinjs/packages/db/packages/file-storage-drivers/google-cloud-storage/src/DefaultGoogleCloudStorageConfigFactory.ts\",\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory\",\"properties\":[],\"methods\":[{\"name\":\"getConfig\",\"returnType\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageConfig\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageConfig\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":true,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[]}],\"typeParameters\":[],\"directParents\":[{\"packageName\":\"@proteinjs/reflection\",\"name\":\"Loadable\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/reflection/Loadable\",\"properties\":[],\"methods\":[],\"typeParameters\":[],\"directParents\":[]}],\"sourceType\":3}},{\"v\":\"@proteinjs/reflection/Loadable\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver\",\"value\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageDriver\",\"filePath\":\"/Users/brentbahry/workspaces/n3xa/packages/proteinjs/packages/db/packages/file-storage-drivers/google-cloud-storage/src/GoogleCloudStorageDriver.ts\",\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver\",\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"properties\":[{\"name\":\"storage\",\"type\":{\"packageName\":\"@google-cloud/storage\",\"name\":\"Storage\",\"filePath\":null,\"qualifiedName\":\"@google-cloud/storage/Storage\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"},{\"name\":\"bucketName\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"}],\"methods\":[{\"name\":\"getDefaultConfig\",\"returnType\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageConfig\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageConfig\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\",\"parameters\":[]},{\"name\":\"createFile\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"file\",\"type\":{\"packageName\":\"@proteinjs/db-file\",\"name\":\"File\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file/File\",\"typeParameters\":null,\"directParents\":null}},{\"name\":\"fileData\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}}]},{\"name\":\"getFileData\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<string>\",\"filePath\":null,\"qualifiedName\":\"/Promise<string>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"fileId\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}}]},{\"name\":\"updateFileData\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"fileId\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}},{\"name\":\"data\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}}]},{\"name\":\"updateFile\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"file\",\"type\":{\"packageName\":\"@proteinjs/db-file\",\"name\":\"File\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file/File\",\"typeParameters\":null,\"directParents\":null}}]}],\"typeParameters\":[],\"directParentInterfaces\":[{\"packageName\":\"@proteinjs/db-file\",\"name\":\"FileStorageDriver\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file/FileStorageDriver\",\"properties\":[],\"methods\":[],\"typeParameters\":[],\"directParents\":[]}],\"directParentClasses\":[],\"sourceType\":2}},{\"v\":\"@proteinjs/db-file/FileStorageDriver\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher\",\"value\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageTableWatcher\",\"filePath\":\"/Users/brentbahry/workspaces/n3xa/packages/proteinjs/packages/db/packages/file-storage-drivers/google-cloud-storage/src/GoogleCloudStorageTableWatcher.ts\",\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher\",\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"properties\":[{\"name\":\"logger\",\"type\":null,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"},{\"name\":\"storage\",\"type\":{\"packageName\":\"@google-cloud/storage\",\"name\":\"Storage\",\"filePath\":null,\"qualifiedName\":\"@google-cloud/storage/Storage\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"},{\"name\":\"bucketName\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"}],\"methods\":[{\"name\":\"getConfig\",\"returnType\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageConfig\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageConfig\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\",\"parameters\":[]},{\"name\":\"name\",\"returnType\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[]},{\"name\":\"table\",\"returnType\":{\"packageName\":\"\",\"name\":\"Table<File>\",\"filePath\":null,\"qualifiedName\":\"/Table<File>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[]},{\"name\":\"beforeDelete\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"recordsToDelete\",\"type\":{\"packageName\":\"\",\"name\":\"T[]\",\"filePath\":null,\"qualifiedName\":\"/T[]\",\"typeParameters\":null,\"directParents\":null}},{\"name\":\"qb\",\"type\":{\"packageName\":\"\",\"name\":\"QueryBuilder<T>\",\"filePath\":null,\"qualifiedName\":\"/QueryBuilder<T>\",\"typeParameters\":null,\"directParents\":null}}]}],\"typeParameters\":[],\"directParentInterfaces\":[{\"packageName\":\"@proteinjs/db\",\"name\":\"TableWatcher\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db/TableWatcher\",\"properties\":[],\"methods\":[],\"typeParameters\":[\"@proteinjs/db-file/File\"],\"directParents\":[]}],\"directParentClasses\":[],\"sourceType\":2}},{\"v\":\"@proteinjs/db/TableWatcher\"}],\"edges\":[{\"v\":\"@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory\",\"w\":\"@proteinjs/reflection/Loadable\",\"value\":\"extends interface\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver\",\"w\":\"@proteinjs/db-file/FileStorageDriver\",\"value\":\"implements interface\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher\",\"w\":\"@proteinjs/db/TableWatcher\",\"value\":\"implements interface\"}]}";
25
+ /** Generate Source Links */
26
+ var GoogleCloudStorageDriver_1 = require("../src/GoogleCloudStorageDriver");
27
+ var GoogleCloudStorageTableWatcher_1 = require("../src/GoogleCloudStorageTableWatcher");
28
+ var sourceLinks = {
29
+ '@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver': GoogleCloudStorageDriver_1.GoogleCloudStorageDriver,
30
+ '@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher': GoogleCloudStorageTableWatcher_1.GoogleCloudStorageTableWatcher,
31
+ };
32
+ /** Load Source Graph and Links */
33
+ var reflection_1 = require("@proteinjs/reflection");
34
+ reflection_1.SourceRepository.merge(sourceGraph, sourceLinks);
35
+ __exportStar(require("../index"), exports);
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../generated/index.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;;;;;;;;;;;;AAEpC,iCAA+B;AAC/B,yBAAuB;AACvB,8BAA4B;AAC5B,iCAA+B;AAC/B,2BAAyB;AAGzB,4BAA4B;AAE5B,IAAM,WAAW,GAAG,knSAAknS,CAAC;AAGvoS,4BAA4B;AAE5B,4EAA2E;AAC3E,wFAAuF;AAEvF,IAAM,WAAW,GAAG;IACnB,gEAAgE,EAAE,mDAAwB;IAC1F,sEAAsE,EAAE,+DAA8B;CACtG,CAAC;AAGF,kCAAkC;AAElC,oDAAyD;AACzD,6BAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAGjD,2CAAyB"}
@@ -0,0 +1,3 @@
1
+ export * from './src/GoogleCloudStorageDriver';
2
+ export * from './src/DefaultGoogleCloudStorageConfigFactory';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8CAA8C,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./src/GoogleCloudStorageDriver"), exports);
18
+ __exportStar(require("./src/DefaultGoogleCloudStorageConfigFactory"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,+EAA6D"}
@@ -0,0 +1,12 @@
1
+ import { Loadable } from '@proteinjs/reflection';
2
+ import { StorageOptions } from '@google-cloud/storage';
3
+ export declare const getDefaultGoogleCloudStorageConfigFactory: () => DefaultGoogleCloudStorageConfigFactory;
4
+ export type GoogleCloudStorageConfig = {
5
+ bucketName: string;
6
+ projectId: string;
7
+ storageOptions?: StorageOptions;
8
+ };
9
+ export interface DefaultGoogleCloudStorageConfigFactory extends Loadable {
10
+ getConfig(): GoogleCloudStorageConfig;
11
+ }
12
+ //# sourceMappingURL=DefaultGoogleCloudStorageConfigFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultGoogleCloudStorageConfigFactory.d.ts","sourceRoot":"","sources":["../../src/DefaultGoogleCloudStorageConfigFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAoB,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,eAAO,MAAM,yCAAyC,8CAGnD,CAAC;AAEJ,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,MAAM,WAAW,sCAAuC,SAAQ,QAAQ;IACtE,SAAS,IAAI,wBAAwB,CAAC;CACvC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultGoogleCloudStorageConfigFactory = void 0;
4
+ var reflection_1 = require("@proteinjs/reflection");
5
+ var getDefaultGoogleCloudStorageConfigFactory = function () {
6
+ return reflection_1.SourceRepository.get().object('@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory');
7
+ };
8
+ exports.getDefaultGoogleCloudStorageConfigFactory = getDefaultGoogleCloudStorageConfigFactory;
9
+ //# sourceMappingURL=DefaultGoogleCloudStorageConfigFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultGoogleCloudStorageConfigFactory.js","sourceRoot":"","sources":["../../src/DefaultGoogleCloudStorageConfigFactory.ts"],"names":[],"mappings":";;;AAAA,oDAAmE;AAG5D,IAAM,yCAAyC,GAAG;IACvD,OAAA,6BAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CAC3B,8EAA8E,CAC/E;AAFD,CAEC,CAAC;AAHS,QAAA,yCAAyC,6CAGlD"}
@@ -0,0 +1,13 @@
1
+ import { File, FileStorageDriver } from '@proteinjs/db-file';
2
+ import { GoogleCloudStorageConfig } from './DefaultGoogleCloudStorageConfigFactory';
3
+ export declare class GoogleCloudStorageDriver implements FileStorageDriver {
4
+ private storage;
5
+ private bucketName;
6
+ constructor(config?: GoogleCloudStorageConfig);
7
+ private getDefaultConfig;
8
+ createFile(file: File, fileData: string): Promise<void>;
9
+ getFileData(fileId: string): Promise<string>;
10
+ updateFileData(fileId: string, data: string): Promise<void>;
11
+ updateFile(file: File): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=GoogleCloudStorageDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleCloudStorageDriver.d.ts","sourceRoot":"","sources":["../../src/GoogleCloudStorageDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,wBAAwB,EAEzB,MAAM,0CAA0C,CAAC;AAElD,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,CAAC,EAAE,wBAAwB;IAM7C,OAAO,CAAC,gBAAgB;IAWlB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAW5C"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.GoogleCloudStorageDriver = void 0;
51
+ var storage_1 = require("@google-cloud/storage");
52
+ var DefaultGoogleCloudStorageConfigFactory_1 = require("./DefaultGoogleCloudStorageConfigFactory");
53
+ var GoogleCloudStorageDriver = /** @class */ (function () {
54
+ function GoogleCloudStorageDriver(config) {
55
+ var _a = config ? config : this.getDefaultConfig(), projectId = _a.projectId, bucketName = _a.bucketName, storageOptions = _a.storageOptions;
56
+ this.storage = new storage_1.Storage(__assign(__assign({}, storageOptions), { projectId: projectId }));
57
+ this.bucketName = bucketName;
58
+ }
59
+ GoogleCloudStorageDriver.prototype.getDefaultConfig = function () {
60
+ var defaultConfigFactory = (0, DefaultGoogleCloudStorageConfigFactory_1.getDefaultGoogleCloudStorageConfigFactory)();
61
+ if (!defaultConfigFactory) {
62
+ throw new Error("Unable to find a @proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory implementation. Either implement DefaultGoogleCloudStorageConfigFactory or pass in a config when instantiating GoogleCloudStorageDriver.");
63
+ }
64
+ return defaultConfigFactory.getConfig();
65
+ };
66
+ GoogleCloudStorageDriver.prototype.createFile = function (file, fileData) {
67
+ return __awaiter(this, void 0, void 0, function () {
68
+ var bucket, gcsFile;
69
+ return __generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0:
72
+ bucket = this.storage.bucket(this.bucketName);
73
+ gcsFile = bucket.file(file.id);
74
+ return [4 /*yield*/, gcsFile.save(fileData, {
75
+ metadata: {
76
+ contentType: file.type,
77
+ metadata: {
78
+ fileId: file.id,
79
+ fileName: file.name,
80
+ fileSize: file.size.toString(),
81
+ },
82
+ },
83
+ })];
84
+ case 1:
85
+ _a.sent();
86
+ return [2 /*return*/];
87
+ }
88
+ });
89
+ });
90
+ };
91
+ GoogleCloudStorageDriver.prototype.getFileData = function (fileId) {
92
+ return __awaiter(this, void 0, void 0, function () {
93
+ var file, fileContent;
94
+ return __generator(this, function (_a) {
95
+ switch (_a.label) {
96
+ case 0:
97
+ file = this.storage.bucket(this.bucketName).file(fileId);
98
+ return [4 /*yield*/, file.download()];
99
+ case 1:
100
+ fileContent = (_a.sent())[0];
101
+ return [2 /*return*/, fileContent.toString()];
102
+ }
103
+ });
104
+ });
105
+ };
106
+ GoogleCloudStorageDriver.prototype.updateFileData = function (fileId, data) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var file;
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0:
112
+ file = this.storage.bucket(this.bucketName).file(fileId);
113
+ return [4 /*yield*/, file.save(data)];
114
+ case 1:
115
+ _a.sent();
116
+ return [2 /*return*/];
117
+ }
118
+ });
119
+ });
120
+ };
121
+ GoogleCloudStorageDriver.prototype.updateFile = function (file) {
122
+ return __awaiter(this, void 0, void 0, function () {
123
+ var gcsFile;
124
+ return __generator(this, function (_a) {
125
+ switch (_a.label) {
126
+ case 0:
127
+ gcsFile = this.storage.bucket(this.bucketName).file(file.id);
128
+ return [4 /*yield*/, gcsFile.setMetadata({
129
+ contentType: file.type,
130
+ metadata: {
131
+ fileId: file.id,
132
+ fileName: file.name,
133
+ fileSize: file.size.toString(),
134
+ },
135
+ })];
136
+ case 1:
137
+ _a.sent();
138
+ return [2 /*return*/];
139
+ }
140
+ });
141
+ });
142
+ };
143
+ return GoogleCloudStorageDriver;
144
+ }());
145
+ exports.GoogleCloudStorageDriver = GoogleCloudStorageDriver;
146
+ //# sourceMappingURL=GoogleCloudStorageDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleCloudStorageDriver.js","sourceRoot":"","sources":["../../src/GoogleCloudStorageDriver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAgD;AAEhD,mGAGkD;AAElD;IAIE,kCAAY,MAAiC;QACrC,IAAA,KAA4C,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAnF,SAAS,eAAA,EAAE,UAAU,gBAAA,EAAE,cAAc,oBAA8C,CAAC;QAC5F,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,uBAAM,cAAc,KAAE,SAAS,WAAA,IAAG,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAEO,mDAAgB,GAAxB;QACE,IAAM,oBAAoB,GAAG,IAAA,kFAAyC,GAAE,CAAC;QACzE,IAAI,CAAC,oBAAoB,EAAE;YACzB,MAAM,IAAI,KAAK,CACb,wOAAwO,CACzO,CAAC;SACH;QAED,OAAO,oBAAoB,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC;IAEK,6CAAU,GAAhB,UAAiB,IAAU,EAAE,QAAgB;;;;;;wBACrC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC9C,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAErC,qBAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE;gCAC3B,QAAQ,EAAE;oCACR,WAAW,EAAE,IAAI,CAAC,IAAI;oCACtB,QAAQ,EAAE;wCACR,MAAM,EAAE,IAAI,CAAC,EAAE;wCACf,QAAQ,EAAE,IAAI,CAAC,IAAI;wCACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;qCAC/B;iCACF;6BACF,CAAC,EAAA;;wBATF,SASE,CAAC;;;;;KACJ;IAEK,8CAAW,GAAjB,UAAkB,MAAc;;;;;;wBACxB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACzC,qBAAM,IAAI,CAAC,QAAQ,EAAE,EAAA;;wBAApC,WAAW,GAAI,CAAA,SAAqB,CAAA,GAAzB;wBAClB,sBAAO,WAAW,CAAC,QAAQ,EAAE,EAAC;;;;KAC/B;IAEK,iDAAc,GAApB,UAAqB,MAAc,EAAE,IAAY;;;;;;wBACzC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC/D,qBAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAA;;wBAArB,SAAqB,CAAC;;;;;KACvB;IAEK,6CAAU,GAAhB,UAAiB,IAAU;;;;;;wBACnB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACnE,qBAAM,OAAO,CAAC,WAAW,CAAC;gCACxB,WAAW,EAAE,IAAI,CAAC,IAAI;gCACtB,QAAQ,EAAE;oCACR,MAAM,EAAE,IAAI,CAAC,EAAE;oCACf,QAAQ,EAAE,IAAI,CAAC,IAAI;oCACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;iCAC/B;6BACF,CAAC,EAAA;;wBAPF,SAOE,CAAC;;;;;KACJ;IACH,+BAAC;AAAD,CAAC,AA3DD,IA2DC;AA3DY,4DAAwB"}
@@ -0,0 +1,13 @@
1
+ import { QueryBuilder, Table, TableWatcher } from '@proteinjs/db';
2
+ import { File } from '@proteinjs/db-file';
3
+ export declare class GoogleCloudStorageTableWatcher implements TableWatcher<File> {
4
+ private logger;
5
+ private storage;
6
+ private bucketName;
7
+ constructor();
8
+ private getConfig;
9
+ name(): string;
10
+ table(): Table<File>;
11
+ beforeDelete<T extends File>(recordsToDelete: T[], qb: QueryBuilder<T>): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=GoogleCloudStorageTableWatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleCloudStorageTableWatcher.d.ts","sourceRoot":"","sources":["../../src/GoogleCloudStorageTableWatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,IAAI,EAAa,MAAM,oBAAoB,CAAC;AAOrD,qBAAa,8BAA+B,YAAW,YAAY,CAAC,IAAI,CAAC;IACvE,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,UAAU,CAAS;;IAQ3B,OAAO,CAAC,SAAS;IAWjB,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC;IAId,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAS7F"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.GoogleCloudStorageTableWatcher = void 0;
51
+ var storage_1 = require("@google-cloud/storage");
52
+ var db_file_1 = require("@proteinjs/db-file");
53
+ var util_1 = require("@proteinjs/util");
54
+ var DefaultGoogleCloudStorageConfigFactory_1 = require("./DefaultGoogleCloudStorageConfigFactory");
55
+ var GoogleCloudStorageTableWatcher = /** @class */ (function () {
56
+ function GoogleCloudStorageTableWatcher() {
57
+ this.logger = new util_1.Logger(this.constructor.name);
58
+ var _a = this.getConfig(), projectId = _a.projectId, bucketName = _a.bucketName, storageOptions = _a.storageOptions;
59
+ this.storage = new storage_1.Storage(__assign(__assign({}, storageOptions), { projectId: projectId }));
60
+ this.bucketName = bucketName;
61
+ }
62
+ GoogleCloudStorageTableWatcher.prototype.getConfig = function () {
63
+ var defaultConfigFactory = (0, DefaultGoogleCloudStorageConfigFactory_1.getDefaultGoogleCloudStorageConfigFactory)();
64
+ if (!defaultConfigFactory) {
65
+ throw new Error("Unable to find a @proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory implementation when creating GoogleCloudStorageTableWatcher");
66
+ }
67
+ return defaultConfigFactory.getConfig();
68
+ };
69
+ GoogleCloudStorageTableWatcher.prototype.name = function () {
70
+ return this.constructor.name;
71
+ };
72
+ GoogleCloudStorageTableWatcher.prototype.table = function () {
73
+ return new db_file_1.FileTable();
74
+ };
75
+ GoogleCloudStorageTableWatcher.prototype.beforeDelete = function (recordsToDelete, qb) {
76
+ return __awaiter(this, void 0, void 0, function () {
77
+ var fileIdsToDelete, _i, fileIdsToDelete_1, fileId, file;
78
+ return __generator(this, function (_a) {
79
+ switch (_a.label) {
80
+ case 0:
81
+ fileIdsToDelete = recordsToDelete.map(function (record) { return record.id; });
82
+ _i = 0, fileIdsToDelete_1 = fileIdsToDelete;
83
+ _a.label = 1;
84
+ case 1:
85
+ if (!(_i < fileIdsToDelete_1.length)) return [3 /*break*/, 4];
86
+ fileId = fileIdsToDelete_1[_i];
87
+ file = this.storage.bucket(this.bucketName).file(fileId);
88
+ return [4 /*yield*/, file.delete()];
89
+ case 2:
90
+ _a.sent();
91
+ _a.label = 3;
92
+ case 3:
93
+ _i++;
94
+ return [3 /*break*/, 1];
95
+ case 4:
96
+ this.logger.info("Deleted the following files from Google Cloud Storage: ".concat(JSON.stringify(fileIdsToDelete)));
97
+ return [2 /*return*/];
98
+ }
99
+ });
100
+ });
101
+ };
102
+ return GoogleCloudStorageTableWatcher;
103
+ }());
104
+ exports.GoogleCloudStorageTableWatcher = GoogleCloudStorageTableWatcher;
105
+ //# sourceMappingURL=GoogleCloudStorageTableWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleCloudStorageTableWatcher.js","sourceRoot":"","sources":["../../src/GoogleCloudStorageTableWatcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAgD;AAEhD,8CAAqD;AACrD,wCAAyC;AACzC,mGAGkD;AAElD;IAKE;QAJQ,WAAM,GAAG,IAAI,aAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAK3C,IAAA,KAA4C,IAAI,CAAC,SAAS,EAAE,EAA1D,SAAS,eAAA,EAAE,UAAU,gBAAA,EAAE,cAAc,oBAAqB,CAAC;QACnE,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,uBAAM,cAAc,KAAE,SAAS,WAAA,IAAG,CAAC;QAC7D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAEO,kDAAS,GAAjB;QACE,IAAM,oBAAoB,GAAG,IAAA,kFAAyC,GAAE,CAAC;QACzE,IAAI,CAAC,oBAAoB,EAAE;YACzB,MAAM,IAAI,KAAK,CACb,2JAA2J,CAC5J,CAAC;SACH;QAED,OAAO,oBAAoB,CAAC,SAAS,EAAE,CAAC;IAC1C,CAAC;IAED,6CAAI,GAAJ;QACE,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,8CAAK,GAAL;QACE,OAAO,IAAI,mBAAS,EAAE,CAAC;IACzB,CAAC;IAEK,qDAAY,GAAlB,UAAmC,eAAoB,EAAE,EAAmB;;;;;;wBACpE,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,MAAM,CAAC,EAAE,EAAT,CAAS,CAAC,CAAC;8BAC/B,EAAf,mCAAe;;;6BAAf,CAAA,6BAAe,CAAA;wBAAzB,MAAM;wBACT,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC/D,qBAAM,IAAI,CAAC,MAAM,EAAE,EAAA;;wBAAnB,SAAmB,CAAC;;;wBAFD,IAAe,CAAA;;;wBAKpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iEAA0D,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAE,CAAC,CAAC;;;;;KAC/G;IACH,qCAAC;AAAD,CAAC,AAvCD,IAuCC;AAvCY,wEAA8B"}
@@ -0,0 +1,32 @@
1
+ /** Load Dependency Source Graphs */
2
+
3
+ import '@google-cloud/storage';
4
+ import '@proteinjs/db';
5
+ import '@proteinjs/db-file';
6
+ import '@proteinjs/reflection';
7
+ import '@proteinjs/util';
8
+
9
+
10
+ /** Generate Source Graph */
11
+
12
+ const sourceGraph = "{\"options\":{\"directed\":true,\"multigraph\":false,\"compound\":false},\"nodes\":[{\"v\":\"@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory\",\"value\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"DefaultGoogleCloudStorageConfigFactory\",\"filePath\":\"/Users/brentbahry/workspaces/n3xa/packages/proteinjs/packages/db/packages/file-storage-drivers/google-cloud-storage/src/DefaultGoogleCloudStorageConfigFactory.ts\",\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory\",\"properties\":[],\"methods\":[{\"name\":\"getConfig\",\"returnType\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageConfig\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageConfig\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":true,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[]}],\"typeParameters\":[],\"directParents\":[{\"packageName\":\"@proteinjs/reflection\",\"name\":\"Loadable\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/reflection/Loadable\",\"properties\":[],\"methods\":[],\"typeParameters\":[],\"directParents\":[]}],\"sourceType\":3}},{\"v\":\"@proteinjs/reflection/Loadable\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver\",\"value\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageDriver\",\"filePath\":\"/Users/brentbahry/workspaces/n3xa/packages/proteinjs/packages/db/packages/file-storage-drivers/google-cloud-storage/src/GoogleCloudStorageDriver.ts\",\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver\",\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"properties\":[{\"name\":\"storage\",\"type\":{\"packageName\":\"@google-cloud/storage\",\"name\":\"Storage\",\"filePath\":null,\"qualifiedName\":\"@google-cloud/storage/Storage\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"},{\"name\":\"bucketName\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"}],\"methods\":[{\"name\":\"getDefaultConfig\",\"returnType\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageConfig\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageConfig\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\",\"parameters\":[]},{\"name\":\"createFile\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"file\",\"type\":{\"packageName\":\"@proteinjs/db-file\",\"name\":\"File\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file/File\",\"typeParameters\":null,\"directParents\":null}},{\"name\":\"fileData\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}}]},{\"name\":\"getFileData\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<string>\",\"filePath\":null,\"qualifiedName\":\"/Promise<string>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"fileId\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}}]},{\"name\":\"updateFileData\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"fileId\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}},{\"name\":\"data\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null}}]},{\"name\":\"updateFile\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"file\",\"type\":{\"packageName\":\"@proteinjs/db-file\",\"name\":\"File\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file/File\",\"typeParameters\":null,\"directParents\":null}}]}],\"typeParameters\":[],\"directParentInterfaces\":[{\"packageName\":\"@proteinjs/db-file\",\"name\":\"FileStorageDriver\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file/FileStorageDriver\",\"properties\":[],\"methods\":[],\"typeParameters\":[],\"directParents\":[]}],\"directParentClasses\":[],\"sourceType\":2}},{\"v\":\"@proteinjs/db-file/FileStorageDriver\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher\",\"value\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageTableWatcher\",\"filePath\":\"/Users/brentbahry/workspaces/n3xa/packages/proteinjs/packages/db/packages/file-storage-drivers/google-cloud-storage/src/GoogleCloudStorageTableWatcher.ts\",\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher\",\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"properties\":[{\"name\":\"logger\",\"type\":null,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"},{\"name\":\"storage\",\"type\":{\"packageName\":\"@google-cloud/storage\",\"name\":\"Storage\",\"filePath\":null,\"qualifiedName\":\"@google-cloud/storage/Storage\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"},{\"name\":\"bucketName\",\"type\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null},\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\"}],\"methods\":[{\"name\":\"getConfig\",\"returnType\":{\"packageName\":\"@proteinjs/db-file-storage-driver-gcs\",\"name\":\"GoogleCloudStorageConfig\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageConfig\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"private\",\"parameters\":[]},{\"name\":\"name\",\"returnType\":{\"packageName\":\"\",\"name\":\"string\",\"filePath\":null,\"qualifiedName\":\"/string\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[]},{\"name\":\"table\",\"returnType\":{\"packageName\":\"\",\"name\":\"Table<File>\",\"filePath\":null,\"qualifiedName\":\"/Table<File>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":false,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[]},{\"name\":\"beforeDelete\",\"returnType\":{\"packageName\":\"\",\"name\":\"Promise<void>\",\"filePath\":null,\"qualifiedName\":\"/Promise<void>\",\"typeParameters\":null,\"directParents\":null},\"isAsync\":true,\"isOptional\":false,\"isAbstract\":false,\"isStatic\":false,\"visibility\":\"public\",\"parameters\":[{\"name\":\"recordsToDelete\",\"type\":{\"packageName\":\"\",\"name\":\"T[]\",\"filePath\":null,\"qualifiedName\":\"/T[]\",\"typeParameters\":null,\"directParents\":null}},{\"name\":\"qb\",\"type\":{\"packageName\":\"\",\"name\":\"QueryBuilder<T>\",\"filePath\":null,\"qualifiedName\":\"/QueryBuilder<T>\",\"typeParameters\":null,\"directParents\":null}}]}],\"typeParameters\":[],\"directParentInterfaces\":[{\"packageName\":\"@proteinjs/db\",\"name\":\"TableWatcher\",\"filePath\":null,\"qualifiedName\":\"@proteinjs/db/TableWatcher\",\"properties\":[],\"methods\":[],\"typeParameters\":[\"@proteinjs/db-file/File\"],\"directParents\":[]}],\"directParentClasses\":[],\"sourceType\":2}},{\"v\":\"@proteinjs/db/TableWatcher\"}],\"edges\":[{\"v\":\"@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory\",\"w\":\"@proteinjs/reflection/Loadable\",\"value\":\"extends interface\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver\",\"w\":\"@proteinjs/db-file/FileStorageDriver\",\"value\":\"implements interface\"},{\"v\":\"@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher\",\"w\":\"@proteinjs/db/TableWatcher\",\"value\":\"implements interface\"}]}";
13
+
14
+
15
+ /** Generate Source Links */
16
+
17
+ import { GoogleCloudStorageDriver } from '../src/GoogleCloudStorageDriver';
18
+ import { GoogleCloudStorageTableWatcher } from '../src/GoogleCloudStorageTableWatcher';
19
+
20
+ const sourceLinks = {
21
+ '@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageDriver': GoogleCloudStorageDriver,
22
+ '@proteinjs/db-file-storage-driver-gcs/GoogleCloudStorageTableWatcher': GoogleCloudStorageTableWatcher,
23
+ };
24
+
25
+
26
+ /** Load Source Graph and Links */
27
+
28
+ import { SourceRepository } from '@proteinjs/reflection';
29
+ SourceRepository.merge(sourceGraph, sourceLinks);
30
+
31
+
32
+ export * from '../index';
package/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './src/GoogleCloudStorageDriver';
2
+ export * from './src/DefaultGoogleCloudStorageConfigFactory';
package/jest.config.js ADDED
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ roots: ['<rootDir>/test'],
3
+ transform: {
4
+ '^.+\\.tsx?$': 'ts-jest',
5
+ },
6
+ testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
7
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
8
+ testEnvironment: 'node',
9
+ };
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@proteinjs/db-file-storage-driver-gcs",
3
+ "version": "1.0.1",
4
+ "description": "File storage in Google Cloud Storage",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/proteinjs/db.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/proteinjs/db/issues"
14
+ },
15
+ "homepage": "https://github.com/proteinjs/db#readme",
16
+ "author": "Brent Bahry",
17
+ "license": "ISC",
18
+ "scripts": {
19
+ "clean": "rm -rf dist/ node_modules/ generated/",
20
+ "build": "reflection-build && tsc",
21
+ "watch": "reflection-watch"
22
+ },
23
+ "dependencies": {
24
+ "@google-cloud/storage": "7.11.2",
25
+ "@proteinjs/db": "^1.3.0",
26
+ "@proteinjs/db-file": "^1.1.1",
27
+ "@proteinjs/reflection": "1.1.6",
28
+ "@proteinjs/util": "1.2.0"
29
+ },
30
+ "devDependencies": {
31
+ "@proteinjs/reflection-build": "1.0.21",
32
+ "@types/jest": "29.5.5",
33
+ "@types/node": "14.0.27",
34
+ "@typescript-eslint/eslint-plugin": "7.8.0",
35
+ "@typescript-eslint/parser": "7.8.0",
36
+ "eslint": "8.57.0",
37
+ "eslint-config-prettier": "9.1.0",
38
+ "eslint-plugin-prettier": "5.1.3",
39
+ "jest": "29.7.0",
40
+ "ts-jest": "29.1.1",
41
+ "typescript": "5.2.2"
42
+ },
43
+ "main": "./dist/generated/index.js",
44
+ "types": "./dist/generated/index.d.ts"
45
+ }
@@ -0,0 +1,17 @@
1
+ import { Loadable, SourceRepository } from '@proteinjs/reflection';
2
+ import { StorageOptions } from '@google-cloud/storage';
3
+
4
+ export const getDefaultGoogleCloudStorageConfigFactory = () =>
5
+ SourceRepository.get().object<DefaultGoogleCloudStorageConfigFactory>(
6
+ '@proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory'
7
+ );
8
+
9
+ export type GoogleCloudStorageConfig = {
10
+ bucketName: string;
11
+ projectId: string;
12
+ storageOptions?: StorageOptions;
13
+ };
14
+
15
+ export interface DefaultGoogleCloudStorageConfigFactory extends Loadable {
16
+ getConfig(): GoogleCloudStorageConfig;
17
+ }
@@ -0,0 +1,67 @@
1
+ import { Storage } from '@google-cloud/storage';
2
+ import { File, FileStorageDriver } from '@proteinjs/db-file';
3
+ import {
4
+ GoogleCloudStorageConfig,
5
+ getDefaultGoogleCloudStorageConfigFactory,
6
+ } from './DefaultGoogleCloudStorageConfigFactory';
7
+
8
+ export class GoogleCloudStorageDriver implements FileStorageDriver {
9
+ private storage: Storage;
10
+ private bucketName: string;
11
+
12
+ constructor(config?: GoogleCloudStorageConfig) {
13
+ const { projectId, bucketName, storageOptions } = config ? config : this.getDefaultConfig();
14
+ this.storage = new Storage({ ...storageOptions, projectId });
15
+ this.bucketName = bucketName;
16
+ }
17
+
18
+ private getDefaultConfig(): GoogleCloudStorageConfig {
19
+ const defaultConfigFactory = getDefaultGoogleCloudStorageConfigFactory();
20
+ if (!defaultConfigFactory) {
21
+ throw new Error(
22
+ `Unable to find a @proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory implementation. Either implement DefaultGoogleCloudStorageConfigFactory or pass in a config when instantiating GoogleCloudStorageDriver.`
23
+ );
24
+ }
25
+
26
+ return defaultConfigFactory.getConfig();
27
+ }
28
+
29
+ async createFile(file: File, fileData: string): Promise<void> {
30
+ const bucket = this.storage.bucket(this.bucketName);
31
+ const gcsFile = bucket.file(file.id);
32
+
33
+ await gcsFile.save(fileData, {
34
+ metadata: {
35
+ contentType: file.type,
36
+ metadata: {
37
+ fileId: file.id,
38
+ fileName: file.name,
39
+ fileSize: file.size.toString(),
40
+ },
41
+ },
42
+ });
43
+ }
44
+
45
+ async getFileData(fileId: string): Promise<string> {
46
+ const file = this.storage.bucket(this.bucketName).file(fileId);
47
+ const [fileContent] = await file.download();
48
+ return fileContent.toString();
49
+ }
50
+
51
+ async updateFileData(fileId: string, data: string): Promise<void> {
52
+ const file = this.storage.bucket(this.bucketName).file(fileId);
53
+ await file.save(data);
54
+ }
55
+
56
+ async updateFile(file: File): Promise<void> {
57
+ const gcsFile = this.storage.bucket(this.bucketName).file(file.id);
58
+ await gcsFile.setMetadata({
59
+ contentType: file.type,
60
+ metadata: {
61
+ fileId: file.id,
62
+ fileName: file.name,
63
+ fileSize: file.size.toString(),
64
+ },
65
+ });
66
+ }
67
+ }
@@ -0,0 +1,49 @@
1
+ import { Storage } from '@google-cloud/storage';
2
+ import { QueryBuilder, Table, TableWatcher } from '@proteinjs/db';
3
+ import { File, FileTable } from '@proteinjs/db-file';
4
+ import { Logger } from '@proteinjs/util';
5
+ import {
6
+ GoogleCloudStorageConfig,
7
+ getDefaultGoogleCloudStorageConfigFactory,
8
+ } from './DefaultGoogleCloudStorageConfigFactory';
9
+
10
+ export class GoogleCloudStorageTableWatcher implements TableWatcher<File> {
11
+ private logger = new Logger(this.constructor.name);
12
+ private storage: Storage;
13
+ private bucketName: string;
14
+
15
+ constructor() {
16
+ const { projectId, bucketName, storageOptions } = this.getConfig();
17
+ this.storage = new Storage({ ...storageOptions, projectId });
18
+ this.bucketName = bucketName;
19
+ }
20
+
21
+ private getConfig(): GoogleCloudStorageConfig {
22
+ const defaultConfigFactory = getDefaultGoogleCloudStorageConfigFactory();
23
+ if (!defaultConfigFactory) {
24
+ throw new Error(
25
+ `Unable to find a @proteinjs/db-file-storage-driver-gcs/DefaultGoogleCloudStorageConfigFactory implementation when creating GoogleCloudStorageTableWatcher`
26
+ );
27
+ }
28
+
29
+ return defaultConfigFactory.getConfig();
30
+ }
31
+
32
+ name(): string {
33
+ return this.constructor.name;
34
+ }
35
+
36
+ table(): Table<File> {
37
+ return new FileTable();
38
+ }
39
+
40
+ async beforeDelete<T extends File>(recordsToDelete: T[], qb: QueryBuilder<T>): Promise<void> {
41
+ const fileIdsToDelete = recordsToDelete.map((record) => record.id);
42
+ for (const fileId of fileIdsToDelete) {
43
+ const file = this.storage.bucket(this.bucketName).file(fileId);
44
+ await file.delete();
45
+ }
46
+
47
+ this.logger.info(`Deleted the following files from Google Cloud Storage: ${JSON.stringify(fileIdsToDelete)}`);
48
+ }
49
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./",
4
+ "target": "es5",
5
+ "module": "commonjs",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "sourceMap": true,
9
+ "outDir": "./dist/",
10
+ "strict": true,
11
+ "noImplicitAny": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "resolveJsonModule": true,
16
+ "typeRoots": [
17
+ "./node_modules/@types"
18
+ ],
19
+ "types": [
20
+ "node",
21
+ "jest"
22
+ ]
23
+ },
24
+ "include": [
25
+ "./src/**/*.ts",
26
+ "./generated/**/*.ts",
27
+ "./generated/index.ts"
28
+ ]
29
+ }