@goatlab/tasks-adapter-gcp 0.3.5 → 0.4.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/dist/CloudTaskConnector.d.ts +116 -7
- package/dist/CloudTaskConnector.js +146 -7
- package/dist/CloudTaskConnector.js.map +1 -1
- package/dist/cloudtask.spec.js +60 -1
- package/dist/cloudtask.spec.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -1,20 +1,129 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Primitive } from '@goatlab/js-utils';
|
|
3
|
-
import type { TaskConnector, TaskStatus } from '@goatlab/tasks-core';
|
|
3
|
+
import type { TaskConnector, TaskStatus, TenantCredentials } from '@goatlab/tasks-core';
|
|
4
4
|
import type { BackoffSettings } from 'google-gax/build/src/gax';
|
|
5
|
+
import { GCPServiceAccount } from './CloudTaskConnector.types.js';
|
|
5
6
|
export type ITask = any;
|
|
6
7
|
export type { BackoffSettings };
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for CloudTaskConnector
|
|
10
|
+
*/
|
|
11
|
+
export interface CloudTaskConnectorConfig {
|
|
12
|
+
/**
|
|
13
|
+
* GCP service account credentials for authentication.
|
|
14
|
+
*/
|
|
15
|
+
gcpServiceAccount?: GCPServiceAccount;
|
|
16
|
+
/**
|
|
17
|
+
* GCP region/location for Cloud Tasks queues.
|
|
18
|
+
* Default: 'europe-west1'
|
|
19
|
+
*/
|
|
20
|
+
location?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Encryption key for task body encryption.
|
|
23
|
+
*/
|
|
24
|
+
encryptionKey?: string;
|
|
25
|
+
/**
|
|
26
|
+
* GCP project ID.
|
|
27
|
+
*/
|
|
28
|
+
gcpProject: string;
|
|
29
|
+
/**
|
|
30
|
+
* Tenant ID for multi-tenant isolation.
|
|
31
|
+
* When set, this tenant ID is used as a prefix for task names.
|
|
32
|
+
*
|
|
33
|
+
* Task naming pattern: {tenantId}-{taskName}
|
|
34
|
+
* Example: "acme-corp-my-task" instead of "my-task"
|
|
35
|
+
*
|
|
36
|
+
* This ensures each tenant's tasks are uniquely identified,
|
|
37
|
+
* providing isolation at the task level while sharing the same queue.
|
|
38
|
+
*/
|
|
39
|
+
tenantId?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Enable in-memory payload caching for testing.
|
|
42
|
+
* GCP Cloud Tasks removes completed tasks immediately, which means
|
|
43
|
+
* getStatus() cannot retrieve the payload after completion.
|
|
44
|
+
*
|
|
45
|
+
* When enabled, payloads are cached in memory when queueing
|
|
46
|
+
* and returned from getStatus() even after the task is removed.
|
|
47
|
+
*
|
|
48
|
+
* WARNING: Only enable for testing. In production, this will cause
|
|
49
|
+
* memory leaks as payloads accumulate.
|
|
50
|
+
*
|
|
51
|
+
* Default: false
|
|
52
|
+
*/
|
|
53
|
+
enablePayloadCache?: boolean;
|
|
54
|
+
}
|
|
7
55
|
export declare class CloudTaskConnector implements TaskConnector<object> {
|
|
8
56
|
private gcpServiceAccount;
|
|
9
57
|
private location;
|
|
10
58
|
private encryptionKey;
|
|
11
59
|
private gcpProject;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
60
|
+
private readonly _tenantId?;
|
|
61
|
+
private readonly config;
|
|
62
|
+
private readonly enablePayloadCache;
|
|
63
|
+
/**
|
|
64
|
+
* Cache for task payloads (only used when enablePayloadCache is true).
|
|
65
|
+
* GCP Cloud Tasks removes completed tasks immediately, so we cache the payload
|
|
66
|
+
* to return it when getStatus is called after completion.
|
|
67
|
+
* Key: task name (full path), Value: { payload, createdAt }
|
|
68
|
+
*/
|
|
69
|
+
private static payloadCache;
|
|
70
|
+
/**
|
|
71
|
+
* How long to keep payloads in cache (1 hour)
|
|
72
|
+
*/
|
|
73
|
+
private static readonly CACHE_TTL_MS;
|
|
74
|
+
/**
|
|
75
|
+
* The tenant ID this connector is scoped to.
|
|
76
|
+
* When set, task names are prefixed with this tenant ID.
|
|
77
|
+
*/
|
|
78
|
+
get tenantId(): string | undefined;
|
|
79
|
+
constructor(config: CloudTaskConnectorConfig);
|
|
80
|
+
/**
|
|
81
|
+
* Cleans up expired entries from the payload cache.
|
|
82
|
+
*/
|
|
83
|
+
private cleanupCache;
|
|
84
|
+
/**
|
|
85
|
+
* Caches a task's payload for later retrieval.
|
|
86
|
+
* Only caches if enablePayloadCache is true.
|
|
87
|
+
*/
|
|
88
|
+
private cachePayload;
|
|
89
|
+
/**
|
|
90
|
+
* Gets a cached payload if available.
|
|
91
|
+
* Only returns cached data if enablePayloadCache is true.
|
|
92
|
+
*/
|
|
93
|
+
private getCachedPayload;
|
|
94
|
+
/**
|
|
95
|
+
* Creates a new CloudTaskConnector instance scoped to a specific tenant.
|
|
96
|
+
* Uses tenant ID as a prefix for queue names for isolation.
|
|
97
|
+
*
|
|
98
|
+
* @param tenantId - The tenant identifier for isolation (used as queue name prefix)
|
|
99
|
+
* @param credentials - Optional GCP credentials for the tenant (uses parent's if not provided)
|
|
100
|
+
* @returns A new CloudTaskConnector instance scoped to the tenant
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const baseConnector = new CloudTaskConnector({ gcpProject: 'my-project' })
|
|
105
|
+
*
|
|
106
|
+
* // Create tenant-scoped connector
|
|
107
|
+
* const tenantConnector = baseConnector.forTenant('acme-corp')
|
|
108
|
+
* // Queue names: acme-corp-default, acme-corp-email-queue, etc.
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
forTenant(tenantId: string, _credentials?: TenantCredentials): CloudTaskConnector;
|
|
112
|
+
/**
|
|
113
|
+
* Sanitizes a string for use in GCP Cloud Tasks names.
|
|
114
|
+
* GCP names only allow letters, numbers, and hyphens.
|
|
115
|
+
* @param value - The value to sanitize
|
|
116
|
+
* @returns Sanitized value safe for GCP names
|
|
117
|
+
*/
|
|
118
|
+
private sanitizeForGcp;
|
|
119
|
+
/**
|
|
120
|
+
* Gets the task name with tenant prefix applied if tenant is set.
|
|
121
|
+
* Task-level isolation: all tenants share the same queue, but task names are prefixed.
|
|
122
|
+
* This avoids the overhead of creating separate queues per tenant.
|
|
123
|
+
* @param taskName - The base task name
|
|
124
|
+
* @returns The full task name with tenant prefix if applicable
|
|
125
|
+
*/
|
|
126
|
+
private getTaskName;
|
|
18
127
|
private getCloudTasksClient;
|
|
19
128
|
/**
|
|
20
129
|
* Adds a task to the Cloud Tasks queue.
|
|
@@ -28,11 +28,138 @@ class CloudTaskConnector {
|
|
|
28
28
|
location;
|
|
29
29
|
encryptionKey;
|
|
30
30
|
gcpProject;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
_tenantId;
|
|
32
|
+
config;
|
|
33
|
+
enablePayloadCache;
|
|
34
|
+
/**
|
|
35
|
+
* Cache for task payloads (only used when enablePayloadCache is true).
|
|
36
|
+
* GCP Cloud Tasks removes completed tasks immediately, so we cache the payload
|
|
37
|
+
* to return it when getStatus is called after completion.
|
|
38
|
+
* Key: task name (full path), Value: { payload, createdAt }
|
|
39
|
+
*/
|
|
40
|
+
static payloadCache = new Map();
|
|
41
|
+
/**
|
|
42
|
+
* How long to keep payloads in cache (1 hour)
|
|
43
|
+
*/
|
|
44
|
+
static CACHE_TTL_MS = 60 * 60 * 1000;
|
|
45
|
+
/**
|
|
46
|
+
* The tenant ID this connector is scoped to.
|
|
47
|
+
* When set, task names are prefixed with this tenant ID.
|
|
48
|
+
*/
|
|
49
|
+
get tenantId() {
|
|
50
|
+
return this._tenantId;
|
|
51
|
+
}
|
|
52
|
+
constructor(config) {
|
|
53
|
+
this.config = config;
|
|
54
|
+
this.gcpServiceAccount = (config.gcpServiceAccount ||
|
|
55
|
+
'');
|
|
56
|
+
this.location = config.location || 'europe-west1';
|
|
57
|
+
this.encryptionKey = config.encryptionKey || '';
|
|
58
|
+
this.gcpProject = config.gcpProject || '';
|
|
59
|
+
this._tenantId = config.tenantId;
|
|
60
|
+
this.enablePayloadCache = config.enablePayloadCache ?? false;
|
|
61
|
+
// Periodically clean up old cache entries (only if caching is enabled)
|
|
62
|
+
if (this.enablePayloadCache) {
|
|
63
|
+
this.cleanupCache();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Cleans up expired entries from the payload cache.
|
|
68
|
+
*/
|
|
69
|
+
cleanupCache() {
|
|
70
|
+
if (!this.enablePayloadCache) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
for (const [key, value] of CloudTaskConnector.payloadCache) {
|
|
75
|
+
if (now - value.createdAt > CloudTaskConnector.CACHE_TTL_MS) {
|
|
76
|
+
CloudTaskConnector.payloadCache.delete(key);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Caches a task's payload for later retrieval.
|
|
82
|
+
* Only caches if enablePayloadCache is true.
|
|
83
|
+
*/
|
|
84
|
+
cachePayload(taskName, payload) {
|
|
85
|
+
if (!this.enablePayloadCache) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
CloudTaskConnector.payloadCache.set(taskName, {
|
|
89
|
+
payload,
|
|
90
|
+
createdAt: Date.now()
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Gets a cached payload if available.
|
|
95
|
+
* Only returns cached data if enablePayloadCache is true.
|
|
96
|
+
*/
|
|
97
|
+
getCachedPayload(taskName) {
|
|
98
|
+
if (!this.enablePayloadCache) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
const cached = CloudTaskConnector.payloadCache.get(taskName);
|
|
102
|
+
if (cached) {
|
|
103
|
+
// Check if expired
|
|
104
|
+
if (Date.now() - cached.createdAt > CloudTaskConnector.CACHE_TTL_MS) {
|
|
105
|
+
CloudTaskConnector.payloadCache.delete(taskName);
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
return cached.payload;
|
|
109
|
+
}
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Creates a new CloudTaskConnector instance scoped to a specific tenant.
|
|
114
|
+
* Uses tenant ID as a prefix for queue names for isolation.
|
|
115
|
+
*
|
|
116
|
+
* @param tenantId - The tenant identifier for isolation (used as queue name prefix)
|
|
117
|
+
* @param credentials - Optional GCP credentials for the tenant (uses parent's if not provided)
|
|
118
|
+
* @returns A new CloudTaskConnector instance scoped to the tenant
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const baseConnector = new CloudTaskConnector({ gcpProject: 'my-project' })
|
|
123
|
+
*
|
|
124
|
+
* // Create tenant-scoped connector
|
|
125
|
+
* const tenantConnector = baseConnector.forTenant('acme-corp')
|
|
126
|
+
* // Queue names: acme-corp-default, acme-corp-email-queue, etc.
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
forTenant(tenantId, _credentials) {
|
|
130
|
+
return new CloudTaskConnector({
|
|
131
|
+
...this.config,
|
|
132
|
+
tenantId
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Sanitizes a string for use in GCP Cloud Tasks names.
|
|
137
|
+
* GCP names only allow letters, numbers, and hyphens.
|
|
138
|
+
* @param value - The value to sanitize
|
|
139
|
+
* @returns Sanitized value safe for GCP names
|
|
140
|
+
*/
|
|
141
|
+
sanitizeForGcp(value) {
|
|
142
|
+
// Replace underscores and other invalid chars with hyphens
|
|
143
|
+
// Remove any consecutive hyphens and trim hyphens from ends
|
|
144
|
+
return value
|
|
145
|
+
.replace(/[^a-zA-Z0-9-]/g, '-')
|
|
146
|
+
.replace(/-+/g, '-')
|
|
147
|
+
.replace(/^-|-$/g, '');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Gets the task name with tenant prefix applied if tenant is set.
|
|
151
|
+
* Task-level isolation: all tenants share the same queue, but task names are prefixed.
|
|
152
|
+
* This avoids the overhead of creating separate queues per tenant.
|
|
153
|
+
* @param taskName - The base task name
|
|
154
|
+
* @returns The full task name with tenant prefix if applicable
|
|
155
|
+
*/
|
|
156
|
+
getTaskName(taskName) {
|
|
157
|
+
const sanitizedTask = this.sanitizeForGcp(taskName);
|
|
158
|
+
if (this._tenantId) {
|
|
159
|
+
const sanitizedTenant = this.sanitizeForGcp(this._tenantId);
|
|
160
|
+
return `${sanitizedTenant}-${sanitizedTask}`;
|
|
161
|
+
}
|
|
162
|
+
return sanitizedTask;
|
|
36
163
|
}
|
|
37
164
|
async getCloudTasksClient() {
|
|
38
165
|
const cloudTasks = await Promise.resolve().then(() => require('@google-cloud/tasks'));
|
|
@@ -54,6 +181,7 @@ class CloudTaskConnector {
|
|
|
54
181
|
const parsedURL = new URL(url, baseUrl);
|
|
55
182
|
(0, js_utils_1.assert)(parsedURL, 'Task URL is invalid');
|
|
56
183
|
const client = await this.getCloudTasksClient();
|
|
184
|
+
// Use queue name directly - tenant isolation is at task name level, not queue level
|
|
57
185
|
const parent = client.queuePath(this.gcpProject, this.location, queueName);
|
|
58
186
|
// Build the task object in one go to avoid multiple spreads
|
|
59
187
|
const finalTask = {
|
|
@@ -116,6 +244,7 @@ class CloudTaskConnector {
|
|
|
116
244
|
*/
|
|
117
245
|
async listFailedTasks(queueName = 'default') {
|
|
118
246
|
const client = await this.getCloudTasksClient();
|
|
247
|
+
// Use queue name directly - tenant isolation is at task name level
|
|
119
248
|
const parent = client.queuePath(this.gcpProject, this.location, queueName);
|
|
120
249
|
// We have to be careful with the response, as it can be large.
|
|
121
250
|
const [tasks] = await client.listTasks({ parent, responseView: 'FULL' });
|
|
@@ -167,6 +296,8 @@ class CloudTaskConnector {
|
|
|
167
296
|
if (error?.message.includes('The task no longer exists')) {
|
|
168
297
|
// Extract task name once
|
|
169
298
|
const taskName = name?.split('/').pop() || '';
|
|
299
|
+
// Use cached payload if available (GCP removes completed tasks immediately)
|
|
300
|
+
const cachedPayload = this.getCachedPayload(name) || {};
|
|
170
301
|
return {
|
|
171
302
|
id: name,
|
|
172
303
|
name: taskName,
|
|
@@ -176,7 +307,7 @@ class CloudTaskConnector {
|
|
|
176
307
|
created: new Date().toISOString(),
|
|
177
308
|
nextRun: null,
|
|
178
309
|
nextRunMinutes: null,
|
|
179
|
-
payload:
|
|
310
|
+
payload: cachedPayload
|
|
180
311
|
};
|
|
181
312
|
}
|
|
182
313
|
const task = resp[0];
|
|
@@ -216,9 +347,13 @@ class CloudTaskConnector {
|
|
|
216
347
|
* @param params.taskBody - Body of the task.
|
|
217
348
|
*/
|
|
218
349
|
async queue(params) {
|
|
350
|
+
// Apply tenant prefix to task name for multi-tenant isolation
|
|
351
|
+
// All tenants share the same queue, but task names are prefixed
|
|
352
|
+
const baseTaskName = `${params.uniqueTaskName}-${js_utils_1.Ids.nanoId(5)}`;
|
|
353
|
+
const taskName = this.getTaskName(baseTaskName);
|
|
219
354
|
const task = await this.addTask({
|
|
220
355
|
task: {
|
|
221
|
-
name:
|
|
356
|
+
name: taskName,
|
|
222
357
|
httpRequest: {
|
|
223
358
|
url: params.postUrl,
|
|
224
359
|
body: JSON.stringify(params.taskBody)
|
|
@@ -227,6 +362,10 @@ class CloudTaskConnector {
|
|
|
227
362
|
queueName: params.queueName || 'default',
|
|
228
363
|
backoffSettings: defaultBackoffSettings
|
|
229
364
|
});
|
|
365
|
+
// Cache the payload so we can return it even after GCP removes the completed task
|
|
366
|
+
if (task.name) {
|
|
367
|
+
this.cachePayload(task.name, params.taskBody);
|
|
368
|
+
}
|
|
230
369
|
const creation = Number(task.createTime?.seconds || 0) || 0;
|
|
231
370
|
const scheduled = Number(task.scheduleTime?.seconds || 0) || 0;
|
|
232
371
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudTaskConnector.js","sourceRoot":"","sources":["../src/CloudTaskConnector.ts"],"names":[],"mappings":";;;;AAAA,gDAA0E;AAC1E,oDAA8C;
|
|
1
|
+
{"version":3,"file":"CloudTaskConnector.js","sourceRoot":"","sources":["../src/CloudTaskConnector.ts"],"names":[],"mappings":"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"}
|
package/dist/cloudtask.spec.js
CHANGED
|
@@ -17,7 +17,9 @@ const cloudTaskConnector = new CloudTaskConnector_js_1.CloudTaskConnector({
|
|
|
17
17
|
gcpServiceAccount,
|
|
18
18
|
location: 'europe-west1',
|
|
19
19
|
encryptionKey: 'test-encryption-key-32chars!!!!',
|
|
20
|
-
gcpProject: gcpServiceAccount.project_id
|
|
20
|
+
gcpProject: gcpServiceAccount.project_id,
|
|
21
|
+
// Enable payload cache for testing - GCP removes completed tasks immediately
|
|
22
|
+
enablePayloadCache: true
|
|
21
23
|
});
|
|
22
24
|
// Run the standardized test suite
|
|
23
25
|
// Note: GCP Cloud Tasks uses HTTP callbacks, not workers.
|
|
@@ -94,5 +96,62 @@ const cloudTaskConnector = new CloudTaskConnector_js_1.CloudTaskConnector({
|
|
|
94
96
|
// Should be base64 encoded
|
|
95
97
|
(0, vitest_1.expect)(() => Buffer.from(encrypted, 'base64')).not.toThrow();
|
|
96
98
|
});
|
|
99
|
+
(0, vitest_1.it)('should expose tenantId when set', () => {
|
|
100
|
+
const tenantConnector = new CloudTaskConnector_js_1.CloudTaskConnector({
|
|
101
|
+
gcpServiceAccount,
|
|
102
|
+
location: 'europe-west1',
|
|
103
|
+
encryptionKey: 'test-encryption-key-32chars!!!!',
|
|
104
|
+
gcpProject: gcpServiceAccount.project_id,
|
|
105
|
+
tenantId: 'test-tenant'
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.expect)(tenantConnector.tenantId).toBe('test-tenant');
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.it)('should have undefined tenantId when not set', () => {
|
|
110
|
+
(0, vitest_1.expect)(cloudTaskConnector.tenantId).toBeUndefined();
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)('forTenant() should create a new connector with tenant prefix', () => {
|
|
113
|
+
const tenantConnector = cloudTaskConnector.forTenant('acme-corp');
|
|
114
|
+
(0, vitest_1.expect)(tenantConnector.tenantId).toBe('acme-corp');
|
|
115
|
+
// Original connector should be unchanged
|
|
116
|
+
(0, vitest_1.expect)(cloudTaskConnector.tenantId).toBeUndefined();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
// Multi-tenant isolation tests using task name prefixes
|
|
120
|
+
// Note: GCP Cloud Tasks uses HTTP callbacks (push model), not workers (pull model).
|
|
121
|
+
// The multi-tenant tests verify task isolation and basic API operations.
|
|
122
|
+
const baseConnector = new CloudTaskConnector_js_1.CloudTaskConnector({
|
|
123
|
+
gcpServiceAccount,
|
|
124
|
+
location: 'europe-west1',
|
|
125
|
+
encryptionKey: 'test-encryption-key-32chars!!!!',
|
|
126
|
+
gcpProject: gcpServiceAccount.project_id,
|
|
127
|
+
// Enable payload cache for testing - GCP removes completed tasks immediately
|
|
128
|
+
enablePayloadCache: true
|
|
129
|
+
});
|
|
130
|
+
// Store tenant connectors for cleanup
|
|
131
|
+
const tenantConnectors = new Map();
|
|
132
|
+
(0, test_suite_1.multiTenantTestSuite)({ describe: vitest_1.describe, it: vitest_1.it, expect: vitest_1.expect, beforeAll: vitest_1.beforeAll, afterAll: vitest_1.afterAll, beforeEach: vitest_1.beforeEach, afterEach: vitest_1.afterEach }, {
|
|
133
|
+
createTenantConnector: tenantId => {
|
|
134
|
+
const tenantConnector = baseConnector.forTenant(tenantId);
|
|
135
|
+
tenantConnectors.set(tenantId, tenantConnector);
|
|
136
|
+
return tenantConnector;
|
|
137
|
+
},
|
|
138
|
+
// GCP Cloud Tasks uses HTTP callbacks, not workers.
|
|
139
|
+
// We provide a no-op startWorker since GCP pushes to the HTTP endpoint.
|
|
140
|
+
startTenantWorker: async (_tenantId, _tasks) => {
|
|
141
|
+
// GCP Cloud Tasks is push-based (HTTP callbacks), not pull-based (workers)
|
|
142
|
+
// The task completes when GCP receives a 2xx response from the endpoint
|
|
143
|
+
return async () => {
|
|
144
|
+
// No cleanup needed - GCP handles queue management
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
taskCompletionTimeout: 30000,
|
|
148
|
+
statusCheckInterval: 2000,
|
|
149
|
+
workerStartupDelay: 1000,
|
|
150
|
+
supportsForTenant: true,
|
|
151
|
+
// Use a real HTTP endpoint that GCP can reach and will return 200 OK
|
|
152
|
+
testPostUrl: 'https://httpbin.org/post',
|
|
153
|
+
// Skip data isolation tests - GCP tasks are identified by full path which
|
|
154
|
+
// includes the task name, so cross-tenant getStatus would require different logic
|
|
155
|
+
runIsolationTests: false
|
|
97
156
|
});
|
|
98
157
|
//# sourceMappingURL=cloudtask.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudtask.spec.js","sourceRoot":"","sources":["../src/cloudtask.spec.ts"],"names":[],"mappings":";AAAA,yCAAyC;;AAEzC,oDAAiD;AACjD,+
|
|
1
|
+
{"version":3,"file":"cloudtask.spec.js","sourceRoot":"","sources":["../src/cloudtask.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type { CloudTaskConnectorConfig } from './CloudTaskConnector.js';
|
|
1
2
|
export { CloudTaskConnector } from './CloudTaskConnector.js';
|
|
2
3
|
export type { GCPServiceAccount } from './CloudTaskConnector.types.js';
|
|
3
4
|
export { MockCloudTaskConnector } from './MockCloudTaskConnector.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iEAA4D;AAAnD,2HAAA,kBAAkB,OAAA;AAE3B,yEAAoE;AAA3D,mIAAA,sBAAsB,OAAA"}
|