feat(gateway): support per-channel and per-session queue policy overrides
This commit is contained in:
@@ -80,6 +80,8 @@ describe('configSchema — server', () => {
|
||||
expect(result.server.queue.mode).toBe('collect');
|
||||
expect(result.server.queue.cap).toBe(50);
|
||||
expect(result.server.queue.overflow).toBe('drop_old');
|
||||
expect(result.server.queue.overrides.channels).toEqual({});
|
||||
expect(result.server.queue.overrides.sessions).toEqual({});
|
||||
});
|
||||
|
||||
it('accepts custom queue settings', () => {
|
||||
@@ -98,6 +100,28 @@ describe('configSchema — server', () => {
|
||||
expect(result.server.queue.overflow).toBe('drop_new');
|
||||
});
|
||||
|
||||
it('accepts queue override settings', () => {
|
||||
const result = configSchema.parse({
|
||||
...minimalConfig,
|
||||
server: {
|
||||
queue: {
|
||||
overrides: {
|
||||
channels: {
|
||||
ws: { mode: 'collect', cap: 5 },
|
||||
},
|
||||
sessions: {
|
||||
'ws:vip-user': { mode: 'interrupt', overflow: 'drop_new' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
expect(result.server.queue.overrides.channels.ws.mode).toBe('collect');
|
||||
expect(result.server.queue.overrides.channels.ws.cap).toBe(5);
|
||||
expect(result.server.queue.overrides.sessions['ws:vip-user'].mode).toBe('interrupt');
|
||||
expect(result.server.queue.overrides.sessions['ws:vip-user'].overflow).toBe('drop_new');
|
||||
});
|
||||
|
||||
it('defaults discovery settings', () => {
|
||||
const result = configSchema.parse(minimalConfig);
|
||||
expect(result.server.discovery.enabled).toBe(false);
|
||||
|
||||
@@ -39,6 +39,25 @@ const laneQueueSchema = z.object({
|
||||
cap: z.number().min(1).max(1000).default(50),
|
||||
/** Overflow strategy when cap is reached. */
|
||||
overflow: z.enum(['drop_old', 'drop_new']).default('drop_old'),
|
||||
/** Optional per-channel/per-session queue policy overrides. */
|
||||
overrides: z.object({
|
||||
channels: z.record(
|
||||
z.string(),
|
||||
z.object({
|
||||
mode: z.enum(['collect', 'steer', 'interrupt']).optional(),
|
||||
cap: z.number().min(1).max(1000).optional(),
|
||||
overflow: z.enum(['drop_old', 'drop_new']).optional(),
|
||||
}),
|
||||
).default({}),
|
||||
sessions: z.record(
|
||||
z.string(),
|
||||
z.object({
|
||||
mode: z.enum(['collect', 'steer', 'interrupt']).optional(),
|
||||
cap: z.number().min(1).max(1000).optional(),
|
||||
overflow: z.enum(['drop_old', 'drop_new']).optional(),
|
||||
}),
|
||||
).default({}),
|
||||
}).default({}),
|
||||
}).default({});
|
||||
|
||||
const serverDiscoverySchema = z.object({
|
||||
|
||||
Reference in New Issue
Block a user