@pikku/core 0.12.3 → 0.12.4
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 +6 -0
- package/dist/services/in-memory-workflow-service.d.ts +15 -2
- package/dist/services/in-memory-workflow-service.js +49 -0
- package/lcov.info +18891 -0
- package/package.json +1 -1
- package/src/crypto-utils.test.ts +0 -214
- package/src/crypto-utils.ts +0 -213
- package/src/errors/error-handler.ts +0 -62
- package/src/errors/error.test.ts +0 -195
- package/src/errors/errors.ts +0 -374
- package/src/errors/index.ts +0 -2
- package/src/factory-functions.test.ts +0 -109
- package/src/function/function-runner.test.ts +0 -536
- package/src/function/function-runner.ts +0 -365
- package/src/function/functions.types.ts +0 -304
- package/src/function/index.ts +0 -5
- package/src/handle-error.test.ts +0 -424
- package/src/handle-error.ts +0 -69
- package/src/index.ts +0 -118
- package/src/internal.ts +0 -6
- package/src/middleware/auth-apikey.test.ts +0 -363
- package/src/middleware/auth-apikey.ts +0 -47
- package/src/middleware/auth-bearer.test.ts +0 -450
- package/src/middleware/auth-bearer.ts +0 -72
- package/src/middleware/auth-cookie.test.ts +0 -528
- package/src/middleware/auth-cookie.ts +0 -80
- package/src/middleware/cors.test.ts +0 -424
- package/src/middleware/cors.ts +0 -104
- package/src/middleware/index.ts +0 -5
- package/src/middleware/remote-auth.test.ts +0 -488
- package/src/middleware/remote-auth.ts +0 -68
- package/src/middleware/timeout.ts +0 -15
- package/src/middleware-runner.test.ts +0 -418
- package/src/middleware-runner.ts +0 -234
- package/src/permissions.test.ts +0 -434
- package/src/permissions.ts +0 -319
- package/src/pikku-request.ts +0 -23
- package/src/pikku-response.ts +0 -5
- package/src/pikku-state.test.ts +0 -224
- package/src/pikku-state.ts +0 -216
- package/src/run-tests-script.test.ts +0 -49
- package/src/schema.test.ts +0 -249
- package/src/schema.ts +0 -151
- package/src/services/ai-agent-runner-service.ts +0 -41
- package/src/services/ai-run-state-service.ts +0 -20
- package/src/services/ai-storage-service.ts +0 -39
- package/src/services/content-service.ts +0 -76
- package/src/services/deployment-service.ts +0 -22
- package/src/services/gateway-service.ts +0 -20
- package/src/services/gopass-secrets.ts +0 -98
- package/src/services/in-memory-ai-run-state-service.ts +0 -73
- package/src/services/in-memory-trigger-service.ts +0 -64
- package/src/services/in-memory-workflow-service.test.ts +0 -351
- package/src/services/in-memory-workflow-service.ts +0 -438
- package/src/services/index.ts +0 -56
- package/src/services/jwt-service.ts +0 -30
- package/src/services/local-content.ts +0 -120
- package/src/services/local-gateway-service.ts +0 -62
- package/src/services/local-secrets.test.ts +0 -80
- package/src/services/local-secrets.ts +0 -94
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -39
- package/src/services/logger-console.test.ts +0 -118
- package/src/services/logger-console.ts +0 -98
- package/src/services/logger.ts +0 -57
- package/src/services/scheduler-service.ts +0 -86
- package/src/services/schema-service.ts +0 -33
- package/src/services/scoped-secret-service.test.ts +0 -74
- package/src/services/scoped-secret-service.ts +0 -41
- package/src/services/secret-service.ts +0 -38
- package/src/services/trigger-service.ts +0 -17
- package/src/services/typed-secret-service.test.ts +0 -93
- package/src/services/typed-secret-service.ts +0 -70
- package/src/services/typed-variables-service.test.ts +0 -73
- package/src/services/typed-variables-service.ts +0 -81
- package/src/services/user-session-service.test.ts +0 -113
- package/src/services/user-session-service.ts +0 -86
- package/src/services/variables-service.ts +0 -11
- package/src/services/workflow-service.ts +0 -95
- package/src/testing/index.ts +0 -2
- package/src/testing/service-tests.ts +0 -873
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -107
- package/src/types/core.types.ts +0 -478
- package/src/types/state.types.ts +0 -188
- package/src/utils/hash.test.ts +0 -68
- package/src/utils/hash.ts +0 -26
- package/src/utils.test.ts +0 -350
- package/src/utils.ts +0 -129
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/ai-agent/agent-dynamic-workflow.ts +0 -469
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +0 -152
- package/src/wirings/ai-agent/ai-agent-helpers.ts +0 -76
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -310
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +0 -115
- package/src/wirings/ai-agent/ai-agent-model-config.ts +0 -43
- package/src/wirings/ai-agent/ai-agent-prepare.ts +0 -636
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +0 -37
- package/src/wirings/ai-agent/ai-agent-registry.ts +0 -82
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +0 -319
- package/src/wirings/ai-agent/ai-agent-runner.ts +0 -773
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +0 -859
- package/src/wirings/ai-agent/ai-agent-stream.ts +0 -1153
- package/src/wirings/ai-agent/ai-agent.types.ts +0 -382
- package/src/wirings/ai-agent/index.ts +0 -37
- package/src/wirings/channel/channel-common.ts +0 -90
- package/src/wirings/channel/channel-handler.ts +0 -250
- package/src/wirings/channel/channel-middleware-runner.ts +0 -120
- package/src/wirings/channel/channel-runner.ts +0 -166
- package/src/wirings/channel/channel-store.ts +0 -29
- package/src/wirings/channel/channel.types.ts +0 -172
- package/src/wirings/channel/define-channel-routes.ts +0 -25
- package/src/wirings/channel/eventhub-service.ts +0 -34
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -24
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -81
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -215
- package/src/wirings/channel/local/local-channel-runner.ts +0 -210
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -95
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -101
- package/src/wirings/channel/log-channels.ts +0 -20
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -54
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -45
- package/src/wirings/channel/serverless/index.ts +0 -5
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -289
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -136
- package/src/wirings/cli/channel/index.ts +0 -1
- package/src/wirings/cli/cli-runner.test.ts +0 -403
- package/src/wirings/cli/cli-runner.ts +0 -529
- package/src/wirings/cli/cli.types.ts +0 -358
- package/src/wirings/cli/command-parser.test.ts +0 -445
- package/src/wirings/cli/command-parser.ts +0 -504
- package/src/wirings/cli/define-cli-commands.ts +0 -24
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/gateway/gateway-runner.test.ts +0 -474
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -149
- package/src/wirings/gateway/index.ts +0 -13
- package/src/wirings/http/http-routes.test.ts +0 -322
- package/src/wirings/http/http-routes.ts +0 -197
- package/src/wirings/http/http-runner.test.ts +0 -144
- package/src/wirings/http/http-runner.ts +0 -588
- package/src/wirings/http/http.types.ts +0 -369
- package/src/wirings/http/index.ts +0 -28
- package/src/wirings/http/log-http-routes.ts +0 -22
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -237
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -170
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -82
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -147
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -319
- package/src/wirings/http/routers/path-to-regex.ts +0 -126
- package/src/wirings/http/web-request.test.ts +0 -236
- package/src/wirings/http/web-request.ts +0 -104
- package/src/wirings/mcp/index.ts +0 -27
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -389
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.ts +0 -323
- package/src/wirings/mcp/mcp.types.ts +0 -216
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -3
- package/src/wirings/oauth2/oauth2-client.test.ts +0 -929
- package/src/wirings/oauth2/oauth2-client.ts +0 -335
- package/src/wirings/oauth2/oauth2.types.ts +0 -69
- package/src/wirings/oauth2/wire-oauth2-credential.ts +0 -23
- package/src/wirings/queue/index.ts +0 -31
- package/src/wirings/queue/queue-runner.test.ts +0 -710
- package/src/wirings/queue/queue-runner.ts +0 -192
- package/src/wirings/queue/queue.types.ts +0 -189
- package/src/wirings/queue/register-queue-helper.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -116
- package/src/wirings/rpc/index.ts +0 -4
- package/src/wirings/rpc/rpc-runner.ts +0 -460
- package/src/wirings/rpc/rpc-types.ts +0 -56
- package/src/wirings/rpc/wire-addon.ts +0 -21
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -20
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -660
- package/src/wirings/scheduler/scheduler-runner.ts +0 -133
- package/src/wirings/scheduler/scheduler.types.ts +0 -53
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -32
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -140
- package/src/wirings/secret/validate-secret-definitions.ts +0 -82
- package/src/wirings/trigger/index.ts +0 -10
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -112
- package/src/wirings/trigger/trigger-runner.test.ts +0 -79
- package/src/wirings/trigger/trigger-runner.ts +0 -135
- package/src/wirings/trigger/trigger.types.ts +0 -178
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -91
- package/src/wirings/variable/validate-variable-definitions.ts +0 -69
- package/src/wirings/variable/variable.types.ts +0 -22
- package/src/wirings/workflow/dsl/index.ts +0 -31
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -320
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -28
- package/src/wirings/workflow/graph/graph-node.ts +0 -222
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -487
- package/src/wirings/workflow/graph/graph-runner.ts +0 -816
- package/src/wirings/workflow/graph/graph-validation.test.ts +0 -170
- package/src/wirings/workflow/graph/graph-validation.ts +0 -237
- package/src/wirings/workflow/graph/index.ts +0 -19
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -29
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -104
- package/src/wirings/workflow/index.ts +0 -82
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -200
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1176
- package/src/wirings/workflow/workflow-helpers.test.ts +0 -129
- package/src/wirings/workflow/workflow-helpers.ts +0 -79
- package/src/wirings/workflow/workflow.types.ts +0 -274
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,536 +0,0 @@
|
|
|
1
|
-
import { describe, test, beforeEach } from 'node:test'
|
|
2
|
-
import * as assert from 'node:assert'
|
|
3
|
-
import { addFunction, runPikkuFunc } from './function-runner.js'
|
|
4
|
-
import { addMiddleware, addPermission } from '../index.js'
|
|
5
|
-
import { resetPikkuState, pikkuState } from '../pikku-state.js'
|
|
6
|
-
import type { CoreServices, CorePikkuMiddleware } from '../types/core.types.js'
|
|
7
|
-
import type { CorePermissionGroup } from './functions.types.js'
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
resetPikkuState()
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
// Helper function to add function with metadata for tests
|
|
14
|
-
const addTestFunction = (funcName: string, funcConfig: any) => {
|
|
15
|
-
addFunction(funcName, funcConfig)
|
|
16
|
-
// Convert tags to middleware metadata
|
|
17
|
-
const middleware = funcConfig.tags
|
|
18
|
-
? funcConfig.tags.map((tag: string) => ({ type: 'tag' as const, tag }))
|
|
19
|
-
: undefined
|
|
20
|
-
// Convert tags to permissions metadata
|
|
21
|
-
const permissions = funcConfig.tags
|
|
22
|
-
? funcConfig.tags.map((tag: string) => ({ type: 'tag' as const, tag }))
|
|
23
|
-
: undefined
|
|
24
|
-
pikkuState(null, 'function', 'meta')[funcName] = {
|
|
25
|
-
pikkuFuncId: funcName,
|
|
26
|
-
inputSchemaName: null,
|
|
27
|
-
outputSchemaName: null,
|
|
28
|
-
middleware,
|
|
29
|
-
permissions,
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const mockSingletonServices = {
|
|
34
|
-
logger: {
|
|
35
|
-
info: () => {},
|
|
36
|
-
warn: () => {},
|
|
37
|
-
error: () => {},
|
|
38
|
-
debug: () => {},
|
|
39
|
-
},
|
|
40
|
-
} as any
|
|
41
|
-
|
|
42
|
-
const mockServices: CoreServices = {
|
|
43
|
-
...mockSingletonServices,
|
|
44
|
-
} as any
|
|
45
|
-
|
|
46
|
-
describe('runPikkuFunc - Integration Tests', () => {
|
|
47
|
-
test('should execute middleware in correct order: wiringTags → wiringMiddleware → funcTags → funcMiddleware', async () => {
|
|
48
|
-
const executionOrder: string[] = []
|
|
49
|
-
const createMiddleware = (name: string): CorePikkuMiddleware => {
|
|
50
|
-
return async (services, wire, next) => {
|
|
51
|
-
executionOrder.push(name)
|
|
52
|
-
await next()
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
addMiddleware('wiringTag', [createMiddleware('wiringTag')])
|
|
57
|
-
addMiddleware('funcTag', [createMiddleware('funcTag')])
|
|
58
|
-
|
|
59
|
-
// Register function with middleware and tags
|
|
60
|
-
addTestFunction('testFunc', {
|
|
61
|
-
func: async () => {
|
|
62
|
-
executionOrder.push('main')
|
|
63
|
-
return 'success'
|
|
64
|
-
},
|
|
65
|
-
middleware: [createMiddleware('funcMiddleware')],
|
|
66
|
-
tags: ['funcTag'],
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
const result = await runPikkuFunc(
|
|
70
|
-
'rpc',
|
|
71
|
-
Math.random().toString(),
|
|
72
|
-
'testFunc',
|
|
73
|
-
{
|
|
74
|
-
singletonServices: mockSingletonServices,
|
|
75
|
-
getAllServices: () => mockServices,
|
|
76
|
-
data: () => ({}),
|
|
77
|
-
wireMiddleware: [createMiddleware('wiringMiddleware')],
|
|
78
|
-
inheritedMiddleware: [{ type: 'tag', tag: 'wiringTag' }],
|
|
79
|
-
auth: false,
|
|
80
|
-
wire: {},
|
|
81
|
-
}
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
assert.equal(result, 'success')
|
|
85
|
-
// Order: wireInheritedMiddleware (tags), wireMiddleware, funcInheritedMiddleware (tags), funcMiddleware
|
|
86
|
-
assert.deepEqual(executionOrder, [
|
|
87
|
-
'wiringTag',
|
|
88
|
-
'wiringMiddleware',
|
|
89
|
-
'funcTag',
|
|
90
|
-
'funcMiddleware',
|
|
91
|
-
'main',
|
|
92
|
-
])
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
test('should execute permissions in correct order: wiringTags → wiringPermissions → funcTags → funcPermissions', async () => {
|
|
96
|
-
const executionOrder: string[] = []
|
|
97
|
-
|
|
98
|
-
// Setup tagged permissions
|
|
99
|
-
const wiringTagPermission = async () => {
|
|
100
|
-
executionOrder.push('wiringTag')
|
|
101
|
-
return true
|
|
102
|
-
}
|
|
103
|
-
const funcTagPermission = async () => {
|
|
104
|
-
executionOrder.push('funcTag')
|
|
105
|
-
return true
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
addPermission('wiringTag', [wiringTagPermission])
|
|
109
|
-
addPermission('funcTag', [funcTagPermission])
|
|
110
|
-
|
|
111
|
-
// Setup direct permissions
|
|
112
|
-
const wiringPermissions: CorePermissionGroup = {
|
|
113
|
-
permissions: [
|
|
114
|
-
async () => {
|
|
115
|
-
executionOrder.push('wiringPermission')
|
|
116
|
-
return true
|
|
117
|
-
},
|
|
118
|
-
],
|
|
119
|
-
}
|
|
120
|
-
const funcPermissions: CorePermissionGroup = {
|
|
121
|
-
permissions: [
|
|
122
|
-
async () => {
|
|
123
|
-
executionOrder.push('funcPermission')
|
|
124
|
-
return true
|
|
125
|
-
},
|
|
126
|
-
],
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Register function with permissions and tags
|
|
130
|
-
addTestFunction('testFunc', {
|
|
131
|
-
func: async () => {
|
|
132
|
-
executionOrder.push('main')
|
|
133
|
-
return 'success'
|
|
134
|
-
},
|
|
135
|
-
permissions: funcPermissions,
|
|
136
|
-
tags: ['funcTag'],
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
const result = await runPikkuFunc(
|
|
140
|
-
'rpc',
|
|
141
|
-
Math.random().toString(),
|
|
142
|
-
'testFunc',
|
|
143
|
-
{
|
|
144
|
-
singletonServices: mockSingletonServices,
|
|
145
|
-
getAllServices: () => mockServices,
|
|
146
|
-
data: () => ({}),
|
|
147
|
-
wirePermissions: wiringPermissions,
|
|
148
|
-
tags: ['wiringTag'],
|
|
149
|
-
auth: false,
|
|
150
|
-
wire: {},
|
|
151
|
-
}
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
assert.equal(result, 'success')
|
|
155
|
-
// Order: wiringTags → main (short-circuit on first passing group)
|
|
156
|
-
assert.deepEqual(executionOrder, ['wiringTag', 'main'])
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
test('should throw specific error for wiring tag permission failures', async () => {
|
|
160
|
-
const failingWiringTagPermission = async () => false
|
|
161
|
-
|
|
162
|
-
addPermission('wiringTag', [failingWiringTagPermission])
|
|
163
|
-
|
|
164
|
-
addTestFunction('testFunc', {
|
|
165
|
-
func: async () => 'success',
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
await assert.rejects(
|
|
169
|
-
runPikkuFunc('rpc', Math.random().toString(), 'testFunc', {
|
|
170
|
-
singletonServices: mockSingletonServices,
|
|
171
|
-
getAllServices: () => mockServices,
|
|
172
|
-
data: () => ({}),
|
|
173
|
-
tags: ['wiringTag'],
|
|
174
|
-
auth: false,
|
|
175
|
-
wire: {},
|
|
176
|
-
}),
|
|
177
|
-
{
|
|
178
|
-
message: 'Permission denied',
|
|
179
|
-
}
|
|
180
|
-
)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
test('should throw specific error for wiring permission failures', async () => {
|
|
184
|
-
const wiringPermissions: CorePermissionGroup = {
|
|
185
|
-
permissions: [async () => false],
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
addTestFunction('testFunc', {
|
|
189
|
-
func: async () => 'success',
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
await assert.rejects(
|
|
193
|
-
runPikkuFunc('rpc', Math.random().toString(), 'testFunc', {
|
|
194
|
-
singletonServices: mockSingletonServices,
|
|
195
|
-
getAllServices: () => mockServices,
|
|
196
|
-
data: () => ({}),
|
|
197
|
-
wirePermissions: wiringPermissions,
|
|
198
|
-
auth: false,
|
|
199
|
-
wire: {},
|
|
200
|
-
}),
|
|
201
|
-
{
|
|
202
|
-
message: 'Permission denied',
|
|
203
|
-
}
|
|
204
|
-
)
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
test('should throw specific error for function tag permission failures', async () => {
|
|
208
|
-
const failingFuncTagPermission = async () => false
|
|
209
|
-
|
|
210
|
-
addPermission('funcTag', [failingFuncTagPermission])
|
|
211
|
-
|
|
212
|
-
addTestFunction('testFunc', {
|
|
213
|
-
func: async () => 'success',
|
|
214
|
-
tags: ['funcTag'],
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
await assert.rejects(
|
|
218
|
-
runPikkuFunc('rpc', Math.random().toString(), 'testFunc', {
|
|
219
|
-
singletonServices: mockSingletonServices,
|
|
220
|
-
getAllServices: () => mockServices,
|
|
221
|
-
data: () => ({}),
|
|
222
|
-
auth: false,
|
|
223
|
-
wire: {},
|
|
224
|
-
}),
|
|
225
|
-
{
|
|
226
|
-
message: 'Permission denied',
|
|
227
|
-
}
|
|
228
|
-
)
|
|
229
|
-
})
|
|
230
|
-
|
|
231
|
-
test('should throw specific error for function permission failures', async () => {
|
|
232
|
-
const funcPermissions: CorePermissionGroup = {
|
|
233
|
-
permissions: [async () => false],
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
addTestFunction('testFunc', {
|
|
237
|
-
func: async () => 'success',
|
|
238
|
-
permissions: funcPermissions,
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
await assert.rejects(
|
|
242
|
-
runPikkuFunc('rpc', Math.random().toString(), 'testFunc', {
|
|
243
|
-
singletonServices: mockSingletonServices,
|
|
244
|
-
getAllServices: () => mockServices,
|
|
245
|
-
data: () => ({}),
|
|
246
|
-
auth: false,
|
|
247
|
-
wire: {},
|
|
248
|
-
}),
|
|
249
|
-
{
|
|
250
|
-
message: 'Permission denied',
|
|
251
|
-
}
|
|
252
|
-
)
|
|
253
|
-
})
|
|
254
|
-
|
|
255
|
-
test('should deduplicate middleware when same middleware appears in tags and direct', async () => {
|
|
256
|
-
let executionCount = 0
|
|
257
|
-
|
|
258
|
-
const duplicatedMiddleware: CorePikkuMiddleware = async (
|
|
259
|
-
services,
|
|
260
|
-
wire,
|
|
261
|
-
next
|
|
262
|
-
) => {
|
|
263
|
-
executionCount++
|
|
264
|
-
await next()
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Add same middleware to tag and directly
|
|
268
|
-
addMiddleware('testTag', [duplicatedMiddleware])
|
|
269
|
-
|
|
270
|
-
addTestFunction('testFunc', {
|
|
271
|
-
func: async () => 'success',
|
|
272
|
-
middleware: [duplicatedMiddleware], // Same middleware directly
|
|
273
|
-
tags: ['testTag'], // Same middleware via tag
|
|
274
|
-
})
|
|
275
|
-
|
|
276
|
-
await runPikkuFunc('rpc', Math.random().toString(), 'testFunc', {
|
|
277
|
-
singletonServices: mockSingletonServices,
|
|
278
|
-
getAllServices: () => mockServices,
|
|
279
|
-
data: () => ({}),
|
|
280
|
-
auth: false,
|
|
281
|
-
wire: {},
|
|
282
|
-
})
|
|
283
|
-
|
|
284
|
-
// Should only execute once due to deduplication
|
|
285
|
-
assert.equal(executionCount, 1)
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
test('should handle mixed permission types correctly', async () => {
|
|
289
|
-
const executionOrder: string[] = []
|
|
290
|
-
|
|
291
|
-
// Mix of array and object permissions
|
|
292
|
-
const arrayPermission = [
|
|
293
|
-
async () => {
|
|
294
|
-
executionOrder.push('arrayPermission1')
|
|
295
|
-
return false
|
|
296
|
-
},
|
|
297
|
-
async () => {
|
|
298
|
-
executionOrder.push('arrayPermission2')
|
|
299
|
-
return true
|
|
300
|
-
},
|
|
301
|
-
]
|
|
302
|
-
|
|
303
|
-
const objectPermission: CorePermissionGroup = {
|
|
304
|
-
permissions: [
|
|
305
|
-
async () => {
|
|
306
|
-
executionOrder.push('objectPermission')
|
|
307
|
-
return true
|
|
308
|
-
},
|
|
309
|
-
],
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
addPermission('mixedTag', arrayPermission)
|
|
313
|
-
|
|
314
|
-
addTestFunction('testFunc', {
|
|
315
|
-
func: async () => {
|
|
316
|
-
executionOrder.push('main')
|
|
317
|
-
return 'success'
|
|
318
|
-
},
|
|
319
|
-
permissions: objectPermission,
|
|
320
|
-
tags: ['mixedTag'],
|
|
321
|
-
})
|
|
322
|
-
|
|
323
|
-
const result = await runPikkuFunc(
|
|
324
|
-
'rpc',
|
|
325
|
-
Math.random().toString(),
|
|
326
|
-
'testFunc',
|
|
327
|
-
{
|
|
328
|
-
singletonServices: mockSingletonServices,
|
|
329
|
-
getAllServices: () => mockServices,
|
|
330
|
-
data: () => ({}),
|
|
331
|
-
auth: false,
|
|
332
|
-
wire: {},
|
|
333
|
-
}
|
|
334
|
-
)
|
|
335
|
-
|
|
336
|
-
assert.equal(result, 'success')
|
|
337
|
-
// Should execute tag permissions and short-circuit before function permissions
|
|
338
|
-
assert.deepEqual(executionOrder, [
|
|
339
|
-
'arrayPermission1',
|
|
340
|
-
'arrayPermission2',
|
|
341
|
-
'main',
|
|
342
|
-
])
|
|
343
|
-
})
|
|
344
|
-
|
|
345
|
-
test('should work without any middleware or permissions', async () => {
|
|
346
|
-
addTestFunction('simpleFunc', {
|
|
347
|
-
func: async () => 'simple success',
|
|
348
|
-
})
|
|
349
|
-
|
|
350
|
-
const result = await runPikkuFunc(
|
|
351
|
-
'rpc',
|
|
352
|
-
Math.random().toString(),
|
|
353
|
-
'simpleFunc',
|
|
354
|
-
{
|
|
355
|
-
singletonServices: mockSingletonServices,
|
|
356
|
-
getAllServices: () => mockServices,
|
|
357
|
-
data: () => ({}),
|
|
358
|
-
auth: false,
|
|
359
|
-
wire: {},
|
|
360
|
-
}
|
|
361
|
-
)
|
|
362
|
-
|
|
363
|
-
assert.equal(result, 'simple success')
|
|
364
|
-
})
|
|
365
|
-
|
|
366
|
-
test('should work with only wiring-level middleware and permissions', async () => {
|
|
367
|
-
const executionOrder: string[] = []
|
|
368
|
-
|
|
369
|
-
const wiringMiddleware: CorePikkuMiddleware = async (
|
|
370
|
-
services,
|
|
371
|
-
wire,
|
|
372
|
-
next
|
|
373
|
-
) => {
|
|
374
|
-
executionOrder.push('wiringMiddleware')
|
|
375
|
-
await next()
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
const wiringPermissions: CorePermissionGroup = {
|
|
379
|
-
permissions: [
|
|
380
|
-
async () => {
|
|
381
|
-
executionOrder.push('wiringPermission')
|
|
382
|
-
return true
|
|
383
|
-
},
|
|
384
|
-
],
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
addTestFunction('testFunc', {
|
|
388
|
-
func: async () => {
|
|
389
|
-
executionOrder.push('main')
|
|
390
|
-
return 'success'
|
|
391
|
-
},
|
|
392
|
-
})
|
|
393
|
-
|
|
394
|
-
const result = await runPikkuFunc(
|
|
395
|
-
'rpc',
|
|
396
|
-
Math.random().toString(),
|
|
397
|
-
'testFunc',
|
|
398
|
-
{
|
|
399
|
-
singletonServices: mockSingletonServices,
|
|
400
|
-
getAllServices: () => mockServices,
|
|
401
|
-
data: () => ({}),
|
|
402
|
-
wireMiddleware: [wiringMiddleware],
|
|
403
|
-
wirePermissions: wiringPermissions,
|
|
404
|
-
auth: false,
|
|
405
|
-
wire: {},
|
|
406
|
-
}
|
|
407
|
-
)
|
|
408
|
-
|
|
409
|
-
assert.equal(result, 'success')
|
|
410
|
-
// Permissions run after middleware (middleware can set/modify session)
|
|
411
|
-
assert.deepEqual(executionOrder, [
|
|
412
|
-
'wiringMiddleware',
|
|
413
|
-
'wiringPermission',
|
|
414
|
-
'main',
|
|
415
|
-
])
|
|
416
|
-
})
|
|
417
|
-
|
|
418
|
-
test('should work with only function-level middleware and permissions', async () => {
|
|
419
|
-
const executionOrder: string[] = []
|
|
420
|
-
|
|
421
|
-
const funcMiddleware: CorePikkuMiddleware = async (
|
|
422
|
-
services,
|
|
423
|
-
wire,
|
|
424
|
-
next
|
|
425
|
-
) => {
|
|
426
|
-
executionOrder.push('funcMiddleware')
|
|
427
|
-
await next()
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
const funcPermissions: CorePermissionGroup = {
|
|
431
|
-
permissions: [
|
|
432
|
-
async () => {
|
|
433
|
-
executionOrder.push('funcPermission')
|
|
434
|
-
return true
|
|
435
|
-
},
|
|
436
|
-
],
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
addTestFunction('testFunc', {
|
|
440
|
-
func: async () => {
|
|
441
|
-
executionOrder.push('main')
|
|
442
|
-
return 'success'
|
|
443
|
-
},
|
|
444
|
-
middleware: [funcMiddleware],
|
|
445
|
-
permissions: funcPermissions,
|
|
446
|
-
})
|
|
447
|
-
|
|
448
|
-
const result = await runPikkuFunc(
|
|
449
|
-
'rpc',
|
|
450
|
-
Math.random().toString(),
|
|
451
|
-
'testFunc',
|
|
452
|
-
{
|
|
453
|
-
singletonServices: mockSingletonServices,
|
|
454
|
-
getAllServices: () => mockServices,
|
|
455
|
-
data: () => ({}),
|
|
456
|
-
auth: false,
|
|
457
|
-
wire: {},
|
|
458
|
-
}
|
|
459
|
-
)
|
|
460
|
-
|
|
461
|
-
assert.equal(result, 'success')
|
|
462
|
-
// Permissions run after middleware (middleware can set/modify session)
|
|
463
|
-
assert.deepEqual(executionOrder, [
|
|
464
|
-
'funcMiddleware',
|
|
465
|
-
'funcPermission',
|
|
466
|
-
'main',
|
|
467
|
-
])
|
|
468
|
-
})
|
|
469
|
-
|
|
470
|
-
test('should pass correct parameters to function', async () => {
|
|
471
|
-
let receivedServices: any
|
|
472
|
-
let receivedData: any
|
|
473
|
-
let receivedWire: any
|
|
474
|
-
|
|
475
|
-
const testData = { test: 'data' }
|
|
476
|
-
|
|
477
|
-
addTestFunction('testFunc', {
|
|
478
|
-
func: async (services, data, wire) => {
|
|
479
|
-
receivedServices = services
|
|
480
|
-
receivedData = data
|
|
481
|
-
receivedWire = wire
|
|
482
|
-
return 'success'
|
|
483
|
-
},
|
|
484
|
-
})
|
|
485
|
-
|
|
486
|
-
await runPikkuFunc('rpc', Math.random().toString(), 'testFunc', {
|
|
487
|
-
singletonServices: mockServices,
|
|
488
|
-
data: () => testData,
|
|
489
|
-
auth: false,
|
|
490
|
-
wire: { rpc: {} },
|
|
491
|
-
})
|
|
492
|
-
|
|
493
|
-
assert.deepEqual(receivedServices, mockServices)
|
|
494
|
-
assert.equal(receivedData, testData)
|
|
495
|
-
// Check that wire has rpc service and session
|
|
496
|
-
assert.ok(receivedWire.rpc)
|
|
497
|
-
assert.equal(receivedWire.session, undefined)
|
|
498
|
-
})
|
|
499
|
-
|
|
500
|
-
test('should handle async createWireServices function', async () => {
|
|
501
|
-
let servicesProvided: any
|
|
502
|
-
const wireServices = { customService: 'value' }
|
|
503
|
-
|
|
504
|
-
addTestFunction('testFunc', {
|
|
505
|
-
func: async (services, data, wire) => {
|
|
506
|
-
servicesProvided = services
|
|
507
|
-
return 'success'
|
|
508
|
-
},
|
|
509
|
-
})
|
|
510
|
-
|
|
511
|
-
const asyncCreateWireServices = async () => {
|
|
512
|
-
// Simulate async service creation
|
|
513
|
-
await new Promise((resolve) => setTimeout(resolve, 1))
|
|
514
|
-
return wireServices
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
const result = await runPikkuFunc(
|
|
518
|
-
'rpc',
|
|
519
|
-
Math.random().toString(),
|
|
520
|
-
'testFunc',
|
|
521
|
-
{
|
|
522
|
-
singletonServices: mockSingletonServices,
|
|
523
|
-
createWireServices: asyncCreateWireServices,
|
|
524
|
-
data: () => ({}),
|
|
525
|
-
auth: false,
|
|
526
|
-
wire: {},
|
|
527
|
-
}
|
|
528
|
-
)
|
|
529
|
-
|
|
530
|
-
assert.equal(result, 'success')
|
|
531
|
-
assert.deepEqual(servicesProvided, {
|
|
532
|
-
...mockSingletonServices,
|
|
533
|
-
...wireServices,
|
|
534
|
-
})
|
|
535
|
-
})
|
|
536
|
-
})
|