@webda/gcp 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +166 -0
- package/README.md +13 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/index.spec.d.ts +4 -0
- package/lib/index.spec.js +25 -0
- package/lib/index.spec.js.map +1 -0
- package/lib/services/firestore.d.ts +124 -0
- package/lib/services/firestore.js +426 -0
- package/lib/services/firestore.js.map +1 -0
- package/lib/services/firestore.spec.d.ts +1 -0
- package/lib/services/firestore.spec.js +226 -0
- package/lib/services/firestore.spec.js.map +1 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/index.js +18 -0
- package/lib/services/index.js.map +1 -0
- package/lib/services/pubsub.d.ts +35 -0
- package/lib/services/pubsub.js +93 -0
- package/lib/services/pubsub.js.map +1 -0
- package/lib/services/pubsub.spec.d.ts +1 -0
- package/lib/services/pubsub.spec.js +73 -0
- package/lib/services/pubsub.spec.js.map +1 -0
- package/lib/services/queue.d.ts +81 -0
- package/lib/services/queue.js +159 -0
- package/lib/services/queue.js.map +1 -0
- package/lib/services/queue.spec.d.ts +1 -0
- package/lib/services/queue.spec.js +120 -0
- package/lib/services/queue.spec.js.map +1 -0
- package/lib/services/storage.d.ts +131 -0
- package/lib/services/storage.js +244 -0
- package/lib/services/storage.js.map +1 -0
- package/lib/services/storage.spec.d.ts +1 -0
- package/lib/services/storage.spec.js +213 -0
- package/lib/services/storage.spec.js.map +1 -0
- package/package.json +63 -0
- package/webda.module.json +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.spec.js","sourceRoot":"","sources":["../../src/services/firestore.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kEAA8D;AAC9D,2CAA8C;AAC9C,2CAAwC;AACxC,iCAAiC;AACjC,+BAA+B;AAC/B,+BAAoC;AACpC,uDAAoD;AACpD,sCAA6C;AAG7C,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,sBAAS;IAI7B,MAAM;;;;;YACV,IAAI,CAAC,QAAQ,GAAG,IAAA,SAAM,GAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;YACjC,MAAM,OAAM,MAAM,WAAE,CAAC;QACvB,CAAC;KAAA;IAED,aAAa;QACX,IAAI,KAAK,GAAmB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC1D,KAAK,CAAC,aAAa,EAAE,CAAC,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY;QACV,IAAI,IAAI,GAAmB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,EAAE,CAAC,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa;QACX,OAAO,YAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACW,gBAAgB,CAAC,cAAc,EAAE,SAAS;;YACtD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEK,eAAe;;YACnB,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YACzD,MAAM,OAAO,CAAC,GAAG,CACf,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;KAAA;IAEK,YAAY;;YAChB,qBAAqB;YACrB,IAAI,KAAK,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE;gBAClD,UAAU,EAAE,aAAa;gBACzB,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACrD,MAAM,EAAE;oBACN,GAAG,EAAE,QAAQ;iBACd;aACF,CAAC,CAAC;YACH,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACvF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACzC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACrE;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;IAGK,KAAK;;;;;YACT,IAAI,KAAK,GAAG,MAAM,OAAM,KAAK,WAAE,CAAC;YAChC,IAAI,GAAG,GAAG,IAAI,cAAO,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,aAAa,EAAE,CAAC;YAClF,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,mCAAmC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3C,GAAG,GAAG,IAAI,cAAO,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC,aAAa,EAAE,CAAC;YACjF,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,+BAA+B,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7F,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,GAAG,GAAG,IAAI,cAAO,CAAC,cAAc,CAAC,4CAA4C,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/F,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,2BAA2B,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC5F,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAsB,GAAG,CAAC,MAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjG,GAAG,GAAG,IAAI,cAAO,CAAC,cAAc,CAAC,4BAA4B,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/E,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC;YACnE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACtE,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,IAAI,cAAO,CAAC,cAAc,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE;gBACtG,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,0BAA0B;YAC1B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7C,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,IAAI,cAAO,CAAC,cAAc,CAAC,4CAA4C,CAAC,CAAC,aAAa,EAAE;gBAChG,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,IAAI,cAAO,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC,aAAa,EAAE;gBAClF,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;IAGK,UAAU;;YACd,mEAAmE;YACnE,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC1D,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxD,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC1D,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACpE,GAAG,CAAC,OAAO;iBACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;iBAC/B,OAAO,CAAC,CAAC,CAAC,EAAE;gBACX,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3F,CAAC,CAAC,CAAC;YACL,gDAAgD;YAChD,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACrE,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACrE,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACvE,CAAC;KAAA;IAED;;;;;OAKG;IACW,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO;;YAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;YAEnC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;YAChC,IAAI,SAAS,KAAK,CAAC,EAAE;gBACnB,gDAAgD;gBAChD,OAAO,EAAE,CAAC;gBACV,OAAO;aACR;YAED,8BAA8B;YAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC1B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;YAErB,6CAA6C;YAC7C,uBAAuB;YACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACpB,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEK,KAAK;;YACT,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;KAAA;IAGK,eAAe;;YACnB,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAClC,IAAI,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,CAAC;aACR,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAC;YAChG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;KAAA;IAGK,GAAG;;YACP,MAAM,KAAK,GAAyB,IAAI,CAAC,aAAa,EAAE,CAAC;YACzD,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;YACnH,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3F,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACxF,CAAC;KAAA;CACF,CAAA;AApHC;IADC,YAAI;0CAsCJ;AAGD;IADC,YAAI;+CAoBJ;AAsCD;IADC,YAAI;oDAQJ;AAGD;IADC,YAAI;wCASJ;AAtLG,aAAa;IADlB,aAAK;GACA,aAAa,CAuLlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./storage";
|
|
@@ -0,0 +1,18 @@
|
|
|
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("./storage"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CancelablePromise, PubSubService, ServiceParameters } from "@webda/core";
|
|
2
|
+
import { PubSub, CreateSubscriptionOptions, Subscription } from "@google-cloud/pubsub";
|
|
3
|
+
export declare class GCPPubSubParameters extends ServiceParameters {
|
|
4
|
+
/**
|
|
5
|
+
* Topic to use on GCP
|
|
6
|
+
*/
|
|
7
|
+
topic: string;
|
|
8
|
+
/**
|
|
9
|
+
* Subscription options to pass to GCP
|
|
10
|
+
*/
|
|
11
|
+
subscriptionOptions?: CreateSubscriptionOptions;
|
|
12
|
+
}
|
|
13
|
+
/***
|
|
14
|
+
* Implement GCP Pub/Sub
|
|
15
|
+
*
|
|
16
|
+
* Can also act as queue
|
|
17
|
+
*
|
|
18
|
+
* @WebdaModda GoogleCloudPubSub
|
|
19
|
+
*/
|
|
20
|
+
export default class GCPPubSubService<T = any, K extends GCPPubSubParameters = GCPPubSubParameters> extends PubSubService<T, K> {
|
|
21
|
+
pubsub: PubSub;
|
|
22
|
+
/**
|
|
23
|
+
* @override
|
|
24
|
+
*/
|
|
25
|
+
init(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* @override
|
|
28
|
+
*/
|
|
29
|
+
sendMessage(event: T): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* @override
|
|
32
|
+
*/
|
|
33
|
+
consume(callback: (event: T) => Promise<void>, eventPrototype?: new () => T, onBind?: (subscription: Subscription) => void): CancelablePromise<void>;
|
|
34
|
+
}
|
|
35
|
+
export { GCPPubSubService };
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.GCPPubSubService = exports.GCPPubSubParameters = void 0;
|
|
13
|
+
const core_1 = require("@webda/core");
|
|
14
|
+
const pubsub_1 = require("@google-cloud/pubsub");
|
|
15
|
+
class GCPPubSubParameters extends core_1.ServiceParameters {
|
|
16
|
+
}
|
|
17
|
+
exports.GCPPubSubParameters = GCPPubSubParameters;
|
|
18
|
+
/***
|
|
19
|
+
* Implement GCP Pub/Sub
|
|
20
|
+
*
|
|
21
|
+
* Can also act as queue
|
|
22
|
+
*
|
|
23
|
+
* @WebdaModda GoogleCloudPubSub
|
|
24
|
+
*/
|
|
25
|
+
class GCPPubSubService extends core_1.PubSubService {
|
|
26
|
+
/**
|
|
27
|
+
* @override
|
|
28
|
+
*/
|
|
29
|
+
init() {
|
|
30
|
+
const _super = Object.create(null, {
|
|
31
|
+
init: { get: () => super.init }
|
|
32
|
+
});
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
yield _super.init.call(this);
|
|
35
|
+
this.pubsub = new pubsub_1.PubSub();
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @override
|
|
40
|
+
*/
|
|
41
|
+
sendMessage(event) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
yield this.pubsub.topic(this.parameters.topic).publishMessage({ data: Buffer.from(JSON.stringify(event)) });
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @override
|
|
48
|
+
*/
|
|
49
|
+
consume(callback, eventPrototype, onBind) {
|
|
50
|
+
const subscriptionName = `${this.getName()}-${this.getWebda().getUuid()}`;
|
|
51
|
+
let subscription;
|
|
52
|
+
const messageHandler = (message) => __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
try {
|
|
54
|
+
yield callback(this.unserialize(message.data.toString(), eventPrototype));
|
|
55
|
+
message.ack();
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
this.log("ERROR", `${this.getName()} consume message error`, err);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return new core_1.CancelablePromise((_resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
try {
|
|
63
|
+
subscription = this.pubsub.subscription(subscriptionName);
|
|
64
|
+
const [result] = yield this.pubsub
|
|
65
|
+
.topic(this.parameters.topic)
|
|
66
|
+
.createSubscription(subscriptionName, this.parameters.subscriptionOptions);
|
|
67
|
+
subscription = result;
|
|
68
|
+
// Receive callbacks for new messages on the subscription
|
|
69
|
+
subscription.on("message", messageHandler);
|
|
70
|
+
// Receive callbacks for errors on the subscription
|
|
71
|
+
subscription.on("error", error => {
|
|
72
|
+
console.error("Received error:", error);
|
|
73
|
+
reject(error);
|
|
74
|
+
});
|
|
75
|
+
if (onBind) {
|
|
76
|
+
onBind(subscription);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
this.log("ERROR", `${this.getName()} consume error`, err);
|
|
81
|
+
reject(err);
|
|
82
|
+
}
|
|
83
|
+
}), () => __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
if (subscription) {
|
|
85
|
+
subscription.removeAllListeners();
|
|
86
|
+
yield subscription.delete();
|
|
87
|
+
}
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.default = GCPPubSubService;
|
|
92
|
+
exports.GCPPubSubService = GCPPubSubService;
|
|
93
|
+
//# sourceMappingURL=pubsub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub.js","sourceRoot":"","sources":["../../src/services/pubsub.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAkF;AAClF,iDAAgG;AAEhG,MAAa,mBAAoB,SAAQ,wBAAiB;CASzD;AATD,kDASC;AAED;;;;;;GAMG;AACH,MAAqB,gBAGnB,SAAQ,oBAAmB;IAG3B;;OAEG;IACG,IAAI;;;;;YACR,MAAM,OAAM,IAAI,WAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;QAC7B,CAAC;KAAA;IAED;;OAEG;IACG,WAAW,CAAC,KAAQ;;YACxB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;KAAA;IAED;;OAEG;IACH,OAAO,CACL,QAAqC,EACrC,cAA4B,EAC5B,MAA6C;QAE7C,MAAM,gBAAgB,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1E,IAAI,YAA0B,CAAC;QAC/B,MAAM,cAAc,GAAG,CAAO,OAAgB,EAAE,EAAE;YAChD,IAAI;gBACF,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,EAAE,CAAC;aACf;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAC;aACnE;QACH,CAAC,CAAA,CAAC;QACF,OAAO,IAAI,wBAAiB,CAC1B,CAAO,QAAQ,EAAE,MAAM,EAAE,EAAE;YACzB,IAAI;gBACF,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;gBAC1D,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM;qBAC/B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;qBAC5B,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;gBAC7E,YAAY,GAAG,MAAM,CAAC;gBAEtB,yDAAyD;gBACzD,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBAE3C,mDAAmD;gBACnD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;oBAC/B,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBACxC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,IAAI,MAAM,EAAE;oBACV,MAAM,CAAC,YAAY,CAAC,CAAC;iBACtB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,CAAC;aACb;QACH,CAAC,CAAA,EACD,GAAS,EAAE;YACT,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,kBAAkB,EAAE,CAAC;gBAClC,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;aAC7B;QACH,CAAC,CAAA,CACF,CAAC;IACJ,CAAC;CACF;AAxED,mCAwEC;AAEQ,4CAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const test_1 = require("@webda/core/lib/test");
|
|
19
|
+
const assert = require("assert");
|
|
20
|
+
const mocha_1 = require("@testdeck/mocha");
|
|
21
|
+
const core_1 = require("@webda/core");
|
|
22
|
+
const sinon = require("sinon");
|
|
23
|
+
let GCPPubSubTest = class GCPPubSubTest extends test_1.WebdaTest {
|
|
24
|
+
basic() {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
let pubsub = this.webda.getService("pubsub");
|
|
27
|
+
let counter = 0;
|
|
28
|
+
let consumers = [];
|
|
29
|
+
let subscription;
|
|
30
|
+
yield new Promise((resolve, reject) => {
|
|
31
|
+
consumers.push(pubsub.consume((evt) => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
counter++;
|
|
33
|
+
})));
|
|
34
|
+
consumers.push(pubsub.consume((evt) => __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
counter++;
|
|
36
|
+
throw new Error("Should not fail");
|
|
37
|
+
}), undefined, sub => {
|
|
38
|
+
subscription = sub;
|
|
39
|
+
resolve();
|
|
40
|
+
}));
|
|
41
|
+
});
|
|
42
|
+
yield pubsub.sendMessage("plop");
|
|
43
|
+
yield (0, core_1.WaitFor)((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
if (counter === 2) {
|
|
45
|
+
resolve();
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}), 10, "Events", undefined, (0, core_1.WaitLinearDelay)(1000));
|
|
50
|
+
// We might have concurrence in unit test
|
|
51
|
+
assert.ok(counter >= 2);
|
|
52
|
+
subscription.emit("error", "Fake server error");
|
|
53
|
+
yield assert.rejects(() => consumers[1], /Fake server error/);
|
|
54
|
+
yield consumers[0].cancel();
|
|
55
|
+
// Hack our way to test exception within the main loop
|
|
56
|
+
let stub = sinon.stub(pubsub.pubsub, "subscription").callsFake(() => {
|
|
57
|
+
throw new Error("Bad code?");
|
|
58
|
+
});
|
|
59
|
+
// Should reject
|
|
60
|
+
yield assert.rejects(() => pubsub.consume((evt) => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
counter++;
|
|
62
|
+
})), /Bad code\?/);
|
|
63
|
+
stub.restore();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
__decorate([
|
|
68
|
+
mocha_1.test
|
|
69
|
+
], GCPPubSubTest.prototype, "basic", null);
|
|
70
|
+
GCPPubSubTest = __decorate([
|
|
71
|
+
mocha_1.suite
|
|
72
|
+
], GCPPubSubTest);
|
|
73
|
+
//# sourceMappingURL=pubsub.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub.spec.js","sourceRoot":"","sources":["../../src/services/pubsub.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAAiD;AACjD,iCAAiC;AACjC,2CAA8C;AAE9C,sCAA0E;AAC1E,+BAA+B;AAG/B,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,gBAAS;IAE7B,KAAK;;YACT,IAAI,MAAM,GAAqB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAmB,QAAQ,CAAC,CAAC;YACjF,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,SAAS,GAAwB,EAAE,CAAC;YACxC,IAAI,YAAY,CAAC;YACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,SAAS,CAAC,IAAI,CACZ,MAAM,CAAC,OAAO,CAAC,CAAM,GAAG,EAAC,EAAE;oBACzB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAA,CAAC,CACH,CAAC;gBACF,SAAS,CAAC,IAAI,CACZ,MAAM,CAAC,OAAO,CACZ,CAAM,GAAG,EAAC,EAAE;oBACV,OAAO,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACrC,CAAC,CAAA,EACD,SAAS,EACT,GAAG,CAAC,EAAE;oBACJ,YAAY,GAAG,GAAG,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC,CACF,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,IAAA,cAAO,EACX,CAAM,OAAO,EAAC,EAAE;gBACd,IAAI,OAAO,KAAK,CAAC,EAAE;oBACjB,OAAO,EAAE,CAAC;oBACV,OAAO,IAAI,CAAC;iBACb;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAA,EACD,EAAE,EACF,QAAQ,EACR,SAAS,EACT,IAAA,sBAAe,EAAC,IAAI,CAAC,CACtB,CAAC;YACF,yCAAyC;YACzC,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;YAChD,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC9D,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC5B,sDAAsD;YACtD,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBAClE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,gBAAgB;YAChB,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CACH,MAAM,CAAC,OAAO,CAAC,CAAM,GAAG,EAAC,EAAE;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAA,CAAC,EACJ,YAAY,CACb,CAAC;YACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;KAAA;CACF,CAAA;AA1DC;IADC,YAAI;0CA0DJ;AA3DG,aAAa;IADlB,aAAK;GACA,aAAa,CA4DlB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Message, PubSub } from "@google-cloud/pubsub";
|
|
2
|
+
import { CancelablePromise, DeepPartial, MessageReceipt, Queue, QueueParameters } from "@webda/core";
|
|
3
|
+
/**
|
|
4
|
+
* GCPQueue Parameters
|
|
5
|
+
*/
|
|
6
|
+
export declare class GCPQueueParameters extends QueueParameters {
|
|
7
|
+
/**
|
|
8
|
+
* Topic to use
|
|
9
|
+
*/
|
|
10
|
+
topic: string;
|
|
11
|
+
/**
|
|
12
|
+
* Subscription to use for the queue
|
|
13
|
+
*
|
|
14
|
+
* All instances will use the same subscription to create a queue style pubsub
|
|
15
|
+
*/
|
|
16
|
+
subscription: string;
|
|
17
|
+
/**
|
|
18
|
+
* Timeout when receiveMessage is used before returning empty result (in ms)
|
|
19
|
+
*
|
|
20
|
+
* If not define then no timeout is applied and receiveMessage can hang forever
|
|
21
|
+
*/
|
|
22
|
+
timeout?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* GCP Queue implementation on top of Pub/Sub
|
|
26
|
+
*
|
|
27
|
+
* @WebdaModda GoogleCloudQueue
|
|
28
|
+
*/
|
|
29
|
+
export default class GCPQueue<T = any, K extends GCPQueueParameters = GCPQueueParameters> extends Queue<T, K> {
|
|
30
|
+
/**
|
|
31
|
+
* Main api object
|
|
32
|
+
*/
|
|
33
|
+
pubsub: PubSub;
|
|
34
|
+
/**
|
|
35
|
+
* Current project id, used for manual acknowledge of message based on just their ackId
|
|
36
|
+
*/
|
|
37
|
+
projectId: Promise<string>;
|
|
38
|
+
messages: {
|
|
39
|
+
[key: string]: Message;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* @override
|
|
43
|
+
*/
|
|
44
|
+
loadParameters(params: DeepPartial<K>): GCPQueueParameters;
|
|
45
|
+
/**
|
|
46
|
+
* @override
|
|
47
|
+
*/
|
|
48
|
+
init(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* The queue size is not available within this service
|
|
51
|
+
*
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
size(): Promise<0>;
|
|
55
|
+
/**
|
|
56
|
+
* Acknowledge a message
|
|
57
|
+
* @param id
|
|
58
|
+
*/
|
|
59
|
+
deleteMessage(id: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Send a message to the queue
|
|
62
|
+
* @param msg
|
|
63
|
+
*/
|
|
64
|
+
sendMessage(msg: T): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Retrieve just one message from the queue
|
|
67
|
+
* @param proto
|
|
68
|
+
* @returns
|
|
69
|
+
*/
|
|
70
|
+
receiveMessage<L>(proto?: new () => L): Promise<MessageReceipt<L>[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Work a queue calling the callback with every Event received
|
|
73
|
+
* If the callback is called without exception the `deleteMessage` is called
|
|
74
|
+
* @param callback
|
|
75
|
+
* @param eventPrototype
|
|
76
|
+
*/
|
|
77
|
+
consume(callback: (event: T) => Promise<void>, eventPrototype?: {
|
|
78
|
+
new (): T;
|
|
79
|
+
}): CancelablePromise;
|
|
80
|
+
}
|
|
81
|
+
export { GCPQueue };
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.GCPQueue = exports.GCPQueueParameters = void 0;
|
|
13
|
+
const pubsub_1 = require("@google-cloud/pubsub");
|
|
14
|
+
const core_1 = require("@webda/core");
|
|
15
|
+
/**
|
|
16
|
+
* GCPQueue Parameters
|
|
17
|
+
*/
|
|
18
|
+
class GCPQueueParameters extends core_1.QueueParameters {
|
|
19
|
+
}
|
|
20
|
+
exports.GCPQueueParameters = GCPQueueParameters;
|
|
21
|
+
/**
|
|
22
|
+
* GCP Queue implementation on top of Pub/Sub
|
|
23
|
+
*
|
|
24
|
+
* @WebdaModda GoogleCloudQueue
|
|
25
|
+
*/
|
|
26
|
+
class GCPQueue extends core_1.Queue {
|
|
27
|
+
constructor() {
|
|
28
|
+
super(...arguments);
|
|
29
|
+
this.messages = {};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @override
|
|
33
|
+
*/
|
|
34
|
+
loadParameters(params) {
|
|
35
|
+
return new GCPQueueParameters(params);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @override
|
|
39
|
+
*/
|
|
40
|
+
init() {
|
|
41
|
+
const _super = Object.create(null, {
|
|
42
|
+
init: { get: () => super.init }
|
|
43
|
+
});
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
yield _super.init.call(this);
|
|
46
|
+
this.pubsub = new pubsub_1.PubSub();
|
|
47
|
+
this.projectId = this.pubsub.auth.getProjectId();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The queue size is not available within this service
|
|
52
|
+
*
|
|
53
|
+
* @returns
|
|
54
|
+
*/
|
|
55
|
+
size() {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
return 0;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Acknowledge a message
|
|
62
|
+
* @param id
|
|
63
|
+
*/
|
|
64
|
+
deleteMessage(id) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
yield this.pubsub.auth.request({
|
|
67
|
+
method: "POST",
|
|
68
|
+
url: `https://pubsub.googleapis.com/v1/projects/${yield this.projectId}/subscriptions/${this.parameters.subscription}:acknowledge`,
|
|
69
|
+
body: JSON.stringify({
|
|
70
|
+
ackIds: [id],
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
73
|
+
this.messages[id].ack();
|
|
74
|
+
delete this.messages[id];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Send a message to the queue
|
|
79
|
+
* @param msg
|
|
80
|
+
*/
|
|
81
|
+
sendMessage(msg) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
yield this.pubsub.topic(this.parameters.topic).publishMessage({ data: Buffer.from(JSON.stringify(msg)) });
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Retrieve just one message from the queue
|
|
88
|
+
* @param proto
|
|
89
|
+
* @returns
|
|
90
|
+
*/
|
|
91
|
+
receiveMessage(proto) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
let timeoutId;
|
|
94
|
+
let errorHandler;
|
|
95
|
+
let msgHandler;
|
|
96
|
+
const subscription = this.pubsub.subscription(this.parameters.subscription, {
|
|
97
|
+
flowControl: {
|
|
98
|
+
maxMessages: 1,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
try {
|
|
102
|
+
return yield new Promise((resolve, reject) => {
|
|
103
|
+
if (this.parameters.timeout) {
|
|
104
|
+
timeoutId = setTimeout(() => resolve([]), this.parameters.timeout);
|
|
105
|
+
}
|
|
106
|
+
errorHandler = err => {
|
|
107
|
+
reject(err);
|
|
108
|
+
};
|
|
109
|
+
msgHandler = (message) => {
|
|
110
|
+
this.messages[message.ackId] = message;
|
|
111
|
+
resolve([
|
|
112
|
+
{
|
|
113
|
+
Message: this.unserialize(message.data.toString(), proto),
|
|
114
|
+
ReceiptHandle: message.ackId,
|
|
115
|
+
},
|
|
116
|
+
]);
|
|
117
|
+
};
|
|
118
|
+
subscription.on("error", errorHandler);
|
|
119
|
+
subscription.on("message", msgHandler);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
subscription.close();
|
|
124
|
+
if (timeoutId) {
|
|
125
|
+
clearTimeout(timeoutId);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Work a queue calling the callback with every Event received
|
|
132
|
+
* If the callback is called without exception the `deleteMessage` is called
|
|
133
|
+
* @param callback
|
|
134
|
+
* @param eventPrototype
|
|
135
|
+
*/
|
|
136
|
+
consume(callback, eventPrototype) {
|
|
137
|
+
const subscription = this.pubsub.subscription(this.parameters.subscription, {
|
|
138
|
+
flowControl: {
|
|
139
|
+
maxMessages: this.getMaxConsumers(),
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
return new core_1.CancelablePromise(() => __awaiter(this, void 0, void 0, function* () {
|
|
143
|
+
subscription.on("message", (message) => __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
try {
|
|
145
|
+
yield callback(this.unserialize(message.data.toString(), eventPrototype));
|
|
146
|
+
message.ack();
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
this.log("ERROR", `Message ${message.ackId}`, err);
|
|
150
|
+
}
|
|
151
|
+
}));
|
|
152
|
+
}), () => __awaiter(this, void 0, void 0, function* () {
|
|
153
|
+
subscription.close();
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.default = GCPQueue;
|
|
158
|
+
exports.GCPQueue = GCPQueue;
|
|
159
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/services/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const queue_spec_1 = require("@webda/core/lib/queues/queue.spec");
|
|
19
|
+
const assert = require("assert");
|
|
20
|
+
const mocha_1 = require("@testdeck/mocha");
|
|
21
|
+
const events_1 = require("events");
|
|
22
|
+
const sinon = require("sinon");
|
|
23
|
+
class FakeSubscription extends events_1.EventEmitter {
|
|
24
|
+
emitError() {
|
|
25
|
+
this.emit("error", "Fake error");
|
|
26
|
+
}
|
|
27
|
+
close() { }
|
|
28
|
+
}
|
|
29
|
+
let GCPQueueTest = class GCPQueueTest extends queue_spec_1.QueueTest {
|
|
30
|
+
basic() {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
let queue = this.webda.getService("queue");
|
|
33
|
+
queue.getParameters().subscription = `${queue.getParameters().subscription}_${this.webda.getUuid()}`;
|
|
34
|
+
yield queue.pubsub.createSubscription(queue.getParameters().topic, queue.getParameters().subscription, {
|
|
35
|
+
ackDeadlineSeconds: 10,
|
|
36
|
+
enableExactlyOnceDelivery: true,
|
|
37
|
+
});
|
|
38
|
+
try {
|
|
39
|
+
yield this.simple(queue, true, 12000);
|
|
40
|
+
// Seems to be penalized by no promise on ACK
|
|
41
|
+
yield this.sleep(5000);
|
|
42
|
+
this.log("DEBUG", "Verify receiveMessage is now empty");
|
|
43
|
+
queue.getParameters().timeout = 3000;
|
|
44
|
+
// TODO Investigate this one
|
|
45
|
+
if ((yield queue.receiveMessage()).length > 0) {
|
|
46
|
+
this.log("ERROR", "Queue should be empty - not an assert to avoid random");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
yield queue.pubsub.subscription(queue.getParameters().subscription).delete();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
consumers() {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
let queue = this.webda.getService("queue");
|
|
57
|
+
queue.getParameters().subscription = `${queue.getParameters().subscription}_${this.webda.getUuid()}`;
|
|
58
|
+
yield queue.pubsub.createSubscription(queue.getParameters().topic, queue.getParameters().subscription, {
|
|
59
|
+
ackDeadlineSeconds: 10,
|
|
60
|
+
enableMessageOrdering: true,
|
|
61
|
+
});
|
|
62
|
+
try {
|
|
63
|
+
// Test consumer
|
|
64
|
+
let msg;
|
|
65
|
+
let consumed = 0;
|
|
66
|
+
let consumer = queue.consume((dt) => __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
consumed++;
|
|
68
|
+
if (msg) {
|
|
69
|
+
throw new Error();
|
|
70
|
+
}
|
|
71
|
+
msg = dt;
|
|
72
|
+
}));
|
|
73
|
+
yield this.sleep(1000);
|
|
74
|
+
this.log("DEBUG", "Consume sendMessage");
|
|
75
|
+
yield queue.sendMessage({ plop: 1 });
|
|
76
|
+
this.log("DEBUG", "Consume cancel");
|
|
77
|
+
yield queue.sendMessage({ plop: 2 });
|
|
78
|
+
// Need to wait before cancel to ensure message are received
|
|
79
|
+
while (consumed < 2) {
|
|
80
|
+
yield this.sleep(500);
|
|
81
|
+
}
|
|
82
|
+
yield consumer.cancel();
|
|
83
|
+
this.log("DEBUG", "Consume assert");
|
|
84
|
+
assert.notStrictEqual(msg, undefined);
|
|
85
|
+
// The second message throw an exception so it can come back
|
|
86
|
+
yield queue.receiveMessage();
|
|
87
|
+
yield queue.receiveMessage();
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
yield queue.pubsub.subscription(queue.getParameters().subscription).delete();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
receiveError() {
|
|
95
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
this.log("DEBUG", "Receive Error test");
|
|
97
|
+
let queue = this.webda.getService("queue");
|
|
98
|
+
let service = new FakeSubscription();
|
|
99
|
+
sinon.stub(queue.pubsub, "subscription").callsFake(() => {
|
|
100
|
+
return service;
|
|
101
|
+
});
|
|
102
|
+
let consumer = queue.receiveMessage();
|
|
103
|
+
service.emitError();
|
|
104
|
+
yield assert.rejects(() => consumer, /Fake error/);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
__decorate([
|
|
109
|
+
mocha_1.test
|
|
110
|
+
], GCPQueueTest.prototype, "basic", null);
|
|
111
|
+
__decorate([
|
|
112
|
+
mocha_1.test
|
|
113
|
+
], GCPQueueTest.prototype, "consumers", null);
|
|
114
|
+
__decorate([
|
|
115
|
+
mocha_1.test
|
|
116
|
+
], GCPQueueTest.prototype, "receiveError", null);
|
|
117
|
+
GCPQueueTest = __decorate([
|
|
118
|
+
mocha_1.suite
|
|
119
|
+
], GCPQueueTest);
|
|
120
|
+
//# sourceMappingURL=queue.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.spec.js","sourceRoot":"","sources":["../../src/services/queue.spec.ts"],"names":[],"mappings":"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"}
|