@blokjs/trigger-pubsub 0.2.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.
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ /**
3
+ * GCPPubSubAdapter - Google Cloud Pub/Sub adapter for PubSubTrigger
4
+ *
5
+ * Uses @google-cloud/pubsub for GCP Pub/Sub connectivity.
6
+ * Requires: npm install @google-cloud/pubsub
7
+ *
8
+ * Environment variables:
9
+ * - GOOGLE_CLOUD_PROJECT: GCP project ID
10
+ * - GOOGLE_APPLICATION_CREDENTIALS: Path to service account key file (optional if using default credentials)
11
+ * - PUBSUB_EMULATOR_HOST: Pub/Sub emulator host for local development (optional)
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.GCPPubSubAdapter = void 0;
48
+ const uuid_1 = require("uuid");
49
+ /**
50
+ * GCPPubSubAdapter - Google Cloud Pub/Sub implementation
51
+ */
52
+ class GCPPubSubAdapter {
53
+ provider = "gcp";
54
+ client;
55
+ subscriptions = new Map();
56
+ connected = false;
57
+ config;
58
+ constructor(config) {
59
+ this.config = {
60
+ projectId: config?.projectId || process.env.GOOGLE_CLOUD_PROJECT,
61
+ credentials: config?.credentials,
62
+ };
63
+ }
64
+ /**
65
+ * Connect to GCP Pub/Sub
66
+ */
67
+ async connect() {
68
+ if (this.connected)
69
+ return;
70
+ try {
71
+ // Dynamic import of @google-cloud/pubsub
72
+ const { PubSub } = await Promise.resolve().then(() => __importStar(require("@google-cloud/pubsub")));
73
+ this.client = new PubSub({
74
+ projectId: this.config.projectId,
75
+ credentials: this.config.credentials,
76
+ });
77
+ this.connected = true;
78
+ console.log(`[GCPPubSubAdapter] Connected to GCP Pub/Sub: ${this.config.projectId}`);
79
+ }
80
+ catch (error) {
81
+ throw new Error(`Failed to connect to GCP Pub/Sub: ${error.message}. ` +
82
+ `Make sure @google-cloud/pubsub is installed: npm install @google-cloud/pubsub`);
83
+ }
84
+ }
85
+ /**
86
+ * Disconnect from GCP Pub/Sub
87
+ */
88
+ async disconnect() {
89
+ if (!this.connected)
90
+ return;
91
+ try {
92
+ // Close all subscriptions
93
+ for (const [name, subscription] of this.subscriptions) {
94
+ await subscription.close();
95
+ }
96
+ this.subscriptions.clear();
97
+ await this.client.close();
98
+ this.connected = false;
99
+ console.log("[GCPPubSubAdapter] Disconnected from GCP Pub/Sub");
100
+ }
101
+ catch (error) {
102
+ console.error(`[GCPPubSubAdapter] Error disconnecting: ${error.message}`);
103
+ }
104
+ }
105
+ /**
106
+ * Subscribe to a GCP Pub/Sub topic
107
+ */
108
+ async subscribe(config, handler) {
109
+ if (!this.connected) {
110
+ throw new Error("Not connected to GCP Pub/Sub. Call connect() first.");
111
+ }
112
+ const subscriptionName = config.subscription;
113
+ // Get the subscription
114
+ const subscription = this.client.subscription(subscriptionName, {
115
+ flowControl: {
116
+ maxMessages: config.maxMessages || 10,
117
+ },
118
+ ackDeadline: config.ackDeadline || 30,
119
+ });
120
+ // Message handler
121
+ const messageHandler = async (gcpMessage) => {
122
+ // Parse message data
123
+ let body;
124
+ try {
125
+ const data = gcpMessage.data.toString();
126
+ body = JSON.parse(data);
127
+ }
128
+ catch {
129
+ body = gcpMessage.data.toString();
130
+ }
131
+ // Create pub/sub message
132
+ const pubsubMessage = {
133
+ id: gcpMessage.id || (0, uuid_1.v4)(),
134
+ body,
135
+ attributes: gcpMessage.attributes || {},
136
+ raw: gcpMessage,
137
+ topic: config.topic,
138
+ subscription: subscriptionName,
139
+ publishTime: gcpMessage.publishTime ? new Date(gcpMessage.publishTime) : new Date(),
140
+ ack: async () => {
141
+ gcpMessage.ack();
142
+ },
143
+ nack: async () => {
144
+ gcpMessage.nack();
145
+ },
146
+ };
147
+ // Process message
148
+ try {
149
+ await handler(pubsubMessage);
150
+ }
151
+ catch (error) {
152
+ console.error(`[GCPPubSubAdapter] Error processing message: ${error.message}`);
153
+ }
154
+ };
155
+ // Error handler
156
+ const errorHandler = (error) => {
157
+ console.error(`[GCPPubSubAdapter] Subscription error: ${error.message}`);
158
+ };
159
+ // Attach listeners
160
+ subscription.on("message", messageHandler);
161
+ subscription.on("error", errorHandler);
162
+ // Store subscription reference
163
+ this.subscriptions.set(subscriptionName, subscription);
164
+ console.log(`[GCPPubSubAdapter] Subscribed to: ${subscriptionName}`);
165
+ }
166
+ /**
167
+ * Unsubscribe from a GCP Pub/Sub subscription
168
+ */
169
+ async unsubscribe(subscriptionName) {
170
+ const subscription = this.subscriptions.get(subscriptionName);
171
+ if (subscription) {
172
+ await subscription.close();
173
+ this.subscriptions.delete(subscriptionName);
174
+ console.log(`[GCPPubSubAdapter] Unsubscribed from: ${subscriptionName}`);
175
+ }
176
+ }
177
+ /**
178
+ * Check if connected to GCP Pub/Sub
179
+ */
180
+ isConnected() {
181
+ return this.connected;
182
+ }
183
+ /**
184
+ * Health check - verify GCP Pub/Sub connectivity
185
+ */
186
+ async healthCheck() {
187
+ if (!this.connected)
188
+ return false;
189
+ try {
190
+ // List subscriptions as a health check
191
+ const [subscriptions] = await this.client.getSubscriptions({ pageSize: 1 });
192
+ return true;
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ }
198
+ }
199
+ exports.GCPPubSubAdapter = GCPPubSubAdapter;
200
+ exports.default = GCPPubSubAdapter;
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR0NQUHViU3ViQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9HQ1BQdWJTdWJBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHSCwrQkFBa0M7QUFjbEM7O0dBRUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNuQixRQUFRLEdBQUcsS0FBYyxDQUFDO0lBRTNCLE1BQU0sQ0FBTTtJQUNaLGFBQWEsR0FBcUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM1QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE1BQU0sQ0FBa0I7SUFFaEMsWUFBWSxNQUF3QjtRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ2IsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0I7WUFDaEUsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXO1NBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBRTNCLElBQUksQ0FBQztZQUNKLHlDQUF5QztZQUN6QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsd0RBQWEsc0JBQXNCLEdBQUMsQ0FBQztZQUV4RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDO2dCQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2dCQUNoQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2FBQ3BDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMs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QUVEOztPQUVHO0lBQ0gsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVsQyxJQUFJLENBQUM7WUFDSix1Q0FBdUM7WUFDdkMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQW5LRCw0Q0FtS0M7QUFFRCxrQkFBZSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR0NQUHViU3ViQWRhcHRlciAtIEdvb2dsZSBDbG91ZCBQdWIvU3ViIGFkYXB0ZXIgZm9yIFB1YlN1YlRyaWdnZXJcbiAqXG4gKiBVc2VzIEBnb29nbGUtY2xvdWQvcHVic3ViIGZvciBHQ1AgUHViL1N1YiBjb25uZWN0aXZpdHkuXG4gKiBSZXF1aXJlczogbnBtIGluc3RhbGwgQGdvb2dsZS1jbG91ZC9wdWJzdWJcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIEdPT0dMRV9DTE9VRF9QUk9KRUNUOiBHQ1AgcHJvamVjdCBJRFxuICogLSBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM6IFBhdGggdG8gc2VydmljZSBhY2NvdW50IGtleSBmaWxlIChvcHRpb25hbCBpZiB1c2luZyBkZWZhdWx0IGNyZWRlbnRpYWxzKVxuICogLSBQVUJTVUJfRU1VTEFUT1JfSE9TVDogUHViL1N1YiBlbXVsYXRvciBob3N0IGZvciBsb2NhbCBkZXZlbG9wbWVudCAob3B0aW9uYWwpXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQdWJTdWJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxvay9oZWxwZXJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuLyoqXG4gKiBHQ1AgUHViL1N1YiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR0NQUHViU3ViQ29uZmlnIHtcblx0cHJvamVjdElkPzogc3RyaW5nO1xuXHRjcmVkZW50aWFscz86IHtcblx0XHRjbGllbnRfZW1haWw6IHN0cmluZztcblx0XHRwcml2YXRlX2tleTogc3RyaW5nO1xuXHR9O1xufVxuXG4vKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgR0NQUHViU3ViQWRhcHRlciBpbXBsZW1lbnRzIFB1YlN1YkFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwiZ2NwXCIgYXMgY29uc3Q7XG5cblx0cHJpdmF0ZSBjbGllbnQ6IGFueTtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogR0NQUHViU3ViQ29uZmlnO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IEdDUFB1YlN1YkNvbmZpZykge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0cHJvamVjdElkOiBjb25maWc/LnByb2plY3RJZCB8fCBwcm9jZXNzLmVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCxcblx0XHRcdGNyZWRlbnRpYWxzOiBjb25maWc/LmNyZWRlbnRpYWxzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29ubmVjdCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBEeW5hbWljIGltcG9ydCBvZiBAZ29vZ2xlLWNsb3VkL3B1YnN1YlxuXHRcdFx0Y29uc3QgeyBQdWJTdWIgfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXG5cdFx0XHR0aGlzLmNsaWVudCA9IG5ldyBQdWJTdWIoe1xuXHRcdFx0XHRwcm9qZWN0SWQ6IHRoaXMuY29uZmlnLnByb2plY3RJZCxcblx0XHRcdFx0Y3JlZGVudGlhbHM6IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gQ29ubmVjdGVkIHRvIEdDUCBQdWIvU3ViOiAke3RoaXMuY29uZmlnLnByb2plY3RJZH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gR0NQIFB1Yi9TdWI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gYCArXG5cdFx0XHRcdFx0YE1ha2Ugc3VyZSBAZ29vZ2xlLWNsb3VkL3B1YnN1YiBpcyBpbnN0YWxsZWQ6IG5wbSBpbnN0YWxsIEBnb29nbGUtY2xvdWQvcHVic3ViYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc2Nvbm5lY3QgZnJvbSBHQ1AgUHViL1N1YlxuXHQgKi9cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gQ2xvc2UgYWxsIHN1YnNjcmlwdGlvbnNcblx0XHRcdGZvciAoY29uc3QgW25hbWUsIHN1YnNjcmlwdGlvbl0gb2YgdGhpcy5zdWJzY3JpcHRpb25zKSB7XG5cdFx0XHRcdGF3YWl0IHN1YnNjcmlwdGlvbi5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb25zLmNsZWFyKCk7XG5cblx0XHRcdGF3YWl0IHRoaXMuY2xpZW50LmNsb3NlKCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbR0NQUHViU3ViQWRhcHRlcl0gRGlzY29ubmVjdGVkIGZyb20gR0NQIFB1Yi9TdWJcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtHQ1BQdWJTdWJBZGFwdGVyXSBFcnJvciBkaXNjb25uZWN0aW5nOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3Vic2NyaWJlIHRvIGEgR0NQIFB1Yi9TdWIgdG9waWNcblx0ICovXG5cdGFzeW5jIHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQgdG8gR0NQIFB1Yi9TdWIuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBzdWJzY3JpcHRpb25OYW1lID0gY29uZmlnLnN1YnNjcmlwdGlvbjtcblxuXHRcdC8vIEdldCB0aGUgc3Vic2NyaXB0aW9uXG5cdFx0Y29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5jbGllbnQuc3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbk5hbWUsIHtcblx0XHRcdGZsb3dDb250cm9sOiB7XG5cdFx0XHRcdG1heE1lc3NhZ2VzOiBjb25maWcubWF4TWVzc2FnZXMgfHwgMTAsXG5cdFx0XHR9LFxuXHRcdFx0YWNrRGVhZGxpbmU6IGNvbmZpZy5hY2tEZWFkbGluZSB8fCAzMCxcblx0XHR9KTtcblxuXHRcdC8vIE1lc3NhZ2UgaGFuZGxlclxuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gYXN5bmMgKGdjcE1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0Ly8gUGFyc2UgbWVzc2FnZSBkYXRhXG5cdFx0XHRsZXQgYm9keTogdW5rbm93bjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBnY3BNZXNzYWdlLmRhdGEudG9TdHJpbmcoKTtcblx0XHRcdFx0Ym9keSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ym9keSA9IGdjcE1lc3NhZ2UuZGF0YS50b1N0cmluZygpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDcmVhdGUgcHViL3N1YiBtZXNzYWdlXG5cdFx0XHRjb25zdCBwdWJzdWJNZXNzYWdlOiBQdWJTdWJNZXNzYWdlID0ge1xuXHRcdFx0XHRpZDogZ2NwTWVzc2FnZS5pZCB8fCB1dWlkKCksXG5cdFx0XHRcdGJvZHksXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IGdjcE1lc3NhZ2UuYXR0cmlidXRlcyB8fCB7fSxcblx0XHRcdFx0cmF3OiBnY3BNZXNzYWdlLFxuXHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbk5hbWUsXG5cdFx0XHRcdHB1Ymxpc2hUaW1lOiBnY3BNZXNzYWdlLnB1Ymxpc2hUaW1lID8gbmV3IERhdGUoZ2NwTWVzc2FnZS5wdWJsaXNoVGltZSkgOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRnY3BNZXNzYWdlLmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0Z2NwTWVzc2FnZS5uYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBQcm9jZXNzIG1lc3NhZ2Vcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGhhbmRsZXIocHVic3ViTWVzc2FnZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbR0NQUHViU3ViQWRhcHRlcl0gRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gRXJyb3IgaGFuZGxlclxuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IChlcnJvcjogRXJyb3IpID0+IHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtHQ1BQdWJTdWJBZGFwdGVyXSBTdWJzY3JpcHRpb24gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcblx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGxpc3RlbmVyc1xuXHRcdHN1YnNjcmlwdGlvbi5vbihcIm1lc3NhZ2VcIiwgbWVzc2FnZUhhbmRsZXIpO1xuXHRcdHN1YnNjcmlwdGlvbi5vbihcImVycm9yXCIsIGVycm9ySGFuZGxlcik7XG5cblx0XHQvLyBTdG9yZSBzdWJzY3JpcHRpb24gcmVmZXJlbmNlXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25OYW1lLCBzdWJzY3JpcHRpb24pO1xuXG5cdFx0Y29uc29sZS5sb2coYFtHQ1BQdWJTdWJBZGFwdGVyXSBTdWJzY3JpYmVkIHRvOiAke3N1YnNjcmlwdGlvbk5hbWV9YCk7XG5cdH1cblxuXHQvKipcblx0ICogVW5zdWJzY3JpYmUgZnJvbSBhIEdDUCBQdWIvU3ViIHN1YnNjcmlwdGlvblxuXHQgKi9cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25OYW1lKTtcblx0XHRpZiAoc3Vic2NyaXB0aW9uKSB7XG5cdFx0XHRhd2FpdCBzdWJzY3JpcHRpb24uY2xvc2UoKTtcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uTmFtZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0dDUFB1YlN1YkFkYXB0ZXJdIFVuc3Vic2NyaWJlZCBmcm9tOiAke3N1YnNjcmlwdGlvbk5hbWV9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlYWx0aCBjaGVjayAtIHZlcmlmeSBHQ1AgUHViL1N1YiBjb25uZWN0aXZpdHlcblx0ICovXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybiBmYWxzZTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBMaXN0IHN1YnNjcmlwdGlvbnMgYXMgYSBoZWFsdGggY2hlY2tcblx0XHRcdGNvbnN0IFtzdWJzY3JpcHRpb25zXSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFN1YnNjcmlwdGlvbnMoeyBwYWdlU2l6ZTogMSB9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBHQ1BQdWJTdWJBZGFwdGVyO1xuIl19
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @blok/trigger-pubsub
3
+ *
4
+ * Pub/Sub-based trigger for Blok workflows.
5
+ * Supports multiple pub/sub providers:
6
+ * - Google Cloud Pub/Sub
7
+ * - AWS SNS/SQS
8
+ * - Azure Service Bus
9
+ *
10
+ * @example GCP Pub/Sub
11
+ * ```typescript
12
+ * import { PubSubTrigger, GCPPubSubAdapter } from "@blok/trigger-pubsub";
13
+ *
14
+ * class MyPubSubTrigger extends PubSubTrigger {
15
+ * protected adapter = new GCPPubSubAdapter({
16
+ * projectId: "my-project",
17
+ * });
18
+ *
19
+ * protected nodes = myNodes;
20
+ * protected workflows = myWorkflows;
21
+ * }
22
+ *
23
+ * const trigger = new MyPubSubTrigger();
24
+ * await trigger.listen();
25
+ * ```
26
+ *
27
+ * @example AWS SNS/SQS
28
+ * ```typescript
29
+ * import { PubSubTrigger, AWSSNSAdapter } from "@blok/trigger-pubsub";
30
+ *
31
+ * class MyPubSubTrigger extends PubSubTrigger {
32
+ * protected adapter = new AWSSNSAdapter({
33
+ * region: "us-east-1",
34
+ * });
35
+ * // ...
36
+ * }
37
+ * ```
38
+ *
39
+ * @example Azure Service Bus
40
+ * ```typescript
41
+ * import { PubSubTrigger, AzureServiceBusAdapter } from "@blok/trigger-pubsub";
42
+ *
43
+ * class MyPubSubTrigger extends PubSubTrigger {
44
+ * protected adapter = new AzureServiceBusAdapter({
45
+ * connectionString: process.env.AZURE_SERVICE_BUS_CONNECTION_STRING,
46
+ * });
47
+ * // ...
48
+ * }
49
+ * ```
50
+ */
51
+ export { PubSubTrigger, type PubSubAdapter, type PubSubMessage, } from "./PubSubTrigger";
52
+ export { GCPPubSubAdapter, type GCPPubSubConfig } from "./adapters/GCPPubSubAdapter";
53
+ export { AWSSNSAdapter, type AWSSNSConfig } from "./adapters/AWSSNSAdapter";
54
+ export { AzureServiceBusAdapter, type AzureServiceBusConfig } from "./adapters/AzureServiceBusAdapter";
55
+ export type { PubSubProvider, PubSubTriggerOpts, } from "@blok/helper";
package/dist/index.js ADDED
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /**
3
+ * @blok/trigger-pubsub
4
+ *
5
+ * Pub/Sub-based trigger for Blok workflows.
6
+ * Supports multiple pub/sub providers:
7
+ * - Google Cloud Pub/Sub
8
+ * - AWS SNS/SQS
9
+ * - Azure Service Bus
10
+ *
11
+ * @example GCP Pub/Sub
12
+ * ```typescript
13
+ * import { PubSubTrigger, GCPPubSubAdapter } from "@blok/trigger-pubsub";
14
+ *
15
+ * class MyPubSubTrigger extends PubSubTrigger {
16
+ * protected adapter = new GCPPubSubAdapter({
17
+ * projectId: "my-project",
18
+ * });
19
+ *
20
+ * protected nodes = myNodes;
21
+ * protected workflows = myWorkflows;
22
+ * }
23
+ *
24
+ * const trigger = new MyPubSubTrigger();
25
+ * await trigger.listen();
26
+ * ```
27
+ *
28
+ * @example AWS SNS/SQS
29
+ * ```typescript
30
+ * import { PubSubTrigger, AWSSNSAdapter } from "@blok/trigger-pubsub";
31
+ *
32
+ * class MyPubSubTrigger extends PubSubTrigger {
33
+ * protected adapter = new AWSSNSAdapter({
34
+ * region: "us-east-1",
35
+ * });
36
+ * // ...
37
+ * }
38
+ * ```
39
+ *
40
+ * @example Azure Service Bus
41
+ * ```typescript
42
+ * import { PubSubTrigger, AzureServiceBusAdapter } from "@blok/trigger-pubsub";
43
+ *
44
+ * class MyPubSubTrigger extends PubSubTrigger {
45
+ * protected adapter = new AzureServiceBusAdapter({
46
+ * connectionString: process.env.AZURE_SERVICE_BUS_CONNECTION_STRING,
47
+ * });
48
+ * // ...
49
+ * }
50
+ * ```
51
+ */
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.AzureServiceBusAdapter = exports.AWSSNSAdapter = exports.GCPPubSubAdapter = exports.PubSubTrigger = void 0;
54
+ // Core exports
55
+ var PubSubTrigger_1 = require("./PubSubTrigger");
56
+ Object.defineProperty(exports, "PubSubTrigger", { enumerable: true, get: function () { return PubSubTrigger_1.PubSubTrigger; } });
57
+ // Adapters
58
+ var GCPPubSubAdapter_1 = require("./adapters/GCPPubSubAdapter");
59
+ Object.defineProperty(exports, "GCPPubSubAdapter", { enumerable: true, get: function () { return GCPPubSubAdapter_1.GCPPubSubAdapter; } });
60
+ var AWSSNSAdapter_1 = require("./adapters/AWSSNSAdapter");
61
+ Object.defineProperty(exports, "AWSSNSAdapter", { enumerable: true, get: function () { return AWSSNSAdapter_1.AWSSNSAdapter; } });
62
+ var AzureServiceBusAdapter_1 = require("./adapters/AzureServiceBusAdapter");
63
+ Object.defineProperty(exports, "AzureServiceBusAdapter", { enumerable: true, get: function () { return AzureServiceBusAdapter_1.AzureServiceBusAdapter; } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHOzs7QUFFSCxlQUFlO0FBQ2YsaURBSXlCO0FBSHhCLDhHQUFBLGFBQWEsT0FBQTtBQUtkLFdBQVc7QUFDWCxnRUFBcUY7QUFBNUUsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsMERBQTRFO0FBQW5FLDhHQUFBLGFBQWEsT0FBQTtBQUN0Qiw0RUFBdUc7QUFBOUYsZ0lBQUEsc0JBQXNCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBibG9rL3RyaWdnZXItcHVic3ViXG4gKlxuICogUHViL1N1Yi1iYXNlZCB0cmlnZ2VyIGZvciBCbG9rIHdvcmtmbG93cy5cbiAqIFN1cHBvcnRzIG11bHRpcGxlIHB1Yi9zdWIgcHJvdmlkZXJzOlxuICogLSBHb29nbGUgQ2xvdWQgUHViL1N1YlxuICogLSBBV1MgU05TL1NRU1xuICogLSBBenVyZSBTZXJ2aWNlIEJ1c1xuICpcbiAqIEBleGFtcGxlIEdDUCBQdWIvU3ViXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBQdWJTdWJUcmlnZ2VyLCBHQ1BQdWJTdWJBZGFwdGVyIH0gZnJvbSBcIkBibG9rL3RyaWdnZXItcHVic3ViXCI7XG4gKlxuICogY2xhc3MgTXlQdWJTdWJUcmlnZ2VyIGV4dGVuZHMgUHViU3ViVHJpZ2dlciB7XG4gKiAgIHByb3RlY3RlZCBhZGFwdGVyID0gbmV3IEdDUFB1YlN1YkFkYXB0ZXIoe1xuICogICAgIHByb2plY3RJZDogXCJteS1wcm9qZWN0XCIsXG4gKiAgIH0pO1xuICpcbiAqICAgcHJvdGVjdGVkIG5vZGVzID0gbXlOb2RlcztcbiAqICAgcHJvdGVjdGVkIHdvcmtmbG93cyA9IG15V29ya2Zsb3dzO1xuICogfVxuICpcbiAqIGNvbnN0IHRyaWdnZXIgPSBuZXcgTXlQdWJTdWJUcmlnZ2VyKCk7XG4gKiBhd2FpdCB0cmlnZ2VyLmxpc3RlbigpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQVdTIFNOUy9TUVNcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFB1YlN1YlRyaWdnZXIsIEFXU1NOU0FkYXB0ZXIgfSBmcm9tIFwiQGJsb2svdHJpZ2dlci1wdWJzdWJcIjtcbiAqXG4gKiBjbGFzcyBNeVB1YlN1YlRyaWdnZXIgZXh0ZW5kcyBQdWJTdWJUcmlnZ2VyIHtcbiAqICAgcHJvdGVjdGVkIGFkYXB0ZXIgPSBuZXcgQVdTU05TQWRhcHRlcih7XG4gKiAgICAgcmVnaW9uOiBcInVzLWVhc3QtMVwiLFxuICogICB9KTtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBBenVyZSBTZXJ2aWNlIEJ1c1xuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgUHViU3ViVHJpZ2dlciwgQXp1cmVTZXJ2aWNlQnVzQWRhcHRlciB9IGZyb20gXCJAYmxvay90cmlnZ2VyLXB1YnN1YlwiO1xuICpcbiAqIGNsYXNzIE15UHViU3ViVHJpZ2dlciBleHRlbmRzIFB1YlN1YlRyaWdnZXIge1xuICogICBwcm90ZWN0ZWQgYWRhcHRlciA9IG5ldyBBenVyZVNlcnZpY2VCdXNBZGFwdGVyKHtcbiAqICAgICBjb25uZWN0aW9uU3RyaW5nOiBwcm9jZXNzLmVudi5BWlVSRV9TRVJWSUNFX0JVU19DT05ORUNUSU9OX1NUUklORyxcbiAqICAgfSk7XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKi9cblxuLy8gQ29yZSBleHBvcnRzXG5leHBvcnQge1xuXHRQdWJTdWJUcmlnZ2VyLFxuXHR0eXBlIFB1YlN1YkFkYXB0ZXIsXG5cdHR5cGUgUHViU3ViTWVzc2FnZSxcbn0gZnJvbSBcIi4vUHViU3ViVHJpZ2dlclwiO1xuXG4vLyBBZGFwdGVyc1xuZXhwb3J0IHsgR0NQUHViU3ViQWRhcHRlciwgdHlwZSBHQ1BQdWJTdWJDb25maWcgfSBmcm9tIFwiLi9hZGFwdGVycy9HQ1BQdWJTdWJBZGFwdGVyXCI7XG5leHBvcnQgeyBBV1NTTlNBZGFwdGVyLCB0eXBlIEFXU1NOU0NvbmZpZyB9IGZyb20gXCIuL2FkYXB0ZXJzL0FXU1NOU0FkYXB0ZXJcIjtcbmV4cG9ydCB7IEF6dXJlU2VydmljZUJ1c0FkYXB0ZXIsIHR5cGUgQXp1cmVTZXJ2aWNlQnVzQ29uZmlnIH0gZnJvbSBcIi4vYWRhcHRlcnMvQXp1cmVTZXJ2aWNlQnVzQWRhcHRlclwiO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZnJvbSBoZWxwZXIgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7XG5cdFB1YlN1YlByb3ZpZGVyLFxuXHRQdWJTdWJUcmlnZ2VyT3B0cyxcbn0gZnJvbSBcIkBibG9rL2hlbHBlclwiO1xuIl19
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@blokjs/trigger-pubsub",
3
+ "version": "0.2.0",
4
+ "description": "Pub/Sub-based trigger for Blok workflows - supports GCP Pub/Sub, AWS SNS/SQS, and Azure Service Bus",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "rm -rf dist && bun run tsc",
10
+ "build:dev": "tsc --watch",
11
+ "test": "vitest run",
12
+ "test:dev": "vitest"
13
+ },
14
+ "author": "Deskree Technologies Inc.",
15
+ "license": "Apache-2.0",
16
+ "dependencies": {
17
+ "@blokjs/helper": "workspace:*",
18
+ "@blokjs/runner": "workspace:*",
19
+ "@blokjs/shared": "workspace:*",
20
+ "@opentelemetry/api": "^1.9.0",
21
+ "uuid": "^11.1.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.15.21",
25
+ "@types/uuid": "^11.0.0",
26
+ "typescript": "^5.8.3",
27
+ "vitest": "^4.0.18"
28
+ },
29
+ "peerDependencies": {
30
+ "@google-cloud/pubsub": "^4.0.0",
31
+ "@aws-sdk/client-sns": "^3.980.0",
32
+ "@aws-sdk/client-sqs": "^3.980.0",
33
+ "@azure/service-bus": "^7.9.5"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "@google-cloud/pubsub": {
37
+ "optional": true
38
+ },
39
+ "@aws-sdk/client-sns": {
40
+ "optional": true
41
+ },
42
+ "@aws-sdk/client-sqs": {
43
+ "optional": true
44
+ },
45
+ "@azure/service-bus": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "private": false,
50
+ "publishConfig": {
51
+ "access": "public"
52
+ }
53
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * PubSubTrigger Tests
3
+ *
4
+ * Tests the PubSubTrigger base class and adapter interfaces.
5
+ */
6
+
7
+ import { describe, expect, it, vi } from "vitest";
8
+
9
+ describe("PubSubTrigger", () => {
10
+ describe("PubSubMessage Interface", () => {
11
+ it("should accept valid pub/sub message structure", () => {
12
+ const message = {
13
+ id: "msg-123",
14
+ body: { event: "order.created", data: { orderId: 456 } },
15
+ attributes: { "content-type": "application/json", source: "orders-service" },
16
+ raw: {},
17
+ topic: "orders",
18
+ subscription: "orders-subscription",
19
+ publishTime: new Date(),
20
+ ack: async () => {},
21
+ nack: async () => {},
22
+ };
23
+
24
+ expect(message.id).toBe("msg-123");
25
+ expect(message.body).toEqual({ event: "order.created", data: { orderId: 456 } });
26
+ expect(message.topic).toBe("orders");
27
+ expect(message.subscription).toBe("orders-subscription");
28
+ });
29
+
30
+ it("should handle minimal required fields", () => {
31
+ const message = {
32
+ id: "msg-id",
33
+ body: null,
34
+ attributes: {},
35
+ raw: null,
36
+ topic: "test-topic",
37
+ ack: async () => {},
38
+ nack: async () => {},
39
+ };
40
+
41
+ expect(message.id).toBeDefined();
42
+ expect(message.topic).toBeDefined();
43
+ expect(message.ack).toBeDefined();
44
+ expect(message.nack).toBeDefined();
45
+ });
46
+ });
47
+
48
+ describe("PubSubAdapter Interface", () => {
49
+ it("should validate adapter interface methods", () => {
50
+ const mockAdapter = {
51
+ provider: "gcp" as const,
52
+ connect: vi.fn().mockResolvedValue(undefined),
53
+ disconnect: vi.fn().mockResolvedValue(undefined),
54
+ subscribe: vi.fn().mockResolvedValue(undefined),
55
+ unsubscribe: vi.fn().mockResolvedValue(undefined),
56
+ isConnected: vi.fn().mockReturnValue(true),
57
+ healthCheck: vi.fn().mockResolvedValue(true),
58
+ };
59
+
60
+ expect(mockAdapter.provider).toBe("gcp");
61
+ expect(typeof mockAdapter.connect).toBe("function");
62
+ expect(typeof mockAdapter.disconnect).toBe("function");
63
+ expect(typeof mockAdapter.subscribe).toBe("function");
64
+ expect(typeof mockAdapter.unsubscribe).toBe("function");
65
+ expect(typeof mockAdapter.isConnected).toBe("function");
66
+ expect(typeof mockAdapter.healthCheck).toBe("function");
67
+ });
68
+ });
69
+ });
70
+
71
+ describe("GCPPubSubAdapter", () => {
72
+ it("should create adapter with config from environment", () => {
73
+ const originalProject = process.env.GOOGLE_CLOUD_PROJECT;
74
+ process.env.GOOGLE_CLOUD_PROJECT = "test-project";
75
+
76
+ const config = {
77
+ projectId: process.env.GOOGLE_CLOUD_PROJECT,
78
+ };
79
+
80
+ expect(config.projectId).toBe("test-project");
81
+
82
+ process.env.GOOGLE_CLOUD_PROJECT = originalProject;
83
+ });
84
+ });
85
+
86
+ describe("AWSSNSAdapter", () => {
87
+ it("should create adapter with config from environment", () => {
88
+ const originalRegion = process.env.AWS_REGION;
89
+ const originalWaitTime = process.env.SQS_WAIT_TIME_SECONDS;
90
+
91
+ process.env.AWS_REGION = "eu-central-1";
92
+ process.env.SQS_WAIT_TIME_SECONDS = "15";
93
+
94
+ const config = {
95
+ region: process.env.AWS_REGION || "us-east-1",
96
+ waitTimeSeconds: Number.parseInt(process.env.SQS_WAIT_TIME_SECONDS || "20", 10),
97
+ };
98
+
99
+ expect(config.region).toBe("eu-central-1");
100
+ expect(config.waitTimeSeconds).toBe(15);
101
+
102
+ process.env.AWS_REGION = originalRegion;
103
+ process.env.SQS_WAIT_TIME_SECONDS = originalWaitTime;
104
+ });
105
+ });
106
+
107
+ describe("AzureServiceBusAdapter", () => {
108
+ it("should create adapter with config from environment", () => {
109
+ const originalConnStr = process.env.AZURE_SERVICE_BUS_CONNECTION_STRING;
110
+ const testConnStr = "Endpoint=sb://test.servicebus.windows.net/;SharedAccessKeyName=test;SharedAccessKey=abc";
111
+ process.env.AZURE_SERVICE_BUS_CONNECTION_STRING = testConnStr;
112
+
113
+ const config = {
114
+ connectionString: process.env.AZURE_SERVICE_BUS_CONNECTION_STRING,
115
+ };
116
+
117
+ expect(config.connectionString).toBe(testConnStr);
118
+
119
+ process.env.AZURE_SERVICE_BUS_CONNECTION_STRING = originalConnStr;
120
+ });
121
+ });
122
+
123
+ describe("PubSubTriggerOpts Schema", () => {
124
+ it("should validate pub/sub trigger configuration", () => {
125
+ const validConfig = {
126
+ provider: "gcp" as const,
127
+ topic: "my-topic",
128
+ subscription: "my-subscription",
129
+ ack: true,
130
+ maxMessages: 10,
131
+ ackDeadline: 30,
132
+ };
133
+
134
+ expect(validConfig.provider).toBe("gcp");
135
+ expect(validConfig.topic).toBe("my-topic");
136
+ expect(validConfig.subscription).toBe("my-subscription");
137
+ });
138
+
139
+ it("should support all provider types", () => {
140
+ const providers = ["gcp", "aws", "azure"];
141
+
142
+ for (const provider of providers) {
143
+ const config = {
144
+ provider: provider as any,
145
+ topic: "test-topic",
146
+ subscription: "test-sub",
147
+ };
148
+ expect(config.provider).toBe(provider);
149
+ }
150
+ });
151
+ });