@pikku/core 0.9.3 → 0.9.5
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 +25 -0
- package/dist/function/function-runner.d.ts +2 -1
- package/dist/function/function-runner.js +22 -15
- package/dist/function/functions.types.d.ts +3 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/middleware-runner.d.ts +70 -0
- package/dist/middleware-runner.js +105 -2
- package/dist/permissions.d.ts +57 -1
- package/dist/permissions.js +122 -0
- package/dist/pikku-state.d.ts +3 -1
- package/dist/pikku-state.js +3 -1
- package/dist/types/core.types.d.ts +10 -5
- package/dist/wirings/channel/channel-handler.js +1 -0
- package/dist/wirings/channel/local/local-channel-runner.js +26 -15
- package/dist/wirings/channel/serverless/serverless-channel-runner.js +5 -2
- package/dist/wirings/http/http-runner.js +20 -3
- package/dist/wirings/http/http.types.d.ts +5 -4
- package/dist/wirings/mcp/mcp-runner.js +27 -14
- package/dist/wirings/mcp/mcp.types.d.ts +7 -3
- 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 +15 -1
- package/dist/wirings/queue/queue-runner.js +71 -16
- package/dist/wirings/queue/queue.types.d.ts +19 -2
- package/dist/wirings/rpc/rpc-runner.d.ts +4 -2
- package/dist/wirings/scheduler/scheduler-runner.js +54 -24
- package/dist/wirings/scheduler/scheduler.types.d.ts +17 -2
- package/package.json +1 -1
- package/src/function/function-runner.test.ts +450 -0
- package/src/function/function-runner.ts +25 -26
- package/src/function/functions.types.ts +3 -1
- package/src/index.ts +10 -1
- package/src/middleware-runner.test.ts +329 -0
- package/src/middleware-runner.ts +131 -2
- package/src/permissions.test.ts +403 -42
- package/src/permissions.ts +182 -1
- package/src/pikku-state.ts +10 -2
- package/src/types/core.types.ts +10 -5
- package/src/wirings/channel/channel-handler.ts +1 -0
- package/src/wirings/channel/local/local-channel-runner.ts +33 -16
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +5 -2
- package/src/wirings/http/http-runner.ts +21 -3
- package/src/wirings/http/http.types.ts +5 -4
- package/src/wirings/mcp/mcp-runner.ts +37 -17
- package/src/wirings/mcp/mcp.types.ts +7 -0
- package/src/wirings/queue/index.ts +2 -0
- package/src/wirings/queue/queue-runner.ts +92 -19
- package/src/wirings/queue/queue.types.ts +20 -1
- package/src/wirings/scheduler/scheduler-runner.ts +80 -32
- package/src/wirings/scheduler/scheduler.types.ts +22 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { describe, test, beforeEach } from 'node:test'
|
|
2
|
+
import assert from 'node:assert'
|
|
3
|
+
import {
|
|
4
|
+
combineMiddleware,
|
|
5
|
+
addMiddleware,
|
|
6
|
+
getMiddlewareForTags,
|
|
7
|
+
runMiddleware,
|
|
8
|
+
} from './middleware-runner.js'
|
|
9
|
+
import { resetPikkuState } from './pikku-state.js'
|
|
10
|
+
import { CorePikkuMiddleware } from './types/core.types.js'
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
resetPikkuState()
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
describe('combineMiddleware', () => {
|
|
17
|
+
test('should return empty array when no parameters provided', () => {
|
|
18
|
+
const result = combineMiddleware()
|
|
19
|
+
assert.deepEqual(result, [])
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('should return empty array when all parameters are undefined', () => {
|
|
23
|
+
const result = combineMiddleware({
|
|
24
|
+
wiringMiddleware: undefined,
|
|
25
|
+
wiringTags: undefined,
|
|
26
|
+
funcMiddleware: undefined,
|
|
27
|
+
funcTags: undefined,
|
|
28
|
+
})
|
|
29
|
+
assert.deepEqual(result, [])
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('should combine wiring middleware only', () => {
|
|
33
|
+
const mockMiddleware1: CorePikkuMiddleware = async (
|
|
34
|
+
services,
|
|
35
|
+
interaction,
|
|
36
|
+
next
|
|
37
|
+
) => {
|
|
38
|
+
await next()
|
|
39
|
+
}
|
|
40
|
+
const mockMiddleware2: CorePikkuMiddleware = async (
|
|
41
|
+
services,
|
|
42
|
+
interaction,
|
|
43
|
+
next
|
|
44
|
+
) => {
|
|
45
|
+
await next()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const result = combineMiddleware({
|
|
49
|
+
wiringMiddleware: [mockMiddleware1, mockMiddleware2],
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
assert.equal(result.length, 2)
|
|
53
|
+
assert.equal(result[0], mockMiddleware1)
|
|
54
|
+
assert.equal(result[1], mockMiddleware2)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test('should combine function middleware only', () => {
|
|
58
|
+
const mockMiddleware1: CorePikkuMiddleware = async (
|
|
59
|
+
services,
|
|
60
|
+
interaction,
|
|
61
|
+
next
|
|
62
|
+
) => {
|
|
63
|
+
await next()
|
|
64
|
+
}
|
|
65
|
+
const mockMiddleware2: CorePikkuMiddleware = async (
|
|
66
|
+
services,
|
|
67
|
+
interaction,
|
|
68
|
+
next
|
|
69
|
+
) => {
|
|
70
|
+
await next()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const result = combineMiddleware({
|
|
74
|
+
funcMiddleware: [mockMiddleware1, mockMiddleware2],
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
assert.equal(result.length, 2)
|
|
78
|
+
assert.equal(result[0], mockMiddleware1)
|
|
79
|
+
assert.equal(result[1], mockMiddleware2)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
test('should execute middleware in correct order: wiringTags → wiringMiddleware → funcMiddleware → funcTags', () => {
|
|
83
|
+
// Setup tagged middleware
|
|
84
|
+
const wiringTagMiddleware: CorePikkuMiddleware = async (
|
|
85
|
+
services,
|
|
86
|
+
interaction,
|
|
87
|
+
next
|
|
88
|
+
) => {
|
|
89
|
+
await next()
|
|
90
|
+
}
|
|
91
|
+
const funcTagMiddleware: CorePikkuMiddleware = async (
|
|
92
|
+
services,
|
|
93
|
+
interaction,
|
|
94
|
+
next
|
|
95
|
+
) => {
|
|
96
|
+
await next()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
addMiddleware('wiringTag', [wiringTagMiddleware])
|
|
100
|
+
addMiddleware('funcTag', [funcTagMiddleware])
|
|
101
|
+
|
|
102
|
+
const wiringMiddleware: CorePikkuMiddleware = async (
|
|
103
|
+
services,
|
|
104
|
+
interaction,
|
|
105
|
+
next
|
|
106
|
+
) => {
|
|
107
|
+
await next()
|
|
108
|
+
}
|
|
109
|
+
const funcMiddleware: CorePikkuMiddleware = async (
|
|
110
|
+
services,
|
|
111
|
+
interaction,
|
|
112
|
+
next
|
|
113
|
+
) => {
|
|
114
|
+
await next()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const result = combineMiddleware({
|
|
118
|
+
wiringMiddleware: [wiringMiddleware],
|
|
119
|
+
wiringTags: ['wiringTag'],
|
|
120
|
+
funcMiddleware: [funcMiddleware],
|
|
121
|
+
funcTags: ['funcTag'],
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
assert.equal(result.length, 4)
|
|
125
|
+
// Order: wiringTags, wiringMiddleware, funcMiddleware, funcTags
|
|
126
|
+
assert.equal(result[0], wiringTagMiddleware) // wiringTags first
|
|
127
|
+
assert.equal(result[1], wiringMiddleware) // wiringMiddleware second
|
|
128
|
+
assert.equal(result[2], funcMiddleware) // funcMiddleware third
|
|
129
|
+
assert.equal(result[3], funcTagMiddleware) // funcTags last
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
test('should handle wiring tags only', () => {
|
|
133
|
+
const taggedMiddleware: CorePikkuMiddleware = async (
|
|
134
|
+
services,
|
|
135
|
+
interaction,
|
|
136
|
+
next
|
|
137
|
+
) => {
|
|
138
|
+
await next()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
addMiddleware('testTag', [taggedMiddleware])
|
|
142
|
+
|
|
143
|
+
const result = combineMiddleware({
|
|
144
|
+
wiringTags: ['testTag'],
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
assert.equal(result.length, 1)
|
|
148
|
+
assert.equal(result[0], taggedMiddleware)
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
test('should handle function tags only', () => {
|
|
152
|
+
const taggedMiddleware: CorePikkuMiddleware = async (
|
|
153
|
+
services,
|
|
154
|
+
interaction,
|
|
155
|
+
next
|
|
156
|
+
) => {
|
|
157
|
+
await next()
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
addMiddleware('funcTestTag', [taggedMiddleware])
|
|
161
|
+
|
|
162
|
+
const result = combineMiddleware({
|
|
163
|
+
funcTags: ['funcTestTag'],
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
assert.equal(result.length, 1)
|
|
167
|
+
assert.equal(result[0], taggedMiddleware)
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
test('should handle multiple tags', () => {
|
|
171
|
+
const middleware1: CorePikkuMiddleware = async (
|
|
172
|
+
services,
|
|
173
|
+
interaction,
|
|
174
|
+
next
|
|
175
|
+
) => {
|
|
176
|
+
await next()
|
|
177
|
+
}
|
|
178
|
+
const middleware2: CorePikkuMiddleware = async (
|
|
179
|
+
services,
|
|
180
|
+
interaction,
|
|
181
|
+
next
|
|
182
|
+
) => {
|
|
183
|
+
await next()
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
addMiddleware('tag1', [middleware1])
|
|
187
|
+
addMiddleware('tag2', [middleware2])
|
|
188
|
+
|
|
189
|
+
const result = combineMiddleware({
|
|
190
|
+
wiringTags: ['tag1', 'tag2'],
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
assert.equal(result.length, 2)
|
|
194
|
+
assert.equal(result[0], middleware1)
|
|
195
|
+
assert.equal(result[1], middleware2)
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
test('should ignore non-existent tags', () => {
|
|
199
|
+
const middleware: CorePikkuMiddleware = async (
|
|
200
|
+
services,
|
|
201
|
+
interaction,
|
|
202
|
+
next
|
|
203
|
+
) => {
|
|
204
|
+
await next()
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
addMiddleware('existingTag', [middleware])
|
|
208
|
+
|
|
209
|
+
const result = combineMiddleware({
|
|
210
|
+
wiringTags: ['existingTag', 'nonExistentTag'],
|
|
211
|
+
funcTags: ['anotherNonExistentTag'],
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
assert.equal(result.length, 1)
|
|
215
|
+
assert.equal(result[0], middleware)
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
describe('runMiddleware', () => {
|
|
220
|
+
test('should deduplicate middleware using Set', async () => {
|
|
221
|
+
const executionOrder: string[] = []
|
|
222
|
+
|
|
223
|
+
const middleware1: CorePikkuMiddleware = async (
|
|
224
|
+
services,
|
|
225
|
+
interaction,
|
|
226
|
+
next
|
|
227
|
+
) => {
|
|
228
|
+
executionOrder.push('middleware1')
|
|
229
|
+
await next()
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const middleware2: CorePikkuMiddleware = async (
|
|
233
|
+
services,
|
|
234
|
+
interaction,
|
|
235
|
+
next
|
|
236
|
+
) => {
|
|
237
|
+
executionOrder.push('middleware2')
|
|
238
|
+
await next()
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Pass same middleware multiple times
|
|
242
|
+
const duplicatedMiddleware = [
|
|
243
|
+
middleware1,
|
|
244
|
+
middleware2,
|
|
245
|
+
middleware1,
|
|
246
|
+
middleware2,
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
await runMiddleware(
|
|
250
|
+
{} as any,
|
|
251
|
+
{} as any,
|
|
252
|
+
duplicatedMiddleware,
|
|
253
|
+
async () => {
|
|
254
|
+
executionOrder.push('main')
|
|
255
|
+
}
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
// Should only execute each middleware once
|
|
259
|
+
assert.deepEqual(executionOrder, ['middleware1', 'middleware2', 'main'])
|
|
260
|
+
})
|
|
261
|
+
|
|
262
|
+
test('should execute middleware in correct order', async () => {
|
|
263
|
+
const executionOrder: string[] = []
|
|
264
|
+
|
|
265
|
+
const middleware1: CorePikkuMiddleware = async (
|
|
266
|
+
services,
|
|
267
|
+
interaction,
|
|
268
|
+
next
|
|
269
|
+
) => {
|
|
270
|
+
executionOrder.push('start1')
|
|
271
|
+
await next()
|
|
272
|
+
executionOrder.push('end1')
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const middleware2: CorePikkuMiddleware = async (
|
|
276
|
+
services,
|
|
277
|
+
interaction,
|
|
278
|
+
next
|
|
279
|
+
) => {
|
|
280
|
+
executionOrder.push('start2')
|
|
281
|
+
await next()
|
|
282
|
+
executionOrder.push('end2')
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
await runMiddleware(
|
|
286
|
+
{} as any,
|
|
287
|
+
{} as any,
|
|
288
|
+
[middleware1, middleware2],
|
|
289
|
+
async () => {
|
|
290
|
+
executionOrder.push('main')
|
|
291
|
+
}
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
assert.deepEqual(executionOrder, [
|
|
295
|
+
'start1',
|
|
296
|
+
'start2',
|
|
297
|
+
'main',
|
|
298
|
+
'end2',
|
|
299
|
+
'end1',
|
|
300
|
+
])
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
test('should work with empty middleware array', async () => {
|
|
304
|
+
let mainExecuted = false
|
|
305
|
+
|
|
306
|
+
await runMiddleware({} as any, {} as any, [], async () => {
|
|
307
|
+
mainExecuted = true
|
|
308
|
+
})
|
|
309
|
+
|
|
310
|
+
assert.equal(mainExecuted, true)
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
test('should work without main function', async () => {
|
|
314
|
+
const executionOrder: string[] = []
|
|
315
|
+
|
|
316
|
+
const middleware: CorePikkuMiddleware = async (
|
|
317
|
+
services,
|
|
318
|
+
interaction,
|
|
319
|
+
next
|
|
320
|
+
) => {
|
|
321
|
+
executionOrder.push('middleware')
|
|
322
|
+
await next()
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
await runMiddleware({} as any, {} as any, [middleware])
|
|
326
|
+
|
|
327
|
+
assert.deepEqual(executionOrder, ['middleware'])
|
|
328
|
+
})
|
|
329
|
+
})
|
package/src/middleware-runner.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
PikkuInteraction,
|
|
5
5
|
CorePikkuMiddleware,
|
|
6
6
|
} from './types/core.types.js'
|
|
7
|
+
import { pikkuState } from './pikku-state.js'
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Runs a chain of middleware functions in sequence before executing the main function.
|
|
@@ -30,10 +31,12 @@ export const runMiddleware = async <Middleware extends CorePikkuMiddleware>(
|
|
|
30
31
|
middlewares: Middleware[],
|
|
31
32
|
main?: () => Promise<unknown>
|
|
32
33
|
): Promise<unknown> => {
|
|
34
|
+
// Deduplicate middleware using Set to avoid running the same middleware multiple times
|
|
35
|
+
const uniqueMiddleware = Array.from(new Set(middlewares))
|
|
33
36
|
let result: any
|
|
34
37
|
const dispatch = async (index: number): Promise<any> => {
|
|
35
|
-
if (
|
|
36
|
-
return await
|
|
38
|
+
if (uniqueMiddleware && index < uniqueMiddleware.length) {
|
|
39
|
+
return await uniqueMiddleware[index]!(services as any, interaction, () =>
|
|
37
40
|
dispatch(index + 1)
|
|
38
41
|
)
|
|
39
42
|
} else if (main) {
|
|
@@ -43,3 +46,129 @@ export const runMiddleware = async <Middleware extends CorePikkuMiddleware>(
|
|
|
43
46
|
await dispatch(0)
|
|
44
47
|
return result
|
|
45
48
|
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Adds global middleware for a specific tag.
|
|
52
|
+
*
|
|
53
|
+
* This function allows you to register middleware that will be applied to
|
|
54
|
+
* any wiring (HTTP, Channel, Queue, Scheduler, MCP) that includes the matching tag.
|
|
55
|
+
*
|
|
56
|
+
* @template PikkuMiddleware The middleware type.
|
|
57
|
+
* @param {string} tag - The tag that the middleware should apply to.
|
|
58
|
+
* @param {PikkuMiddleware[]} middleware - The middleware array to apply for the specified tag.
|
|
59
|
+
*
|
|
60
|
+
* @throws {Error} If middleware for the tag already exists.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* // Add admin middleware for admin endpoints
|
|
65
|
+
* addMiddleware('admin', [adminMiddleware])
|
|
66
|
+
*
|
|
67
|
+
* // Add authentication middleware for auth endpoints
|
|
68
|
+
* addMiddleware('auth', [authMiddleware])
|
|
69
|
+
*
|
|
70
|
+
* // Add logging middleware for all API endpoints
|
|
71
|
+
* addMiddleware('api', [loggingMiddleware])
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export const addMiddleware = <PikkuMiddleware extends CorePikkuMiddleware>(
|
|
75
|
+
tag: string,
|
|
76
|
+
middleware: PikkuMiddleware[]
|
|
77
|
+
) => {
|
|
78
|
+
const middlewareStore = pikkuState('misc', 'middleware')
|
|
79
|
+
|
|
80
|
+
// Check if tag already exists
|
|
81
|
+
if (middlewareStore[tag]) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Middleware for tag '${tag}' already exists. Use a different tag or remove the existing middleware first.`
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
middlewareStore[tag] = middleware as CorePikkuMiddleware[]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Retrieves middleware for a given set of tags.
|
|
92
|
+
*
|
|
93
|
+
* This function looks up all middleware registered for any of the provided tags
|
|
94
|
+
* and returns them as a flattened array.
|
|
95
|
+
*
|
|
96
|
+
* @param {string[]} tags - Array of tags to look up middleware for.
|
|
97
|
+
* @returns {CorePikkuMiddleware[]} Array of middleware functions that apply to the given tags.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Get all middleware for tags 'api' and 'auth'
|
|
102
|
+
* const middleware = getMiddlewareForTags(['api', 'auth'])
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export const getMiddlewareForTags = (
|
|
106
|
+
tags?: string[]
|
|
107
|
+
): CorePikkuMiddleware[] => {
|
|
108
|
+
if (!tags || tags.length === 0) {
|
|
109
|
+
return []
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const middlewareStore = pikkuState('misc', 'middleware')
|
|
113
|
+
const applicableMiddleware: CorePikkuMiddleware[] = []
|
|
114
|
+
|
|
115
|
+
// Collect middleware for all matching tags
|
|
116
|
+
for (const tag of tags) {
|
|
117
|
+
const tagMiddleware = middlewareStore[tag]
|
|
118
|
+
if (tagMiddleware) {
|
|
119
|
+
applicableMiddleware.push(...tagMiddleware)
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return applicableMiddleware
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Combines tag-based middleware with wiring-specific middleware and function-level middleware.
|
|
128
|
+
*
|
|
129
|
+
* This helper function gets middleware for tags and combines it with any
|
|
130
|
+
* wiring-specific middleware and function-level middleware, avoiding the need for manual spreading.
|
|
131
|
+
*
|
|
132
|
+
* @param {object} options - Configuration object for combining middleware.
|
|
133
|
+
* @param {CorePikkuMiddleware[] | undefined} options.wiringMiddleware - Wiring-specific middleware.
|
|
134
|
+
* @param {string[] | undefined} options.wiringTags - Array of wiring-level tags to look up middleware for.
|
|
135
|
+
* @param {CorePikkuMiddleware[] | undefined} options.funcMiddleware - Function-level middleware.
|
|
136
|
+
* @param {string[] | undefined} options.funcTags - Array of function-level tags to look up middleware for.
|
|
137
|
+
* @returns {CorePikkuMiddleware[]} Combined array of tag-based and wiring-specific middleware.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* const combined = combineMiddleware({
|
|
142
|
+
* wiringMiddleware: httpRoute.middleware,
|
|
143
|
+
* wiringTags: httpRoute.tags,
|
|
144
|
+
* funcMiddleware: funcConfig.middleware,
|
|
145
|
+
* funcTags: funcConfig.tags
|
|
146
|
+
* })
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export const combineMiddleware = ({
|
|
150
|
+
wiringMiddleware,
|
|
151
|
+
wiringTags,
|
|
152
|
+
funcMiddleware,
|
|
153
|
+
funcTags,
|
|
154
|
+
}: {
|
|
155
|
+
wiringMiddleware?: CorePikkuMiddleware[]
|
|
156
|
+
wiringTags?: string[]
|
|
157
|
+
funcMiddleware?: CorePikkuMiddleware[]
|
|
158
|
+
funcTags?: string[]
|
|
159
|
+
} = {}): CorePikkuMiddleware[] => {
|
|
160
|
+
// Run middleware in specific order:
|
|
161
|
+
// 1) wiringTags middleware
|
|
162
|
+
// 2) wiringMiddleware
|
|
163
|
+
// 3) funcMiddleware
|
|
164
|
+
// 4) funcTags middleware
|
|
165
|
+
const wiringTaggedMiddleware = getMiddlewareForTags(wiringTags)
|
|
166
|
+
const funcTaggedMiddleware = getMiddlewareForTags(funcTags)
|
|
167
|
+
|
|
168
|
+
return [
|
|
169
|
+
...wiringTaggedMiddleware,
|
|
170
|
+
...(wiringMiddleware || []),
|
|
171
|
+
...(funcMiddleware || []),
|
|
172
|
+
...funcTaggedMiddleware,
|
|
173
|
+
]
|
|
174
|
+
}
|