@pikku/core 0.12.0 → 0.12.1
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 +24 -0
- package/dist/errors/errors.d.ts +6 -0
- package/dist/errors/errors.js +10 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +1 -0
- package/dist/function/function-runner.d.ts +3 -3
- package/dist/function/function-runner.js +66 -44
- package/dist/function/functions.types.d.ts +1 -0
- package/dist/handle-error.d.ts +2 -2
- package/dist/handle-error.js +2 -2
- package/dist/index.d.ts +5 -3
- package/dist/index.js +2 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.js +2 -0
- package/dist/middleware/auth-bearer.d.ts +1 -1
- package/dist/middleware/auth-bearer.js +1 -1
- package/dist/middleware/auth-cookie.d.ts +2 -2
- package/dist/middleware/auth-cookie.js +1 -1
- package/dist/middleware/cors.d.ts +2 -2
- package/dist/middleware/cors.js +45 -37
- package/dist/middleware-runner.d.ts +1 -1
- package/dist/permissions.d.ts +2 -2
- package/dist/pikku-state.d.ts +9 -8
- package/dist/pikku-state.js +30 -17
- package/dist/schema.d.ts +4 -4
- package/dist/schema.js +9 -5
- package/dist/services/ai-agent-runner-service.d.ts +22 -3
- package/dist/services/ai-run-state-service.d.ts +1 -1
- package/dist/services/ai-storage-service.d.ts +1 -1
- package/dist/services/content-service.d.ts +6 -0
- package/dist/services/gopass-secrets.d.ts +1 -1
- package/dist/services/gopass-secrets.js +3 -0
- package/dist/services/in-memory-ai-run-state-service.d.ts +15 -0
- package/dist/services/in-memory-ai-run-state-service.js +44 -0
- package/dist/services/in-memory-trigger-service.d.ts +0 -1
- package/dist/services/in-memory-trigger-service.js +6 -8
- package/dist/services/index.d.ts +3 -2
- package/dist/services/index.js +1 -0
- package/dist/services/local-content.d.ts +2 -1
- package/dist/services/local-content.js +6 -1
- package/dist/services/local-secrets.d.ts +2 -2
- package/dist/services/local-variables.d.ts +1 -1
- package/dist/services/logger-console.d.ts +2 -1
- package/dist/services/scheduler-service.d.ts +0 -12
- package/dist/services/scheduler-service.js +0 -6
- package/dist/services/scoped-secret-service.d.ts +1 -1
- package/dist/services/trigger-service.d.ts +0 -7
- package/dist/services/user-session-service.d.ts +3 -3
- package/dist/services/workflow-service.d.ts +2 -3
- package/dist/types/core.types.d.ts +24 -18
- package/dist/types/state.types.d.ts +17 -15
- package/dist/utils.d.ts +5 -5
- package/dist/utils.js +12 -9
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.d.ts +5 -0
- package/dist/wirings/ai-agent/ai-agent-assistant-ui.js +146 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.d.ts +28 -0
- package/dist/wirings/ai-agent/ai-agent-helpers.js +40 -0
- package/dist/wirings/ai-agent/ai-agent-prepare.d.ts +4 -5
- package/dist/wirings/ai-agent/ai-agent-prepare.js +66 -30
- package/dist/wirings/ai-agent/ai-agent-registry.d.ts +1 -1
- package/dist/wirings/ai-agent/ai-agent-runner.js +107 -8
- package/dist/wirings/ai-agent/ai-agent-stream.d.ts +2 -1
- package/dist/wirings/ai-agent/ai-agent-stream.js +246 -87
- package/dist/wirings/ai-agent/ai-agent.types.d.ts +61 -2
- package/dist/wirings/ai-agent/index.d.ts +3 -1
- package/dist/wirings/ai-agent/index.js +2 -0
- package/dist/wirings/channel/channel-common.d.ts +2 -2
- package/dist/wirings/channel/channel-handler.d.ts +3 -3
- package/dist/wirings/channel/channel-handler.js +4 -4
- package/dist/wirings/channel/channel-runner.d.ts +5 -5
- package/dist/wirings/channel/channel-runner.js +3 -2
- package/dist/wirings/channel/channel-store.d.ts +1 -1
- package/dist/wirings/channel/channel.types.d.ts +4 -6
- package/dist/wirings/channel/local/local-channel-runner.d.ts +7 -2
- package/dist/wirings/channel/local/local-channel-runner.js +4 -3
- package/dist/wirings/channel/local/local-eventhub-service.d.ts +2 -2
- package/dist/wirings/channel/log-channels.d.ts +1 -1
- package/dist/wirings/channel/pikku-abstract-channel-handler.d.ts +1 -1
- package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +4 -4
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +25 -19
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +1 -1
- package/dist/wirings/cli/cli-runner.d.ts +2 -2
- package/dist/wirings/cli/cli.types.d.ts +3 -3
- package/dist/wirings/cli/command-parser.d.ts +1 -1
- package/dist/wirings/http/http-runner.d.ts +9 -9
- package/dist/wirings/http/http-runner.js +33 -14
- package/dist/wirings/http/http.types.d.ts +2 -6
- package/dist/wirings/http/log-http-routes.d.ts +1 -1
- package/dist/wirings/http/pikku-fetch-http-request.d.ts +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.d.ts +2 -2
- package/dist/wirings/http/pikku-fetch-http-response.js +6 -1
- package/dist/wirings/http/routers/http-router.d.ts +1 -1
- package/dist/wirings/http/routers/path-to-regex.d.ts +2 -2
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
- package/dist/wirings/mcp/mcp-runner.d.ts +0 -3
- package/dist/wirings/mcp/mcp-runner.js +4 -2
- package/dist/wirings/mcp/mcp.types.d.ts +2 -2
- package/dist/wirings/oauth2/oauth2-client.d.ts +3 -3
- package/dist/wirings/oauth2/wire-oauth2-credential.d.ts +1 -1
- package/dist/wirings/queue/index.d.ts +1 -1
- package/dist/wirings/queue/index.js +1 -1
- package/dist/wirings/queue/queue-runner.d.ts +1 -12
- package/dist/wirings/queue/queue-runner.js +4 -12
- package/dist/wirings/queue/queue.types.d.ts +3 -9
- package/dist/wirings/queue/register-queue-helper.d.ts +2 -2
- package/dist/wirings/queue/register-queue-helper.js +1 -1
- package/dist/wirings/queue/validate-worker-config.d.ts +1 -1
- package/dist/wirings/rpc/index.d.ts +2 -0
- package/dist/wirings/rpc/index.js +1 -0
- package/dist/wirings/rpc/rpc-runner.d.ts +36 -14
- package/dist/wirings/rpc/rpc-runner.js +56 -28
- package/dist/wirings/rpc/rpc-types.d.ts +14 -2
- package/dist/wirings/rpc/wire-addon.d.ts +10 -0
- package/dist/wirings/rpc/wire-addon.js +9 -0
- package/dist/wirings/scheduler/index.d.ts +1 -1
- package/dist/wirings/scheduler/index.js +1 -1
- package/dist/wirings/scheduler/log-schedulers.d.ts +1 -1
- package/dist/wirings/scheduler/scheduler-runner.d.ts +3 -10
- package/dist/wirings/scheduler/scheduler-runner.js +4 -25
- package/dist/wirings/scheduler/scheduler.types.d.ts +2 -2
- package/dist/wirings/trigger/pikku-trigger-service.d.ts +2 -6
- package/dist/wirings/trigger/pikku-trigger-service.js +11 -16
- package/dist/wirings/trigger/trigger-runner.d.ts +1 -5
- package/dist/wirings/trigger/trigger-runner.js +4 -3
- package/dist/wirings/workflow/pikku-workflow-service.d.ts +2 -6
- package/dist/wirings/workflow/pikku-workflow-service.js +20 -29
- package/dist/wirings/workflow/workflow.types.d.ts +2 -2
- package/package.json +2 -1
- package/src/crypto-utils.test.ts +116 -0
- package/src/errors/error.test.ts +143 -2
- package/src/errors/errors.ts +10 -0
- package/src/errors/index.ts +1 -0
- package/src/function/function-runner.test.ts +2 -2
- package/src/function/function-runner.ts +72 -49
- package/src/function/functions.types.ts +1 -0
- package/src/handle-error.test.ts +361 -0
- package/src/handle-error.ts +4 -4
- package/src/index.ts +3 -10
- package/src/internal.ts +6 -0
- package/src/middleware/auth-apikey.test.ts +1 -1
- package/src/middleware/auth-bearer.test.ts +1 -1
- package/src/middleware/auth-bearer.ts +2 -5
- package/src/middleware/auth-cookie.test.ts +1 -1
- package/src/middleware/auth-cookie.ts +3 -5
- package/src/middleware/cors.test.ts +424 -0
- package/src/middleware/cors.ts +14 -6
- package/src/middleware/remote-auth.test.ts +488 -0
- package/src/middleware-runner.test.ts +1 -1
- package/src/middleware-runner.ts +1 -1
- package/src/permissions.test.ts +2 -2
- package/src/permissions.ts +2 -2
- package/src/pikku-state.test.ts +224 -0
- package/src/pikku-state.ts +40 -28
- package/src/schema.test.ts +198 -6
- package/src/schema.ts +11 -7
- package/src/services/ai-agent-runner-service.ts +15 -3
- package/src/services/ai-run-state-service.ts +1 -1
- package/src/services/ai-storage-service.ts +1 -1
- package/src/services/content-service.ts +7 -0
- package/src/services/gopass-secrets.ts +4 -1
- package/src/services/in-memory-ai-run-state-service.ts +73 -0
- package/src/services/in-memory-trigger-service.ts +6 -10
- package/src/services/in-memory-workflow-service.test.ts +351 -0
- package/src/services/index.ts +2 -1
- package/src/services/local-content.ts +9 -3
- package/src/services/local-secrets.test.ts +80 -0
- package/src/services/local-secrets.ts +2 -2
- package/src/services/local-variables.test.ts +61 -0
- package/src/services/local-variables.ts +1 -1
- package/src/services/logger-console.test.ts +118 -0
- package/src/services/logger-console.ts +2 -1
- package/src/services/scheduler-service.ts +0 -18
- package/src/services/scoped-secret-service.test.ts +74 -0
- package/src/services/scoped-secret-service.ts +1 -1
- package/src/services/trigger-service.ts +0 -21
- package/src/services/typed-secret-service.test.ts +93 -0
- package/src/services/typed-variables-service.test.ts +73 -0
- package/src/services/user-session-service.test.ts +113 -0
- package/src/services/user-session-service.ts +3 -3
- package/src/services/workflow-service.ts +2 -12
- package/src/time-utils.test.ts +1 -1
- package/src/types/core.types.ts +25 -19
- package/src/types/state.types.ts +24 -15
- package/src/utils.test.ts +350 -0
- package/src/utils.ts +14 -13
- package/src/wirings/ai-agent/ai-agent-assistant-ui.test.ts +363 -0
- package/src/wirings/ai-agent/ai-agent-assistant-ui.ts +214 -0
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +152 -0
- package/src/wirings/ai-agent/ai-agent-helpers.ts +76 -0
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +115 -0
- package/src/wirings/ai-agent/ai-agent-prepare.ts +79 -45
- package/src/wirings/ai-agent/ai-agent-registry.ts +1 -1
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +245 -3
- package/src/wirings/ai-agent/ai-agent-runner.ts +121 -7
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +430 -24
- package/src/wirings/ai-agent/ai-agent-stream.ts +377 -102
- package/src/wirings/ai-agent/ai-agent.types.ts +57 -2
- package/src/wirings/ai-agent/index.ts +11 -0
- package/src/wirings/channel/channel-common.ts +2 -2
- package/src/wirings/channel/channel-handler.ts +13 -9
- package/src/wirings/channel/channel-runner.ts +6 -6
- package/src/wirings/channel/channel-store.ts +1 -1
- package/src/wirings/channel/channel.types.ts +4 -8
- package/src/wirings/channel/local/local-channel-runner.test.ts +19 -12
- package/src/wirings/channel/local/local-channel-runner.ts +18 -13
- package/src/wirings/channel/local/local-eventhub-service.test.ts +2 -2
- package/src/wirings/channel/local/local-eventhub-service.ts +2 -2
- package/src/wirings/channel/log-channels.ts +1 -1
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +1 -1
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +37 -32
- package/src/wirings/cli/channel/cli-channel-runner.ts +1 -1
- package/src/wirings/cli/cli-runner.test.ts +1 -1
- package/src/wirings/cli/cli-runner.ts +11 -4
- package/src/wirings/cli/cli.types.ts +3 -3
- package/src/wirings/cli/command-parser.test.ts +1 -1
- package/src/wirings/cli/command-parser.ts +1 -1
- package/src/wirings/http/http-routes.test.ts +1 -1
- package/src/wirings/http/http-runner.test.ts +9 -17
- package/src/wirings/http/http-runner.ts +43 -27
- package/src/wirings/http/http.types.ts +1 -14
- package/src/wirings/http/log-http-routes.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-request.ts +1 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +12 -5
- package/src/wirings/http/routers/http-router.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.test.ts +1 -1
- package/src/wirings/http/routers/path-to-regex.ts +4 -3
- package/src/wirings/mcp/mcp-endpoint-registry.ts +5 -1
- package/src/wirings/mcp/mcp-runner.ts +9 -15
- package/src/wirings/mcp/mcp.types.ts +2 -2
- package/src/wirings/oauth2/oauth2-client.ts +3 -3
- package/src/wirings/oauth2/wire-oauth2-credential.ts +1 -1
- package/src/wirings/queue/index.ts +0 -1
- package/src/wirings/queue/queue-runner.test.ts +52 -25
- package/src/wirings/queue/queue-runner.ts +8 -30
- package/src/wirings/queue/queue.types.ts +3 -13
- package/src/wirings/queue/register-queue-helper.ts +3 -5
- package/src/wirings/queue/validate-worker-config.test.ts +108 -0
- package/src/wirings/queue/validate-worker-config.ts +4 -1
- package/src/wirings/rpc/index.ts +2 -0
- package/src/wirings/rpc/rpc-runner.ts +92 -49
- package/src/wirings/rpc/rpc-types.ts +17 -2
- package/src/wirings/rpc/wire-addon.ts +20 -0
- package/src/wirings/scheduler/index.ts +0 -1
- package/src/wirings/scheduler/log-schedulers.ts +1 -1
- package/src/wirings/scheduler/scheduler-runner.test.ts +49 -60
- package/src/wirings/scheduler/scheduler-runner.ts +9 -56
- package/src/wirings/scheduler/scheduler.types.ts +2 -2
- package/src/wirings/secret/validate-secret-definitions.test.ts +140 -0
- package/src/wirings/trigger/pikku-trigger-service.ts +17 -39
- package/src/wirings/trigger/trigger-runner.test.ts +79 -0
- package/src/wirings/trigger/trigger-runner.ts +8 -11
- package/src/wirings/variable/validate-variable-definitions.test.ts +91 -0
- package/src/wirings/workflow/graph/graph-runner.test.ts +14 -22
- package/src/wirings/workflow/graph/template.test.ts +49 -0
- package/src/wirings/workflow/pikku-workflow-service.test.ts +15 -27
- package/src/wirings/workflow/pikku-workflow-service.ts +29 -45
- package/src/wirings/workflow/workflow-helpers.test.ts +129 -0
- package/src/wirings/workflow/workflow.types.ts +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/wirings/workflow/workflow-utils.d.ts +0 -1
- package/dist/wirings/workflow/workflow-utils.js +0 -1
- package/src/wirings/workflow/workflow-utils.ts +0 -0
|
@@ -5,12 +5,11 @@ import {
|
|
|
5
5
|
getQueueWorkers,
|
|
6
6
|
removeQueueWorker,
|
|
7
7
|
runQueueJob,
|
|
8
|
-
createQueueJobRunner,
|
|
9
8
|
QueueJobFailedError,
|
|
10
9
|
QueueJobDiscardedError,
|
|
11
10
|
} from './queue-runner.js'
|
|
12
11
|
import { resetPikkuState, pikkuState } from '../../pikku-state.js'
|
|
13
|
-
import { CoreQueueWorker, QueueJob } from './queue.types.js'
|
|
12
|
+
import type { CoreQueueWorker, QueueJob } from './queue.types.js'
|
|
14
13
|
|
|
15
14
|
beforeEach(() => {
|
|
16
15
|
resetPikkuState()
|
|
@@ -219,12 +218,14 @@ describe('runQueueJob', () => {
|
|
|
219
218
|
wireQueueWorker(mockWorker)
|
|
220
219
|
|
|
221
220
|
const mockLogger = createMockLogger()
|
|
221
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
222
|
+
logger: mockLogger,
|
|
223
|
+
} as any)
|
|
222
224
|
const job = createMockJob('simple-queue', 'job-123', {
|
|
223
225
|
message: 'test data',
|
|
224
226
|
})
|
|
225
227
|
|
|
226
228
|
const result = await runQueueJob({
|
|
227
|
-
singletonServices: { logger: mockLogger } as any,
|
|
228
229
|
job,
|
|
229
230
|
})
|
|
230
231
|
|
|
@@ -257,12 +258,14 @@ describe('runQueueJob', () => {
|
|
|
257
258
|
wireQueueWorker(mockWorker)
|
|
258
259
|
|
|
259
260
|
const mockLogger = createMockLogger()
|
|
261
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
262
|
+
logger: mockLogger,
|
|
263
|
+
} as any)
|
|
260
264
|
const job = createMockJob('fail-queue', 'job-fail-123')
|
|
261
265
|
|
|
262
266
|
await assert.rejects(
|
|
263
267
|
async () => {
|
|
264
268
|
await runQueueJob({
|
|
265
|
-
singletonServices: { logger: mockLogger } as any,
|
|
266
269
|
job,
|
|
267
270
|
})
|
|
268
271
|
},
|
|
@@ -295,12 +298,14 @@ describe('runQueueJob', () => {
|
|
|
295
298
|
wireQueueWorker(mockWorker)
|
|
296
299
|
|
|
297
300
|
const mockLogger = createMockLogger()
|
|
301
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
302
|
+
logger: mockLogger,
|
|
303
|
+
} as any)
|
|
298
304
|
const job = createMockJob('fail-no-reason-queue', 'job-456')
|
|
299
305
|
|
|
300
306
|
await assert.rejects(
|
|
301
307
|
async () => {
|
|
302
308
|
await runQueueJob({
|
|
303
|
-
singletonServices: { logger: mockLogger } as any,
|
|
304
309
|
job,
|
|
305
310
|
})
|
|
306
311
|
},
|
|
@@ -331,12 +336,14 @@ describe('runQueueJob', () => {
|
|
|
331
336
|
wireQueueWorker(mockWorker)
|
|
332
337
|
|
|
333
338
|
const mockLogger = createMockLogger()
|
|
339
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
340
|
+
logger: mockLogger,
|
|
341
|
+
} as any)
|
|
334
342
|
const job = createMockJob('discard-queue', 'job-discard-789')
|
|
335
343
|
|
|
336
344
|
await assert.rejects(
|
|
337
345
|
async () => {
|
|
338
346
|
await runQueueJob({
|
|
339
|
-
singletonServices: { logger: mockLogger } as any,
|
|
340
347
|
job,
|
|
341
348
|
})
|
|
342
349
|
},
|
|
@@ -374,10 +381,12 @@ describe('runQueueJob', () => {
|
|
|
374
381
|
wireQueueWorker(mockWorker)
|
|
375
382
|
|
|
376
383
|
const mockLogger = createMockLogger()
|
|
384
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
385
|
+
logger: mockLogger,
|
|
386
|
+
} as any)
|
|
377
387
|
const job = createMockJob('progress-queue', 'job-progress-999')
|
|
378
388
|
|
|
379
389
|
await runQueueJob({
|
|
380
|
-
singletonServices: { logger: mockLogger } as any,
|
|
381
390
|
job,
|
|
382
391
|
updateProgress: async (progress) => {
|
|
383
392
|
progressUpdates.push(progress)
|
|
@@ -407,10 +416,12 @@ describe('runQueueJob', () => {
|
|
|
407
416
|
wireQueueWorker(mockWorker)
|
|
408
417
|
|
|
409
418
|
const mockLogger = createMockLogger()
|
|
419
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
420
|
+
logger: mockLogger,
|
|
421
|
+
} as any)
|
|
410
422
|
const job = createMockJob('default-progress-queue', 'job-111')
|
|
411
423
|
|
|
412
424
|
await runQueueJob({
|
|
413
|
-
singletonServices: { logger: mockLogger } as any,
|
|
414
425
|
job,
|
|
415
426
|
})
|
|
416
427
|
|
|
@@ -441,10 +452,12 @@ describe('runQueueJob', () => {
|
|
|
441
452
|
wireQueueWorker(mockWorker)
|
|
442
453
|
|
|
443
454
|
const mockLogger = createMockLogger()
|
|
455
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
456
|
+
logger: mockLogger,
|
|
457
|
+
} as any)
|
|
444
458
|
const job = createMockJob('wire-queue', 'job-int-123')
|
|
445
459
|
|
|
446
460
|
await runQueueJob({
|
|
447
|
-
singletonServices: { logger: mockLogger } as any,
|
|
448
461
|
job,
|
|
449
462
|
})
|
|
450
463
|
|
|
@@ -457,12 +470,14 @@ describe('runQueueJob', () => {
|
|
|
457
470
|
|
|
458
471
|
test('should throw error when processor metadata not found', async () => {
|
|
459
472
|
const mockLogger = createMockLogger()
|
|
473
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
474
|
+
logger: mockLogger,
|
|
475
|
+
} as any)
|
|
460
476
|
const job = createMockJob('missing-meta-queue', 'job-222')
|
|
461
477
|
|
|
462
478
|
await assert.rejects(
|
|
463
479
|
async () => {
|
|
464
480
|
await runQueueJob({
|
|
465
|
-
singletonServices: { logger: mockLogger } as any,
|
|
466
481
|
job,
|
|
467
482
|
})
|
|
468
483
|
},
|
|
@@ -483,12 +498,14 @@ describe('runQueueJob', () => {
|
|
|
483
498
|
}
|
|
484
499
|
|
|
485
500
|
const mockLogger = createMockLogger()
|
|
501
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
502
|
+
logger: mockLogger,
|
|
503
|
+
} as any)
|
|
486
504
|
const job = createMockJob('no-registration-queue', 'job-333')
|
|
487
505
|
|
|
488
506
|
await assert.rejects(
|
|
489
507
|
async () => {
|
|
490
508
|
await runQueueJob({
|
|
491
|
-
singletonServices: { logger: mockLogger } as any,
|
|
492
509
|
job,
|
|
493
510
|
})
|
|
494
511
|
},
|
|
@@ -520,15 +537,19 @@ describe('runQueueJob', () => {
|
|
|
520
537
|
wireQueueWorker(mockWorker)
|
|
521
538
|
|
|
522
539
|
const mockLogger = createMockLogger()
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
job,
|
|
540
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
541
|
+
logger: mockLogger,
|
|
542
|
+
} as any)
|
|
543
|
+
pikkuState(null, 'package', 'factories', {
|
|
528
544
|
createWireServices: async () => {
|
|
529
545
|
createWireServicesCalled = true
|
|
530
546
|
return mockWireService as any
|
|
531
547
|
},
|
|
548
|
+
} as any)
|
|
549
|
+
const job = createMockJob('session-services-queue', 'job-444')
|
|
550
|
+
|
|
551
|
+
await runQueueJob({
|
|
552
|
+
job,
|
|
532
553
|
})
|
|
533
554
|
|
|
534
555
|
assert.equal(createWireServicesCalled, true)
|
|
@@ -553,12 +574,14 @@ describe('runQueueJob', () => {
|
|
|
553
574
|
wireQueueWorker(mockWorker)
|
|
554
575
|
|
|
555
576
|
const mockLogger = createMockLogger()
|
|
577
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
578
|
+
logger: mockLogger,
|
|
579
|
+
} as any)
|
|
556
580
|
const job = createMockJob('error-queue', 'job-555')
|
|
557
581
|
|
|
558
582
|
await assert.rejects(
|
|
559
583
|
async () => {
|
|
560
584
|
await runQueueJob({
|
|
561
|
-
singletonServices: { logger: mockLogger } as any,
|
|
562
585
|
job,
|
|
563
586
|
})
|
|
564
587
|
},
|
|
@@ -602,10 +625,12 @@ describe('runQueueJob', () => {
|
|
|
602
625
|
wireQueueWorker(mockWorker)
|
|
603
626
|
|
|
604
627
|
const mockLogger = createMockLogger()
|
|
628
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
629
|
+
logger: mockLogger,
|
|
630
|
+
} as any)
|
|
605
631
|
const job = createMockJob('middleware-queue', 'job-666')
|
|
606
632
|
|
|
607
633
|
await runQueueJob({
|
|
608
|
-
singletonServices: { logger: mockLogger } as any,
|
|
609
634
|
job,
|
|
610
635
|
})
|
|
611
636
|
|
|
@@ -629,10 +654,12 @@ describe('runQueueJob', () => {
|
|
|
629
654
|
wireQueueWorker(mockWorker)
|
|
630
655
|
|
|
631
656
|
const mockLogger = createMockLogger()
|
|
657
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
658
|
+
logger: mockLogger,
|
|
659
|
+
} as any)
|
|
632
660
|
const job = createMockJob('debug-queue', 'job-777')
|
|
633
661
|
|
|
634
662
|
await runQueueJob({
|
|
635
|
-
singletonServices: { logger: mockLogger } as any,
|
|
636
663
|
job,
|
|
637
664
|
})
|
|
638
665
|
|
|
@@ -643,8 +670,8 @@ describe('runQueueJob', () => {
|
|
|
643
670
|
})
|
|
644
671
|
})
|
|
645
672
|
|
|
646
|
-
describe('
|
|
647
|
-
test('delegates queue job execution using
|
|
673
|
+
describe('runQueueJob with pikkuState services', () => {
|
|
674
|
+
test('delegates queue job execution using pikkuState services', async () => {
|
|
648
675
|
const mockWorker: CoreQueueWorker = {
|
|
649
676
|
name: 'bound-runner-queue',
|
|
650
677
|
func: {
|
|
@@ -663,11 +690,11 @@ describe('createQueueJobRunner', () => {
|
|
|
663
690
|
wireQueueWorker(mockWorker)
|
|
664
691
|
|
|
665
692
|
const mockLogger = createMockLogger()
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
})
|
|
693
|
+
pikkuState(null, 'package', 'singletonServices', {
|
|
694
|
+
logger: mockLogger,
|
|
695
|
+
} as any)
|
|
669
696
|
|
|
670
|
-
await
|
|
697
|
+
await runQueueJob({
|
|
671
698
|
job: createMockJob('bound-runner-queue', 'job-888', { value: 41 }),
|
|
672
699
|
})
|
|
673
700
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PikkuWire } from '../../types/core.types.js'
|
|
2
2
|
import type { CoreQueueWorker, QueueJob, PikkuQueue } from './queue.types.js'
|
|
3
3
|
import type {
|
|
4
4
|
CorePikkuFunctionConfig,
|
|
@@ -6,9 +6,12 @@ import type {
|
|
|
6
6
|
} from '../../function/functions.types.js'
|
|
7
7
|
import { getErrorResponse, PikkuError } from '../../errors/error-handler.js'
|
|
8
8
|
import { PikkuMissingMetaError } from '../../errors/errors.js'
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
getSingletonServices,
|
|
11
|
+
getCreateWireServices,
|
|
12
|
+
pikkuState,
|
|
13
|
+
} from '../../pikku-state.js'
|
|
10
14
|
import { addFunction, runPikkuFunc } from '../../function/function-runner.js'
|
|
11
|
-
import { CreateWireServices } from '../../types/core.types.js'
|
|
12
15
|
|
|
13
16
|
/**
|
|
14
17
|
* Error class for queue processor not found
|
|
@@ -100,16 +103,14 @@ export async function removeQueueWorker(name: string): Promise<void> {
|
|
|
100
103
|
* Process a single queue job - this function is called by queue consumers
|
|
101
104
|
*/
|
|
102
105
|
export async function runQueueJob({
|
|
103
|
-
singletonServices,
|
|
104
|
-
createWireServices,
|
|
105
106
|
job,
|
|
106
107
|
updateProgress,
|
|
107
108
|
}: {
|
|
108
|
-
singletonServices: CoreServices
|
|
109
|
-
createWireServices?: CreateWireServices
|
|
110
109
|
job: QueueJob
|
|
111
110
|
updateProgress?: (progress: number | string | object) => Promise<void>
|
|
112
111
|
}): Promise<void> {
|
|
112
|
+
const singletonServices = getSingletonServices()
|
|
113
|
+
const createWireServices = getCreateWireServices()
|
|
113
114
|
const logger = singletonServices.logger
|
|
114
115
|
|
|
115
116
|
const meta = pikkuState(null, 'queue', 'meta')
|
|
@@ -189,26 +190,3 @@ export async function runQueueJob({
|
|
|
189
190
|
throw error
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
-
export const createQueueJobRunner = ({
|
|
194
|
-
singletonServices,
|
|
195
|
-
createWireServices,
|
|
196
|
-
}: {
|
|
197
|
-
singletonServices: CoreServices
|
|
198
|
-
createWireServices?: CreateWireServices
|
|
199
|
-
}) => {
|
|
200
|
-
return async ({
|
|
201
|
-
job,
|
|
202
|
-
updateProgress,
|
|
203
|
-
}: {
|
|
204
|
-
job: QueueJob
|
|
205
|
-
updateProgress?: (progress: number | string | object) => Promise<void>
|
|
206
|
-
}) => {
|
|
207
|
-
await runQueueJob({
|
|
208
|
-
singletonServices,
|
|
209
|
-
createWireServices,
|
|
210
|
-
job,
|
|
211
|
-
updateProgress,
|
|
212
|
-
})
|
|
213
|
-
}
|
|
214
|
-
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { CommonWireMeta } from '../../types/core.types.js'
|
|
2
|
-
import { CorePikkuFunctionConfig } from '../../function/functions.types.js'
|
|
3
|
-
import { QueueConfigMapping } from './validate-worker-config.js'
|
|
4
|
-
import { Logger } from '../../services/logger.js'
|
|
1
|
+
import type { CommonWireMeta } from '../../types/core.types.js'
|
|
2
|
+
import type { CorePikkuFunctionConfig } from '../../function/functions.types.js'
|
|
3
|
+
import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Configuration for queue workers - how jobs are processed
|
|
@@ -139,15 +138,6 @@ export interface QueueWorkers {
|
|
|
139
138
|
/** Configuration mapping for validation */
|
|
140
139
|
configMappings: QueueConfigMapping
|
|
141
140
|
|
|
142
|
-
/** Set runtime queue job runner callback and logger */
|
|
143
|
-
setJobRunner(
|
|
144
|
-
runJob: (params: {
|
|
145
|
-
job: QueueJob
|
|
146
|
-
updateProgress?: (progress: number | string | object) => Promise<void>
|
|
147
|
-
}) => Promise<void>,
|
|
148
|
-
logger: Logger
|
|
149
|
-
): void
|
|
150
|
-
|
|
151
141
|
/** Scan state and register all compatible processors */
|
|
152
142
|
registerQueues(): Promise<Record<string, ConfigValidationResult[]>>
|
|
153
143
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import type { ConfigValidationResult, CoreQueueWorker } from './queue.types.js'
|
|
2
2
|
import { getQueueWorkers } from './queue-runner.js'
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from './validate-worker-config.js'
|
|
7
|
-
import { Logger } from '../../services/logger.js'
|
|
3
|
+
import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
4
|
+
import { validateWorkerConfig } from './validate-worker-config.js'
|
|
5
|
+
import type { Logger } from '../../services/logger.js'
|
|
8
6
|
|
|
9
7
|
/**
|
|
10
8
|
* Queue processor registration callback
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert'
|
|
3
|
+
import { validateWorkerConfig } from './validate-worker-config.js'
|
|
4
|
+
import type { QueueConfigMapping } from './validate-worker-config.js'
|
|
5
|
+
|
|
6
|
+
const createTestMapping = (): QueueConfigMapping => ({
|
|
7
|
+
supported: {
|
|
8
|
+
concurrency: {
|
|
9
|
+
queueProperty: 'concurrency',
|
|
10
|
+
description: 'Number of concurrent workers',
|
|
11
|
+
},
|
|
12
|
+
maxRetries: {
|
|
13
|
+
queueProperty: 'maxRetries',
|
|
14
|
+
description: 'Maximum retry attempts',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
unsupported: {
|
|
18
|
+
rateLimitMax: {
|
|
19
|
+
reason: 'Not supported',
|
|
20
|
+
explanation: 'This queue does not support rate limiting',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
fallbacks: {
|
|
24
|
+
retryDelay: {
|
|
25
|
+
reason: 'Partial support',
|
|
26
|
+
explanation: 'Uses fixed delay instead of exponential',
|
|
27
|
+
fallbackValue: '1000ms fixed',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
describe('validateWorkerConfig', () => {
|
|
33
|
+
test('should return empty results for empty config', () => {
|
|
34
|
+
const mapping = createTestMapping()
|
|
35
|
+
const result = validateWorkerConfig(mapping, {})
|
|
36
|
+
assert.deepStrictEqual(result.applied, {})
|
|
37
|
+
assert.deepStrictEqual(result.ignored, {})
|
|
38
|
+
assert.deepStrictEqual(result.warnings, [])
|
|
39
|
+
assert.deepStrictEqual(result.fallbacks, {})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('should return empty results for undefined config', () => {
|
|
43
|
+
const mapping = createTestMapping()
|
|
44
|
+
const result = validateWorkerConfig(mapping)
|
|
45
|
+
assert.deepStrictEqual(result.applied, {})
|
|
46
|
+
assert.deepStrictEqual(result.ignored, {})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('should apply supported configurations', () => {
|
|
50
|
+
const mapping = createTestMapping()
|
|
51
|
+
const result = validateWorkerConfig(mapping, { concurrency: 5 } as any)
|
|
52
|
+
assert.deepStrictEqual(result.applied, { concurrency: 5 })
|
|
53
|
+
assert.deepStrictEqual(result.ignored, {})
|
|
54
|
+
assert.strictEqual(result.warnings.length, 0)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('should ignore unsupported configurations with warning', () => {
|
|
58
|
+
const mapping = createTestMapping()
|
|
59
|
+
const result = validateWorkerConfig(mapping, { rateLimitMax: 100 } as any)
|
|
60
|
+
assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
|
|
61
|
+
assert.strictEqual(result.warnings.length, 1)
|
|
62
|
+
assert.ok(result.warnings[0].includes('Not supported'))
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('should handle fallback configurations', () => {
|
|
66
|
+
const mapping = createTestMapping()
|
|
67
|
+
const result = validateWorkerConfig(mapping, { retryDelay: 2000 } as any)
|
|
68
|
+
assert.deepStrictEqual(result.applied, { retryDelay: 2000 })
|
|
69
|
+
assert.deepStrictEqual(result.fallbacks, { retryDelay: '1000ms fixed' })
|
|
70
|
+
assert.strictEqual(result.warnings.length, 1)
|
|
71
|
+
assert.ok(result.warnings[0].includes('Partial support'))
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('should warn about unknown configurations', () => {
|
|
75
|
+
const mapping = createTestMapping()
|
|
76
|
+
const result = validateWorkerConfig(mapping, {
|
|
77
|
+
unknownOption: 'val',
|
|
78
|
+
} as any)
|
|
79
|
+
assert.deepStrictEqual(result.ignored, { unknownOption: 'val' })
|
|
80
|
+
assert.strictEqual(result.warnings.length, 1)
|
|
81
|
+
assert.ok(result.warnings[0].includes('Unknown configuration'))
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('should skip undefined values', () => {
|
|
85
|
+
const mapping = createTestMapping()
|
|
86
|
+
const result = validateWorkerConfig(mapping, {
|
|
87
|
+
concurrency: undefined,
|
|
88
|
+
} as any)
|
|
89
|
+
assert.deepStrictEqual(result.applied, {})
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
test('should handle mixed supported and unsupported configs', () => {
|
|
93
|
+
const mapping = createTestMapping()
|
|
94
|
+
const result = validateWorkerConfig(mapping, {
|
|
95
|
+
concurrency: 3,
|
|
96
|
+
maxRetries: 5,
|
|
97
|
+
rateLimitMax: 100,
|
|
98
|
+
retryDelay: 1000,
|
|
99
|
+
} as any)
|
|
100
|
+
assert.deepStrictEqual(result.applied, {
|
|
101
|
+
concurrency: 3,
|
|
102
|
+
maxRetries: 5,
|
|
103
|
+
retryDelay: 1000,
|
|
104
|
+
})
|
|
105
|
+
assert.deepStrictEqual(result.ignored, { rateLimitMax: 100 })
|
|
106
|
+
assert.strictEqual(result.warnings.length, 2)
|
|
107
|
+
})
|
|
108
|
+
})
|
package/src/wirings/rpc/index.ts
CHANGED