gcf-common-lib 0.8.0 → 0.8.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/index.js CHANGED
@@ -1,168 +1,63 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- 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;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
2
  Object.defineProperty(exports, "__esModule", { value: true });
39
3
  exports.GcfCommon = exports.storage = exports.pubSub = void 0;
40
- var lodash_1 = require("lodash");
41
- var storage_1 = require("@google-cloud/storage");
42
- var pubsub_1 = require("@google-cloud/pubsub");
43
- var utils_1 = require("./utils");
4
+ const lodash_1 = require("lodash");
5
+ const storage_1 = require("@google-cloud/storage");
6
+ const pubsub_1 = require("@google-cloud/pubsub");
7
+ const utils_1 = require("./utils");
44
8
  exports.pubSub = new pubsub_1.PubSub();
45
9
  exports.storage = new storage_1.Storage();
46
- var GcfCommon = /** @class */ (function () {
47
- function GcfCommon() {
48
- }
49
- /**
50
- *
51
- * @param {!TEvent} event Event payload.
52
- * @param {!TContext} context Metadata for the event.
53
- * @param handler
54
- * @param timeout Seconds
55
- */
56
- GcfCommon.process = function (event, context, handler, timeout) {
57
- if (timeout === void 0) { timeout = 535; }
58
- return __awaiter(this, void 0, void 0, function () {
59
- var _this = this;
60
- return __generator(this, function (_a) {
61
- return [2 /*return*/, Promise.race([
62
- (0, utils_1.timeoutAfter)(timeout),
63
- handler(event, context),
64
- ])
65
- .then(function (res) { return __awaiter(_this, void 0, void 0, function () {
66
- return __generator(this, function (_a) {
67
- switch (_a.label) {
68
- case 0:
69
- // console.log('res:', res);
70
- return [4 /*yield*/, this.publish(event, context, res !== null && res !== void 0 ? res : {})];
71
- case 1:
72
- // console.log('res:', res);
73
- _a.sent();
74
- return [2 /*return*/];
75
- }
76
- });
77
- }); })
78
- .catch(function (err) { return __awaiter(_this, void 0, void 0, function () {
79
- var fname, response;
80
- var _a, _b;
81
- return __generator(this, function (_c) {
82
- switch (_c.label) {
83
- case 0:
84
- fname = (_b = (_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.K_SERVICE) !== null && _b !== void 0 ? _b : 'UNKNOWN';
85
- response = {
86
- error: {
87
- name: err.name,
88
- message: "GCF [" + fname + "]: " + err.message,
89
- stack: err.stack,
90
- },
91
- };
92
- return [4 /*yield*/, this.publish(event, context, response).catch(lodash_1.noop)];
93
- case 1:
94
- _c.sent();
95
- throw err;
96
- }
97
- });
98
- }); })];
99
- });
100
- });
101
- };
102
- GcfCommon.publish = function (event, context, json) {
103
- return __awaiter(this, void 0, void 0, function () {
104
- var topic;
105
- return __generator(this, function (_a) {
106
- switch (_a.label) {
107
- case 0: return [4 /*yield*/, this.getTopic(event, context)];
108
- case 1:
109
- topic = _a.sent();
110
- console.log('publish:', topic === null || topic === void 0 ? void 0 : topic.name, json);
111
- if (!topic) return [3 /*break*/, 3];
112
- return [4 /*yield*/, topic.publishMessage({ json: json })];
113
- case 2: return [2 /*return*/, _a.sent()];
114
- case 3: return [2 /*return*/];
115
- }
116
- });
117
- });
118
- };
119
- GcfCommon.getTopic = function (event, context) {
120
- var _a, _b, _c;
121
- return __awaiter(this, void 0, void 0, function () {
122
- var topicName, file, meta, topic;
123
- return __generator(this, function (_d) {
124
- switch (_d.label) {
125
- case 0:
126
- topicName = (_a = event === null || event === void 0 ? void 0 : event.metadata) === null || _a === void 0 ? void 0 : _a.topic;
127
- if (!(!topicName && ((_b = context === null || context === void 0 ? void 0 : context.resource) === null || _b === void 0 ? void 0 : _b.type) === 'storage#object')) return [3 /*break*/, 2];
128
- file = exports.storage.bucket(event.bucket).file(event.name);
129
- return [4 /*yield*/, file.getMetadata()];
130
- case 1:
131
- meta = (_d.sent())[0];
132
- topicName = (_c = meta === null || meta === void 0 ? void 0 : meta.metadata) === null || _c === void 0 ? void 0 : _c.topic;
133
- console.log('topic:', topicName);
134
- _d.label = 2;
135
- case 2:
136
- if (!!(0, lodash_1.isEmpty)(topicName)) return [3 /*break*/, 4];
137
- topic = exports.pubSub.topic(topicName);
138
- return [4 /*yield*/, topic.setMetadata({ labels: { date: topicName.split('__')[1] } })];
139
- case 3:
140
- _d.sent();
141
- return [2 /*return*/, topic];
142
- case 4: return [2 /*return*/];
143
- }
144
- });
145
- });
146
- };
147
- GcfCommon.getOptions = function (event, context) {
148
- var _a, _b, _c, _d, _e;
149
- return __awaiter(this, void 0, void 0, function () {
150
- var file, meta;
151
- return __generator(this, function (_f) {
152
- switch (_f.label) {
153
- case 0:
154
- if (!((_a = event === null || event === void 0 ? void 0 : event.metadata) === null || _a === void 0 ? void 0 : _a.options)) return [3 /*break*/, 1];
155
- return [2 /*return*/, JSON.parse((_c = (_b = event === null || event === void 0 ? void 0 : event.metadata) === null || _b === void 0 ? void 0 : _b.options) !== null && _c !== void 0 ? _c : '{}')];
156
- case 1:
157
- file = exports.storage.bucket(event.bucket).file(event.name);
158
- return [4 /*yield*/, file.getMetadata()];
159
- case 2:
160
- meta = (_f.sent())[0];
161
- return [2 /*return*/, JSON.parse((_e = (_d = meta === null || meta === void 0 ? void 0 : meta.metadata) === null || _d === void 0 ? void 0 : _d.options) !== null && _e !== void 0 ? _e : '{}')];
162
- }
163
- });
10
+ class GcfCommon {
11
+ static async process(event, context, handler, timeout = 535) {
12
+ return Promise.race([
13
+ (0, utils_1.timeoutAfter)(timeout),
14
+ handler(event, context),
15
+ ])
16
+ .then(async (res) => {
17
+ await this.publish(event, context, res ?? {});
18
+ })
19
+ .catch(async (err) => {
20
+ const fname = process?.env?.K_SERVICE ?? 'UNKNOWN';
21
+ const response = {
22
+ error: {
23
+ name: err.name,
24
+ message: `GCF [${fname}]: ${err.message}`,
25
+ stack: err.stack,
26
+ },
27
+ };
28
+ await this.publish(event, context, response).catch(lodash_1.noop);
29
+ throw err;
164
30
  });
165
- };
166
- return GcfCommon;
167
- }());
31
+ }
32
+ static async publish(event, context, json) {
33
+ const topic = await this.getTopic(event, context);
34
+ console.log('publish:', topic?.name, json);
35
+ if (topic)
36
+ return await topic.publishMessage({ json });
37
+ }
38
+ static async getTopic(event, context) {
39
+ let topicName = event?.metadata?.topic;
40
+ if (!topicName && context?.resource?.type === 'storage#object') {
41
+ const file = exports.storage.bucket(event.bucket).file(event.name);
42
+ const [meta] = await file.getMetadata();
43
+ topicName = meta?.metadata?.topic;
44
+ console.log('topic:', topicName);
45
+ }
46
+ if (topicName && !(0, lodash_1.isEmpty)(topicName)) {
47
+ const topic = exports.pubSub.topic(topicName);
48
+ await topic.setMetadata({ labels: { date: topicName.split('__')[1] } });
49
+ return topic;
50
+ }
51
+ }
52
+ static async getOptions(event, context) {
53
+ if (event?.metadata?.options) {
54
+ return JSON.parse(event?.metadata?.options ?? '{}');
55
+ }
56
+ else {
57
+ const file = exports.storage.bucket(event.bucket).file(event.name);
58
+ const [meta] = await file.getMetadata();
59
+ return JSON.parse(meta?.metadata?.options ?? '{}');
60
+ }
61
+ }
62
+ }
168
63
  exports.GcfCommon = GcfCommon;
package/index.ts CHANGED
@@ -39,7 +39,7 @@ export type TResponse = {
39
39
  error?: {
40
40
  name: string,
41
41
  message: string,
42
- stack: string,
42
+ stack?: string,
43
43
  }
44
44
  }
45
45
 
@@ -102,7 +102,7 @@ export class GcfCommon {
102
102
  console.log('topic:', topicName);
103
103
  }
104
104
 
105
- if (!isEmpty(topicName)) {
105
+ if (topicName && !isEmpty(topicName)) {
106
106
  const topic = pubSub.topic(topicName);
107
107
  await topic.setMetadata({labels: {date: topicName.split('__')[1]}});
108
108
  return topic;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gcf-common-lib",
3
3
  "description": "",
4
- "version": "0.8.0",
4
+ "version": "0.8.1",
5
5
  "publishConfig": {
6
6
  "access": "public",
7
7
  "branches": [
@@ -22,7 +22,8 @@
22
22
  "lodash": "^4.17.21"
23
23
  },
24
24
  "devDependencies": {
25
- "@types/lodash": "^4.14.178"
25
+ "@types/lodash": "^4.14.178",
26
+ "@tsconfig/node14": "^1.0.1"
26
27
  },
27
28
  "keywords": [],
28
29
  "author": "alert83@gmail.com",
package/tsconfig.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "http://json.schemastore.org/tsconfig",
3
+ "extends": "@tsconfig/node14/tsconfig.json",
4
+ "compilerOptions": {
5
+ "allowJs": false,
6
+ "removeComments": true,
7
+ "esModuleInterop": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "isolatedModules": false,
10
+ "emitDecoratorMetadata": true,
11
+ "experimentalDecorators": true,
12
+ "module": "commonjs",
13
+ "moduleResolution": "node",
14
+ "target": "ES2020",
15
+ "typeRoots": [
16
+ "node_modules/@types"
17
+ ],
18
+ "lib": [
19
+ "ES2018",
20
+ "ES2019",
21
+ "ES2020",
22
+ "ES2021",
23
+ "ESNext"
24
+ ],
25
+ "types": [],
26
+ "plugins": []
27
+ },
28
+ "exclude": [
29
+ "node_modules/**",
30
+ "**/*.d.ts"
31
+ ]
32
+ }
package/utils.js CHANGED
@@ -1,114 +1,46 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- 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;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
2
  Object.defineProperty(exports, "__esModule", { value: true });
39
3
  exports.A1ToColNum = exports.A1ToIndex = exports.colNumToA1 = exports.indexToA1 = exports.timeoutAfter = void 0;
40
- /**
41
- *
42
- * @param seconds Google function timeout limit (max: 9 min)
43
- */
44
- function timeoutAfter(seconds) {
45
- if (seconds === void 0) { seconds = 540; }
46
- return __awaiter(this, void 0, void 0, function () {
47
- return __generator(this, function (_a) {
48
- return [2 /*return*/, new Promise(function (resolve, reject) {
49
- setTimeout(function () {
50
- reject(new Error(seconds + " seconds timeout exceeded"));
51
- }, seconds * 1000);
52
- })];
53
- });
4
+ async function timeoutAfter(seconds = 540) {
5
+ return new Promise((resolve, reject) => {
6
+ setTimeout(() => {
7
+ reject(new Error(`${seconds} seconds timeout exceeded`));
8
+ }, seconds * 1000);
54
9
  });
55
10
  }
56
11
  exports.timeoutAfter = timeoutAfter;
57
- //
58
12
  function indexToA1(idx) {
59
- return __awaiter(this, void 0, void 0, function () {
60
- return __generator(this, function (_a) {
61
- return [2 /*return*/, this.colNumToA1(idx + 1)];
62
- });
63
- });
13
+ return colNumToA1(idx + 1);
64
14
  }
65
15
  exports.indexToA1 = indexToA1;
66
16
  function colNumToA1(columnNumber) {
67
- return __awaiter(this, void 0, void 0, function () {
68
- var chars, charIdxArr, rem;
69
- return __generator(this, function (_a) {
70
- chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
71
- charIdxArr = [];
72
- while (columnNumber > 0) {
73
- rem = columnNumber % chars.length;
74
- // If remainder is 0, then a
75
- // 'Z' must be there in output
76
- if (rem === 0) {
77
- charIdxArr.push(chars.length - 1);
78
- columnNumber = Math.floor(columnNumber / chars.length) - 1;
79
- }
80
- else { // If remainder is non-zero
81
- charIdxArr.push(rem - 1);
82
- columnNumber = Math.floor(columnNumber / chars.length);
83
- }
84
- }
85
- // Reverse the string and print result
86
- return [2 /*return*/, charIdxArr.reverse().map(function (n) { return chars[n]; }).join('')];
87
- });
88
- });
17
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
18
+ const charIdxArr = [];
19
+ while (columnNumber > 0) {
20
+ const rem = columnNumber % chars.length;
21
+ if (rem === 0) {
22
+ charIdxArr.push(chars.length - 1);
23
+ columnNumber = Math.floor(columnNumber / chars.length) - 1;
24
+ }
25
+ else {
26
+ charIdxArr.push(rem - 1);
27
+ columnNumber = Math.floor(columnNumber / chars.length);
28
+ }
29
+ }
30
+ return charIdxArr.reverse().map((n) => chars[n]).join('');
89
31
  }
90
32
  exports.colNumToA1 = colNumToA1;
91
33
  function A1ToIndex(value) {
92
- return __awaiter(this, void 0, void 0, function () {
93
- return __generator(this, function (_a) {
94
- return [2 /*return*/, this.A1ToColNum(value) - 1];
95
- });
96
- });
34
+ return A1ToColNum(value) - 1;
97
35
  }
98
36
  exports.A1ToIndex = A1ToIndex;
99
37
  function A1ToColNum(value) {
100
- return __awaiter(this, void 0, void 0, function () {
101
- var chars, result, i;
102
- return __generator(this, function (_a) {
103
- chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
104
- result = 0;
105
- // tslint:disable-next-line:prefer-for-of
106
- for (i = 0; i < value.length; i++) {
107
- result *= chars.length;
108
- result += chars.indexOf(value[i]) + 1;
109
- }
110
- return [2 /*return*/, result];
111
- });
112
- });
38
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
39
+ let result = 0;
40
+ for (let i = 0; i < value.length; i++) {
41
+ result *= chars.length;
42
+ result += chars.indexOf(value[i]) + 1;
43
+ }
44
+ return result;
113
45
  }
114
46
  exports.A1ToColNum = A1ToColNum;
package/utils.ts CHANGED
@@ -12,11 +12,11 @@ export async function timeoutAfter(seconds: number = 540) {
12
12
 
13
13
  //
14
14
 
15
- export async function indexToA1(idx: number) {
16
- return this.colNumToA1(idx + 1);
15
+ export function indexToA1(idx: number) {
16
+ return colNumToA1(idx + 1);
17
17
  }
18
18
 
19
- export async function colNumToA1(columnNumber: number) {
19
+ export function colNumToA1(columnNumber: number) {
20
20
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
21
21
 
22
22
  // To store result (Excel column name)
@@ -41,11 +41,11 @@ export async function colNumToA1(columnNumber: number) {
41
41
  return charIdxArr.reverse().map((n) => chars[n]).join('');
42
42
  }
43
43
 
44
- export async function A1ToIndex(value: string) {
45
- return this.A1ToColNum(value) - 1;
44
+ export function A1ToIndex(value: string) {
45
+ return A1ToColNum(value) - 1;
46
46
  }
47
47
 
48
- export async function A1ToColNum(value: string) {
48
+ export function A1ToColNum(value: string) {
49
49
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
50
50
  let result = 0;
51
51
  // tslint:disable-next-line:prefer-for-of