opticedge-cloud-utils 1.0.21 → 1.0.23

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/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './auth/verify';
2
2
  export * from './db/mongo';
3
3
  export * from './db/mongo2';
4
4
  export * from './db/mongo3';
5
+ export * from './types/notify';
5
6
  export * from './types/pokemontcg';
6
7
  export * from './types/pricecharting';
7
8
  export * from './utils/env';
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ __exportStar(require("./auth/verify"), exports);
18
18
  __exportStar(require("./db/mongo"), exports);
19
19
  __exportStar(require("./db/mongo2"), exports);
20
20
  __exportStar(require("./db/mongo3"), exports);
21
+ __exportStar(require("./types/notify"), exports);
21
22
  __exportStar(require("./types/pokemontcg"), exports);
22
23
  __exportStar(require("./types/pricecharting"), exports);
23
24
  __exportStar(require("./utils/env"), exports);
@@ -0,0 +1,4 @@
1
+ export type Message = {
2
+ title: string;
3
+ body: string;
4
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +1 @@
1
- export declare function createTask(projectId: string, region: string, queueId: string, data: unknown, serviceAccount: string, audience: string): Promise<string>;
1
+ export declare function createTask(projectId: string, region: string, queueId: string, data: unknown, serviceAccount: string, audience: string, delaySeconds?: number): Promise<string>;
@@ -3,11 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createTask = createTask;
4
4
  const tasks_1 = require("@google-cloud/tasks");
5
5
  const tasksClient = new tasks_1.CloudTasksClient();
6
- async function createTask(projectId, region, queueId, data, serviceAccount, audience) {
6
+ async function createTask(projectId, region, queueId, data, serviceAccount, audience, delaySeconds = 0) {
7
7
  if (!projectId || !region || !queueId || !serviceAccount || !audience) {
8
8
  throw new Error('Missing required parameters for Cloud Tasks setup');
9
9
  }
10
10
  const parent = tasksClient.queuePath(projectId, region, queueId);
11
+ const now = Date.now() / 1000;
12
+ const scheduledTime = delaySeconds > 0
13
+ ? {
14
+ seconds: Math.floor(now + delaySeconds)
15
+ }
16
+ : undefined;
11
17
  const task = {
12
18
  httpRequest: {
13
19
  httpMethod: tasks_1.protos.google.cloud.tasks.v2.HttpMethod.POST,
@@ -20,11 +26,13 @@ async function createTask(projectId, region, queueId, data, serviceAccount, audi
20
26
  serviceAccountEmail: serviceAccount,
21
27
  audience
22
28
  }
23
- }
29
+ },
30
+ scheduleTime: scheduledTime
24
31
  };
25
32
  const [response] = await tasksClient.createTask({ parent, task });
26
33
  if (!response.name) {
27
34
  throw new Error('Failed to create task: no name returned');
28
35
  }
36
+ console.log(`✅ Created Cloud Task: ${response.name}`);
29
37
  return response.name;
30
38
  }
@@ -51,4 +51,17 @@ describe('createTask', () => {
51
51
  mockCreateTask.mockResolvedValue([{}]); // Simulate missing name
52
52
  await expect((0, task_1.createTask)('test-project', 'us-central1', 'test-queue', { foo: 'bar' }, 'test@project.iam.gserviceaccount.com', 'https://example.com')).rejects.toThrow('Failed to create task: no name returned');
53
53
  });
54
+ it('should include scheduleTime if delaySeconds is set', async () => {
55
+ const mockTaskName = 'projects/test/locations/us-central1/queues/test/tasks/task-456';
56
+ mockCreateTask.mockResolvedValue([{ name: mockTaskName }]);
57
+ const delaySeconds = 120;
58
+ const before = Math.floor(Date.now() / 1000) + delaySeconds;
59
+ await (0, task_1.createTask)('test', 'us-central1', 'test', { message: 'delayed' }, 'sa@test.iam.gserviceaccount.com', 'https://run-url', delaySeconds);
60
+ const taskArg = mockCreateTask.mock.calls[0][0].task;
61
+ const scheduleTime = taskArg.scheduleTime?.seconds;
62
+ const after = Math.floor(Date.now() / 1000) + delaySeconds;
63
+ expect(typeof scheduleTime).toBe('number');
64
+ expect(scheduleTime).toBeGreaterThanOrEqual(before);
65
+ expect(scheduleTime).toBeLessThanOrEqual(after);
66
+ });
54
67
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opticedge-cloud-utils",
3
- "version": "1.0.21",
3
+ "version": "1.0.23",
4
4
  "description": "Common utilities for cloud functions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export * from './auth/verify'
2
2
  export * from './db/mongo'
3
3
  export * from './db/mongo2'
4
4
  export * from './db/mongo3'
5
+ export * from './types/notify'
5
6
  export * from './types/pokemontcg'
6
7
  export * from './types/pricecharting'
7
8
  export * from './utils/env'
@@ -0,0 +1,4 @@
1
+ export type Message = {
2
+ title: string
3
+ body: string
4
+ }
@@ -91,4 +91,31 @@ describe('createTask', () => {
91
91
  )
92
92
  ).rejects.toThrow('Failed to create task: no name returned')
93
93
  })
94
+
95
+ it('should include scheduleTime if delaySeconds is set', async () => {
96
+ const mockTaskName = 'projects/test/locations/us-central1/queues/test/tasks/task-456'
97
+ mockCreateTask.mockResolvedValue([{ name: mockTaskName }])
98
+
99
+ const delaySeconds = 120
100
+ const before = Math.floor(Date.now() / 1000) + delaySeconds
101
+
102
+ await createTask(
103
+ 'test',
104
+ 'us-central1',
105
+ 'test',
106
+ { message: 'delayed' },
107
+ 'sa@test.iam.gserviceaccount.com',
108
+ 'https://run-url',
109
+ delaySeconds
110
+ )
111
+
112
+ const taskArg = mockCreateTask.mock.calls[0][0].task
113
+ const scheduleTime = taskArg.scheduleTime?.seconds
114
+
115
+ const after = Math.floor(Date.now() / 1000) + delaySeconds
116
+
117
+ expect(typeof scheduleTime).toBe('number')
118
+ expect(scheduleTime).toBeGreaterThanOrEqual(before)
119
+ expect(scheduleTime).toBeLessThanOrEqual(after)
120
+ })
94
121
  })
package/src/utils/task.ts CHANGED
@@ -8,7 +8,8 @@ export async function createTask(
8
8
  queueId: string,
9
9
  data: unknown,
10
10
  serviceAccount: string,
11
- audience: string
11
+ audience: string,
12
+ delaySeconds: number = 0
12
13
  ): Promise<string> {
13
14
  if (!projectId || !region || !queueId || !serviceAccount || !audience) {
14
15
  throw new Error('Missing required parameters for Cloud Tasks setup')
@@ -16,6 +17,14 @@ export async function createTask(
16
17
 
17
18
  const parent = tasksClient.queuePath(projectId, region, queueId)
18
19
 
20
+ const now = Date.now() / 1000
21
+ const scheduledTime: protos.google.protobuf.ITimestamp | undefined =
22
+ delaySeconds > 0
23
+ ? {
24
+ seconds: Math.floor(now + delaySeconds)
25
+ }
26
+ : undefined
27
+
19
28
  const task: protos.google.cloud.tasks.v2.ITask = {
20
29
  httpRequest: {
21
30
  httpMethod: protos.google.cloud.tasks.v2.HttpMethod.POST,
@@ -28,12 +37,15 @@ export async function createTask(
28
37
  serviceAccountEmail: serviceAccount,
29
38
  audience
30
39
  }
31
- }
40
+ },
41
+ scheduleTime: scheduledTime
32
42
  }
33
43
 
34
44
  const [response] = await tasksClient.createTask({ parent, task })
35
45
  if (!response.name) {
36
46
  throw new Error('Failed to create task: no name returned')
37
47
  }
48
+
49
+ console.log(`✅ Created Cloud Task: ${response.name}`)
38
50
  return response.name
39
51
  }