@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.
- package/CHANGELOG.md +22 -0
- package/dist/PubSubTrigger.d.ts +116 -0
- package/dist/PubSubTrigger.js +219 -0
- package/dist/adapters/AWSSNSAdapter.d.ts +67 -0
- package/dist/adapters/AWSSNSAdapter.js +257 -0
- package/dist/adapters/AzureServiceBusAdapter.d.ts +55 -0
- package/dist/adapters/AzureServiceBusAdapter.js +229 -0
- package/dist/adapters/GCPPubSubAdapter.d.ts +59 -0
- package/dist/adapters/GCPPubSubAdapter.js +201 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.js +64 -0
- package/package.json +53 -0
- package/src/PubSubTrigger.test.ts +151 -0
- package/src/PubSubTrigger.ts +337 -0
- package/src/adapters/AWSSNSAdapter.ts +258 -0
- package/src/adapters/AzureServiceBusAdapter.ts +220 -0
- package/src/adapters/GCPPubSubAdapter.ts +196 -0
- package/src/index.ts +68 -0
- package/template/.env.example +8 -0
- package/template/package.json +44 -0
- package/template/src/Nodes.ts +10 -0
- package/template/src/Workflows.ts +8 -0
- package/template/src/index.ts +41 -0
- package/template/src/runner/PubSubServer.ts +39 -0
- package/template/src/runner/types/Workflows.ts +7 -0
- package/template/src/workflows/messages/on-message.ts +44 -0
- package/template/tsconfig.json +31 -0
- package/template/vitest.config.ts +39 -0
- package/tsconfig.json +32 -0
|
@@ -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
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
});
|