@pikku/core 0.9.11 → 0.10.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 +14 -0
- package/dist/errors/errors.d.ts +2 -0
- package/dist/errors/errors.js +6 -0
- package/dist/function/function-runner.d.ts +15 -9
- package/dist/function/function-runner.js +55 -37
- package/dist/function/functions.types.d.ts +67 -1
- package/dist/function/functions.types.js +43 -1
- package/dist/index.d.ts +2 -6
- package/dist/index.js +2 -6
- package/dist/middleware/auth-apikey.d.ts +19 -11
- package/dist/middleware/auth-apikey.js +33 -33
- package/dist/middleware/auth-bearer.d.ts +34 -7
- package/dist/middleware/auth-bearer.js +53 -36
- package/dist/middleware/auth-cookie.d.ts +30 -12
- package/dist/middleware/auth-cookie.js +51 -43
- package/dist/middleware/timeout.d.ts +6 -2
- package/dist/middleware/timeout.js +7 -9
- package/dist/middleware-runner.d.ts +46 -43
- package/dist/middleware-runner.js +100 -69
- package/dist/permissions.d.ts +82 -20
- package/dist/permissions.js +176 -62
- package/dist/pikku-state.d.ts +46 -1
- package/dist/pikku-state.js +16 -1
- package/dist/services/content-service.d.ts +2 -3
- package/dist/services/index.d.ts +0 -1
- package/dist/services/index.js +0 -1
- package/dist/services/local-content.d.ts +2 -4
- package/dist/types/core.types.d.ts +110 -4
- package/dist/types/core.types.js +44 -1
- package/dist/utils.d.ts +1 -1
- package/dist/wirings/channel/channel-handler.d.ts +2 -2
- package/dist/wirings/channel/channel-handler.js +16 -12
- package/dist/wirings/channel/channel-runner.d.ts +2 -2
- package/dist/wirings/channel/channel-runner.js +6 -24
- package/dist/wirings/channel/channel.types.d.ts +15 -14
- package/dist/wirings/channel/local/local-channel-runner.js +12 -12
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +7 -8
- package/dist/wirings/cli/channel/cli-channel-runner.d.ts +12 -0
- package/dist/wirings/cli/channel/cli-channel-runner.js +83 -0
- package/dist/wirings/cli/channel/index.d.ts +1 -0
- package/dist/wirings/cli/channel/index.js +1 -0
- package/dist/wirings/cli/cli-runner.d.ts +42 -0
- package/dist/wirings/cli/cli-runner.js +352 -0
- package/dist/wirings/cli/cli.types.d.ts +204 -0
- package/dist/wirings/cli/cli.types.js +1 -0
- package/dist/wirings/cli/command-parser.d.ts +19 -0
- package/dist/wirings/cli/command-parser.js +403 -0
- package/dist/wirings/cli/index.d.ts +5 -0
- package/dist/wirings/cli/index.js +5 -0
- package/dist/wirings/http/http-runner.d.ts +59 -10
- package/dist/wirings/http/http-runner.js +138 -131
- package/dist/wirings/http/http.types.d.ts +11 -10
- package/dist/wirings/http/index.d.ts +1 -1
- package/dist/wirings/http/index.js +1 -1
- package/dist/wirings/http/pikku-fetch-http-response.js +3 -1
- package/dist/wirings/http/routers/http-router.d.ts +0 -2
- package/dist/wirings/http/routers/path-to-regex.d.ts +1 -1
- package/dist/wirings/http/routers/path-to-regex.js +5 -34
- package/dist/wirings/mcp/mcp-endpoint-registry.d.ts +1 -1
- package/dist/wirings/mcp/mcp-runner.d.ts +4 -5
- package/dist/wirings/mcp/mcp-runner.js +32 -34
- package/dist/wirings/mcp/mcp.types.d.ts +38 -14
- package/dist/wirings/queue/queue-runner.d.ts +2 -2
- package/dist/wirings/queue/queue-runner.js +25 -27
- package/dist/wirings/queue/queue.types.d.ts +6 -5
- package/dist/wirings/rpc/index.d.ts +1 -1
- package/dist/wirings/rpc/index.js +1 -1
- package/dist/wirings/rpc/rpc-runner.d.ts +6 -18
- package/dist/wirings/rpc/rpc-runner.js +13 -8
- package/dist/wirings/scheduler/scheduler-runner.d.ts +2 -2
- package/dist/wirings/scheduler/scheduler-runner.js +38 -35
- package/dist/wirings/scheduler/scheduler.types.d.ts +5 -4
- package/package.json +9 -7
- package/src/errors/errors.ts +6 -0
- package/src/factory-functions.test.ts +60 -1
- package/src/function/function-runner.test.ts +81 -26
- package/src/function/function-runner.ts +89 -57
- package/src/function/functions.types.ts +85 -2
- package/src/index.ts +6 -19
- package/src/middleware/auth-apikey.ts +42 -57
- package/src/middleware/auth-bearer.ts +66 -49
- package/src/middleware/auth-cookie.ts +63 -82
- package/src/middleware/timeout.ts +10 -14
- package/src/middleware-runner.test.ts +24 -16
- package/src/middleware-runner.ts +115 -87
- package/src/permissions.test.ts +26 -27
- package/src/permissions.ts +216 -104
- package/src/pikku-state.ts +79 -2
- package/src/services/content-service.ts +5 -4
- package/src/services/index.ts +0 -1
- package/src/services/local-content.ts +9 -4
- package/src/types/core.types.ts +143 -5
- package/src/utils.ts +1 -1
- package/src/wirings/channel/channel-handler.ts +18 -21
- package/src/wirings/channel/channel-runner.ts +19 -32
- package/src/wirings/channel/channel.types.ts +29 -16
- package/src/wirings/channel/local/local-channel-runner.ts +25 -15
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +15 -17
- package/src/wirings/cli/channel/cli-channel-runner.ts +123 -0
- package/src/wirings/cli/channel/index.ts +1 -0
- package/src/wirings/cli/cli-runner.test.ts +403 -0
- package/src/wirings/cli/cli-runner.ts +539 -0
- package/src/wirings/cli/cli.types.ts +350 -0
- package/src/wirings/cli/command-parser.test.ts +445 -0
- package/src/wirings/cli/command-parser.ts +504 -0
- package/src/wirings/cli/index.ts +13 -0
- package/src/wirings/http/http-runner.test.ts +8 -7
- package/src/wirings/http/http-runner.ts +165 -158
- package/src/wirings/http/http.types.ts +58 -11
- package/src/wirings/http/index.ts +7 -1
- package/src/wirings/http/pikku-fetch-http-response.ts +3 -1
- package/src/wirings/http/routers/http-router.ts +0 -2
- package/src/wirings/http/routers/path-to-regex.test.ts +4 -5
- package/src/wirings/http/routers/path-to-regex.ts +6 -43
- package/src/wirings/mcp/mcp-endpoint-registry.ts +1 -1
- package/src/wirings/mcp/mcp-runner.ts +58 -55
- package/src/wirings/mcp/mcp.types.ts +65 -14
- package/src/wirings/queue/queue-runner.ts +44 -47
- package/src/wirings/queue/queue.types.ts +10 -6
- package/src/wirings/rpc/index.ts +1 -1
- package/src/wirings/rpc/rpc-runner.ts +27 -9
- package/src/wirings/scheduler/scheduler-runner.ts +58 -56
- package/src/wirings/scheduler/scheduler.types.ts +10 -3
- package/tsconfig.tsbuildinfo +1 -1
package/src/middleware-runner.ts
CHANGED
|
@@ -3,7 +3,9 @@ import {
|
|
|
3
3
|
CoreSingletonServices,
|
|
4
4
|
PikkuInteraction,
|
|
5
5
|
CorePikkuMiddleware,
|
|
6
|
+
CorePikkuMiddlewareGroup,
|
|
6
7
|
PikkuWiringTypes,
|
|
8
|
+
MiddlewareMetadata,
|
|
7
9
|
} from './types/core.types.js'
|
|
8
10
|
import { pikkuState } from './pikku-state.js'
|
|
9
11
|
import { freezeDedupe } from './utils.js'
|
|
@@ -49,79 +51,64 @@ export const runMiddleware = async <Middleware extends CorePikkuMiddleware>(
|
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
/**
|
|
52
|
-
*
|
|
54
|
+
* Registers global middleware for a specific tag.
|
|
53
55
|
*
|
|
54
|
-
* This function
|
|
55
|
-
* any wiring (HTTP, Channel, Queue, Scheduler, MCP) that includes the matching tag.
|
|
56
|
+
* This function registers middleware at runtime that will be applied to
|
|
57
|
+
* any wiring (HTTP, Channel, Queue, Scheduler, MCP, CLI) that includes the matching tag.
|
|
58
|
+
*
|
|
59
|
+
* For tree-shaking benefits, wrap in a factory function:
|
|
60
|
+
* `export const x = () => addMiddleware('tag', [...])`
|
|
61
|
+
*
|
|
62
|
+
* Accepts an array that can contain:
|
|
63
|
+
* - Direct middleware functions (CorePikkuMiddleware)
|
|
64
|
+
* - Factory middleware functions (CorePikkuMiddlewareFactory)
|
|
56
65
|
*
|
|
57
66
|
* @template PikkuMiddleware The middleware type.
|
|
58
67
|
* @param {string} tag - The tag that the middleware should apply to.
|
|
59
|
-
* @param {
|
|
68
|
+
* @param {CorePikkuMiddlewareGroup} middleware - Array of middleware for this tag.
|
|
60
69
|
*
|
|
61
|
-
* @
|
|
70
|
+
* @returns {CorePikkuMiddlewareGroup} The middleware array (for chaining/wrapping).
|
|
62
71
|
*
|
|
63
72
|
* @example
|
|
64
73
|
* ```typescript
|
|
65
|
-
* //
|
|
66
|
-
* addMiddleware('admin', [
|
|
74
|
+
* // Recommended: tree-shakeable
|
|
75
|
+
* export const adminMiddleware = () => addMiddleware('admin', [
|
|
76
|
+
* authMiddleware,
|
|
77
|
+
* loggingMiddleware({ level: 'info' })
|
|
78
|
+
* ])
|
|
67
79
|
*
|
|
68
|
-
* //
|
|
69
|
-
* addMiddleware('
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* addMiddleware('api', [loggingMiddleware])
|
|
80
|
+
* // Also works: no tree-shaking
|
|
81
|
+
* export const apiMiddleware = addMiddleware('api', [
|
|
82
|
+
* rateLimitMiddleware
|
|
83
|
+
* ])
|
|
73
84
|
* ```
|
|
74
85
|
*/
|
|
75
86
|
export const addMiddleware = <PikkuMiddleware extends CorePikkuMiddleware>(
|
|
76
87
|
tag: string,
|
|
77
|
-
middleware:
|
|
78
|
-
) => {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (middlewareStore[tag]) {
|
|
83
|
-
throw new Error(
|
|
84
|
-
`Middleware for tag '${tag}' already exists. Use a different tag or remove the existing middleware first.`
|
|
85
|
-
)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
middlewareStore[tag] = middleware as CorePikkuMiddleware[]
|
|
88
|
+
middleware: CorePikkuMiddlewareGroup
|
|
89
|
+
): CorePikkuMiddlewareGroup => {
|
|
90
|
+
const tagGroups = pikkuState('middleware', 'tagGroup')
|
|
91
|
+
tagGroups[tag] = middleware
|
|
92
|
+
return middleware
|
|
89
93
|
}
|
|
90
94
|
|
|
91
95
|
/**
|
|
92
|
-
* Retrieves
|
|
96
|
+
* Retrieves a registered middleware function by its name.
|
|
93
97
|
*
|
|
94
|
-
* This function looks up
|
|
95
|
-
*
|
|
98
|
+
* This function looks up middleware that was registered with registerMiddleware.
|
|
99
|
+
* It's used internally by the framework to resolve middleware references in metadata.
|
|
96
100
|
*
|
|
97
|
-
* @param {string
|
|
98
|
-
* @returns {CorePikkuMiddleware
|
|
101
|
+
* @param {string} name - The unique name (pikkuFuncName) of the middleware function.
|
|
102
|
+
* @returns {CorePikkuMiddleware | undefined} The middleware function, or undefined if not found.
|
|
99
103
|
*
|
|
100
|
-
* @
|
|
101
|
-
* ```typescript
|
|
102
|
-
* // Get all middleware for tags 'api' and 'auth'
|
|
103
|
-
* const middleware = getMiddlewareForTags(['api', 'auth'])
|
|
104
|
-
* ```
|
|
104
|
+
* @internal
|
|
105
105
|
*/
|
|
106
|
-
export const
|
|
107
|
-
|
|
108
|
-
): CorePikkuMiddleware
|
|
109
|
-
if (!tags || tags.length === 0) {
|
|
110
|
-
return []
|
|
111
|
-
}
|
|
112
|
-
|
|
106
|
+
export const getMiddlewareByName = (
|
|
107
|
+
name: string
|
|
108
|
+
): CorePikkuMiddleware | undefined => {
|
|
113
109
|
const middlewareStore = pikkuState('misc', 'middleware')
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
// Collect middleware for all matching tags
|
|
117
|
-
for (const tag of tags) {
|
|
118
|
-
const tagMiddleware = middlewareStore[tag]
|
|
119
|
-
if (tagMiddleware) {
|
|
120
|
-
applicableMiddleware.push(...tagMiddleware)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return applicableMiddleware
|
|
110
|
+
const middleware = middlewareStore[name]
|
|
111
|
+
return middleware?.[0]
|
|
125
112
|
}
|
|
126
113
|
|
|
127
114
|
const middlewareCache: Record<
|
|
@@ -134,28 +121,28 @@ const middlewareCache: Record<
|
|
|
134
121
|
[PikkuWiringTypes.queue]: {},
|
|
135
122
|
[PikkuWiringTypes.scheduler]: {},
|
|
136
123
|
[PikkuWiringTypes.mcp]: {},
|
|
124
|
+
[PikkuWiringTypes.cli]: {},
|
|
137
125
|
}
|
|
138
126
|
|
|
139
127
|
/**
|
|
140
|
-
* Combines
|
|
128
|
+
* Combines wiring-specific middleware with function-level middleware.
|
|
141
129
|
*
|
|
142
|
-
* This
|
|
143
|
-
*
|
|
130
|
+
* This function resolves middleware metadata into actual middleware functions and combines them.
|
|
131
|
+
* It filters out wire middleware without tags from inheritedMiddleware to avoid duplication
|
|
132
|
+
* (those are passed separately as wireMiddleware).
|
|
144
133
|
*
|
|
145
134
|
* @param {object} options - Configuration object for combining middleware.
|
|
146
|
-
* @param {
|
|
147
|
-
* @param {
|
|
148
|
-
* @param {
|
|
149
|
-
* @
|
|
150
|
-
* @returns {CorePikkuMiddleware[]} Combined array of tag-based and wiring-specific middleware.
|
|
135
|
+
* @param {MiddlewareMetadata[] | undefined} options.inheritedMiddleware - Metadata from wiring (HTTP + tags + wire with tags).
|
|
136
|
+
* @param {CorePikkuMiddleware[] | undefined} options.wireMiddleware - Inline wire middleware.
|
|
137
|
+
* @param {MiddlewareMetadata[] | undefined} options.funcMiddleware - Function middleware metadata.
|
|
138
|
+
* @returns {CorePikkuMiddleware[]} Combined array of resolved middleware.
|
|
151
139
|
*
|
|
152
140
|
* @example
|
|
153
141
|
* ```typescript
|
|
154
|
-
* const combined = combineMiddleware({
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* funcMiddleware:
|
|
158
|
-
* funcTags: funcConfig.tags
|
|
142
|
+
* const combined = combineMiddleware(wireType, wireId, {
|
|
143
|
+
* inheritedMiddleware: meta.middleware,
|
|
144
|
+
* wireMiddleware: [inlineMiddleware],
|
|
145
|
+
* funcMiddleware: funcMeta.middleware
|
|
159
146
|
* })
|
|
160
147
|
* ```
|
|
161
148
|
*/
|
|
@@ -163,38 +150,79 @@ export const combineMiddleware = (
|
|
|
163
150
|
wireType: PikkuWiringTypes,
|
|
164
151
|
uid: string,
|
|
165
152
|
{
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
153
|
+
wireInheritedMiddleware,
|
|
154
|
+
wireMiddleware,
|
|
155
|
+
funcInheritedMiddleware,
|
|
169
156
|
funcMiddleware,
|
|
170
|
-
funcTags,
|
|
171
157
|
}: {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
158
|
+
wireInheritedMiddleware?: MiddlewareMetadata[]
|
|
159
|
+
wireMiddleware?: CorePikkuMiddleware[]
|
|
160
|
+
funcInheritedMiddleware?: MiddlewareMetadata[]
|
|
175
161
|
funcMiddleware?: CorePikkuMiddleware[]
|
|
176
|
-
funcTags?: string[]
|
|
177
162
|
} = {}
|
|
178
163
|
): readonly CorePikkuMiddleware[] => {
|
|
179
164
|
if (middlewareCache[wireType][uid]) {
|
|
180
165
|
return middlewareCache[wireType][uid]
|
|
181
166
|
}
|
|
182
167
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
//
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
168
|
+
const resolved: CorePikkuMiddleware[] = []
|
|
169
|
+
|
|
170
|
+
// 1. Resolve wire inherited middleware (HTTP + tag groups + individual wire middleware)
|
|
171
|
+
if (wireInheritedMiddleware) {
|
|
172
|
+
for (const meta of wireInheritedMiddleware) {
|
|
173
|
+
if (meta.type === 'http') {
|
|
174
|
+
// Look up HTTP middleware group from pikkuState
|
|
175
|
+
const group = pikkuState('middleware', 'httpGroup')[meta.route]
|
|
176
|
+
if (group) {
|
|
177
|
+
// At runtime, all factories should be resolved to middleware
|
|
178
|
+
resolved.push(...(group as CorePikkuMiddleware[]))
|
|
179
|
+
}
|
|
180
|
+
} else if (meta.type === 'tag') {
|
|
181
|
+
// Look up tag middleware group from pikkuState
|
|
182
|
+
const group = pikkuState('middleware', 'tagGroup')[meta.tag]
|
|
183
|
+
if (group) {
|
|
184
|
+
// At runtime, all factories should be resolved to middleware
|
|
185
|
+
resolved.push(...(group as CorePikkuMiddleware[]))
|
|
186
|
+
}
|
|
187
|
+
} else if (meta.type === 'wire') {
|
|
188
|
+
// Individual wire middleware (exported, not inline)
|
|
189
|
+
const middleware = getMiddlewareByName(meta.name)
|
|
190
|
+
if (middleware) {
|
|
191
|
+
resolved.push(middleware)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 2. Add inline wire middleware
|
|
198
|
+
if (wireMiddleware) {
|
|
199
|
+
resolved.push(...wireMiddleware)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// 3. Resolve function inherited middleware (only tags, wire middleware already handled)
|
|
203
|
+
if (funcInheritedMiddleware) {
|
|
204
|
+
for (const meta of funcInheritedMiddleware) {
|
|
205
|
+
if (meta.type === 'tag') {
|
|
206
|
+
// Look up tag middleware group from pikkuState
|
|
207
|
+
const group = pikkuState('middleware', 'tagGroup')[meta.tag]
|
|
208
|
+
if (group) {
|
|
209
|
+
// At runtime, all factories should be resolved to middleware
|
|
210
|
+
resolved.push(...(group as CorePikkuMiddleware[]))
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Note: wire middleware is already handled in wireInheritedMiddleware
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// 4. Add inline function middleware
|
|
218
|
+
if (funcMiddleware) {
|
|
219
|
+
resolved.push(...funcMiddleware)
|
|
220
|
+
}
|
|
190
221
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
...(funcMiddleware || []),
|
|
196
|
-
...funcTaggedMiddleware,
|
|
197
|
-
]) as readonly CorePikkuMiddleware[]
|
|
222
|
+
// Deduplicate and freeze
|
|
223
|
+
middlewareCache[wireType][uid] = freezeDedupe(
|
|
224
|
+
resolved
|
|
225
|
+
) as readonly CorePikkuMiddleware[]
|
|
198
226
|
|
|
199
227
|
return middlewareCache[wireType][uid]
|
|
200
228
|
}
|
package/src/permissions.test.ts
CHANGED
|
@@ -181,7 +181,7 @@ describe('runPermissions', () => {
|
|
|
181
181
|
addPermission('wiringTag', [wiringTagPermission])
|
|
182
182
|
|
|
183
183
|
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
184
|
-
|
|
184
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'wiringTag' }],
|
|
185
185
|
allServices: mockServices,
|
|
186
186
|
data: {},
|
|
187
187
|
session: mockSession,
|
|
@@ -205,7 +205,7 @@ describe('runPermissions', () => {
|
|
|
205
205
|
addPermission('wiringTag', [wiringTagPermission])
|
|
206
206
|
addPermission('funcTag', [funcTagPermission])
|
|
207
207
|
|
|
208
|
-
const
|
|
208
|
+
const wirePermissions: CorePermissionGroup = {
|
|
209
209
|
permissions: [
|
|
210
210
|
async () => {
|
|
211
211
|
executionOrder.push('wiringPermission')
|
|
@@ -224,16 +224,16 @@ describe('runPermissions', () => {
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
227
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'wiringTag' }],
|
|
228
|
+
wirePermissions,
|
|
229
|
+
funcInheritedPermissions: [{ type: 'tag', tag: 'funcTag' }],
|
|
230
230
|
funcPermissions,
|
|
231
231
|
allServices: mockServices,
|
|
232
232
|
data: {},
|
|
233
233
|
session: mockSession,
|
|
234
234
|
})
|
|
235
235
|
|
|
236
|
-
// Order:
|
|
236
|
+
// Order: wireInheritedPermissions (wiringTag) → wirePermissions → funcInheritedPermissions (funcTag) → funcPermissions
|
|
237
237
|
assert.deepEqual(executionOrder, [
|
|
238
238
|
'wiringTag',
|
|
239
239
|
'wiringPermission',
|
|
@@ -250,7 +250,7 @@ describe('runPermissions', () => {
|
|
|
250
250
|
|
|
251
251
|
// Should not throw because at least one permission passes
|
|
252
252
|
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
253
|
-
|
|
253
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'atLeastOneTestTag' }],
|
|
254
254
|
allServices: mockServices,
|
|
255
255
|
data: {},
|
|
256
256
|
session: mockSession,
|
|
@@ -265,7 +265,7 @@ describe('runPermissions', () => {
|
|
|
265
265
|
|
|
266
266
|
await assert.rejects(
|
|
267
267
|
runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
268
|
-
|
|
268
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'allFailTestTag' }],
|
|
269
269
|
allServices: mockServices,
|
|
270
270
|
data: {},
|
|
271
271
|
session: mockSession,
|
|
@@ -277,13 +277,13 @@ describe('runPermissions', () => {
|
|
|
277
277
|
})
|
|
278
278
|
|
|
279
279
|
test('should throw error when wiring permissions fail', async () => {
|
|
280
|
-
const
|
|
280
|
+
const wirePermissions: CorePermissionGroup = {
|
|
281
281
|
permissions: [async () => false],
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
await assert.rejects(
|
|
285
285
|
runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
286
|
-
|
|
286
|
+
wirePermissions,
|
|
287
287
|
allServices: mockServices,
|
|
288
288
|
data: {},
|
|
289
289
|
session: mockSession,
|
|
@@ -301,7 +301,7 @@ describe('runPermissions', () => {
|
|
|
301
301
|
|
|
302
302
|
await assert.rejects(
|
|
303
303
|
runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
304
|
-
|
|
304
|
+
funcInheritedPermissions: [{ type: 'tag', tag: 'funcTag' }],
|
|
305
305
|
allServices: mockServices,
|
|
306
306
|
data: {},
|
|
307
307
|
session: mockSession,
|
|
@@ -330,7 +330,7 @@ describe('runPermissions', () => {
|
|
|
330
330
|
)
|
|
331
331
|
})
|
|
332
332
|
|
|
333
|
-
test('should
|
|
333
|
+
test('should evaluate all permissions and pass if at least one succeeds', async () => {
|
|
334
334
|
const executionOrder: string[] = []
|
|
335
335
|
|
|
336
336
|
const failingWiringTagPermission = async () => {
|
|
@@ -340,7 +340,7 @@ describe('runPermissions', () => {
|
|
|
340
340
|
|
|
341
341
|
addPermission('failingWiringTag', [failingWiringTagPermission])
|
|
342
342
|
|
|
343
|
-
const
|
|
343
|
+
const wirePermissions: CorePermissionGroup = {
|
|
344
344
|
permissions: [
|
|
345
345
|
async () => {
|
|
346
346
|
executionOrder.push('wiringPermission')
|
|
@@ -349,18 +349,17 @@ describe('runPermissions', () => {
|
|
|
349
349
|
],
|
|
350
350
|
}
|
|
351
351
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
)
|
|
352
|
+
// Should NOT throw because at least one permission (wirePermissions) passes
|
|
353
|
+
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
354
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'failingWiringTag' }],
|
|
355
|
+
wirePermissions,
|
|
356
|
+
allServices: mockServices,
|
|
357
|
+
data: {},
|
|
358
|
+
session: mockSession,
|
|
359
|
+
})
|
|
361
360
|
|
|
362
|
-
//
|
|
363
|
-
assert.deepEqual(executionOrder, ['wiringTag'])
|
|
361
|
+
// Both permissions should be evaluated
|
|
362
|
+
assert.deepEqual(executionOrder, ['wiringTag', 'wiringPermission'])
|
|
364
363
|
})
|
|
365
364
|
|
|
366
365
|
test('should handle array permissions in tag-based permissions', async () => {
|
|
@@ -370,7 +369,7 @@ describe('runPermissions', () => {
|
|
|
370
369
|
|
|
371
370
|
// Should not throw because verifyPermissions handles array properly
|
|
372
371
|
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
373
|
-
|
|
372
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'arrayTestTag' }],
|
|
374
373
|
allServices: mockServices,
|
|
375
374
|
data: {},
|
|
376
375
|
session: mockSession,
|
|
@@ -386,7 +385,7 @@ describe('runPermissions', () => {
|
|
|
386
385
|
|
|
387
386
|
// Should not throw because verifyPermissions handles objects properly
|
|
388
387
|
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
389
|
-
|
|
388
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'objectTestTag' }],
|
|
390
389
|
allServices: mockServices,
|
|
391
390
|
data: {},
|
|
392
391
|
session: mockSession,
|
|
@@ -410,7 +409,7 @@ describe('runPermissions', () => {
|
|
|
410
409
|
addPermission('paramTestTag', [testPermission])
|
|
411
410
|
|
|
412
411
|
await runPermissions(PikkuWiringTypes.rpc, Math.random().toString(), {
|
|
413
|
-
|
|
412
|
+
wireInheritedPermissions: [{ type: 'tag', tag: 'paramTestTag' }],
|
|
414
413
|
allServices: mockServices,
|
|
415
414
|
data: testData,
|
|
416
415
|
session: mockSession,
|