|
9 | 9 | import { |
10 | 10 | Test, |
11 | 11 | } from 'ts-toolbelt' |
| 12 | +import { |
| 13 | + ServerResponse, |
| 14 | +} from 'http' |
12 | 15 | import { |
13 | 16 | MatchedHandler, |
14 | 17 | Router, |
@@ -223,6 +226,60 @@ it('simple non-matching router type', () => { |
223 | 226 | }) |
224 | 227 | }) |
225 | 228 |
|
| 229 | +it('tenant router example from docs', () => { |
| 230 | + // create main rooter |
| 231 | + const rootRouter = new NodeHttpRouter() |
| 232 | + // attach some global urls |
| 233 | + // rootRouter.addRoute(...) |
| 234 | + |
| 235 | + // create a router used for all handlers |
| 236 | + // with tenant information |
| 237 | + const tenantRouter = new Router<{ |
| 238 | + req: ServerRequest |
| 239 | + res: ServerResponse |
| 240 | + tenant: string |
| 241 | + }>() |
| 242 | + |
| 243 | + // connect routers |
| 244 | + rootRouter.addRoute({ |
| 245 | + matcher: new RegExpUrlMatcher<{ |
| 246 | + tenant: string |
| 247 | + url: string |
| 248 | + }>([/^\/auth\/realms\/(?<tenant>[^/]+)(?<url>.+)/]), |
| 249 | + handler: ({ data, match }) => { |
| 250 | + const { req, res } = data |
| 251 | + // figure tenant out |
| 252 | + const { tenant, url } = match.result.match.groups |
| 253 | + // pass the new url down |
| 254 | + req.url = url |
| 255 | + return tenantRouter.exec({ |
| 256 | + req, |
| 257 | + res, |
| 258 | + tenant, |
| 259 | + }) |
| 260 | + }, |
| 261 | + }) |
| 262 | + |
| 263 | + // attach some urls behind tenant |
| 264 | + tenantRouter.addRoute({ |
| 265 | + matcher: new ExactUrlPathnameMatcher(['/myurl']), |
| 266 | + handler: ({ data: { tenant }, match: { result: { pathname } } }) => { |
| 267 | + // if requested url is `/auth/realms/mytenant/myurl`, then: |
| 268 | + // tenant: mytenant |
| 269 | + // pathname: /myurl |
| 270 | + return `tenant: ${tenant}, url: ${pathname}` |
| 271 | + }, |
| 272 | + }) |
| 273 | + |
| 274 | + expect(rootRouter.serve( |
| 275 | + createRequest({ |
| 276 | + method: 'GET', |
| 277 | + url: '/auth/realms/mytenant/myurl', |
| 278 | + }), |
| 279 | + createResponse(), |
| 280 | + )).toBe('tenant: mytenant, url: /myurl') |
| 281 | +}) |
| 282 | + |
226 | 283 | it('nested router', () => { |
227 | 284 | const appRouter = new Router<{ |
228 | 285 | tenant: string |
|
0 commit comments