-
Notifications
You must be signed in to change notification settings - Fork 7.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(core): Simplify webhook pubsub message handler
- Loading branch information
Showing
6 changed files
with
250 additions
and
108 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
142 changes: 142 additions & 0 deletions
142
packages/cli/src/scaling/__tests__/pubsub-handler.test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
import { mock } from 'jest-mock-extended'; | ||
import type { InstanceSettings } from 'n8n-core'; | ||
|
||
import type { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; | ||
import { EventService } from '@/events/event.service'; | ||
import type { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; | ||
import type { License } from '@/license'; | ||
import type { CommunityPackagesService } from '@/services/community-packages.service'; | ||
|
||
import { PubSubHandler } from '../pubsub/pubsub-handler'; | ||
|
||
describe('PubSubHandler', () => { | ||
const eventService = new EventService(); | ||
const license = mock<License>(); | ||
const eventbus = mock<MessageEventBus>(); | ||
const externalSecretsManager = mock<ExternalSecretsManager>(); | ||
const communityPackagesService = mock<CommunityPackagesService>(); | ||
|
||
describe('in webhook process', () => { | ||
const instanceSettings = mock<InstanceSettings>({ instanceType: 'webhook' }); | ||
|
||
it('should set up handlers in webhook process', () => { | ||
// @ts-expect-error Spying on private method | ||
const setupWebhookHandlersSpy = jest.spyOn(PubSubHandler.prototype, 'setupWebhookHandlers'); | ||
|
||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
expect(setupWebhookHandlersSpy).toHaveBeenCalled(); | ||
}); | ||
|
||
it('should reload license on `reload-license` event', () => { | ||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
eventService.emit('reload-license'); | ||
|
||
expect(license.reload).toHaveBeenCalled(); | ||
}); | ||
|
||
it('should restart event bus on `restart-event-bus` event', () => { | ||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
eventService.emit('restart-event-bus'); | ||
|
||
expect(eventbus.restart).toHaveBeenCalled(); | ||
}); | ||
|
||
it('should reload providers on `reload-external-secrets-providers` event', () => { | ||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
eventService.emit('reload-external-secrets-providers'); | ||
|
||
expect(externalSecretsManager.reloadAllProviders).toHaveBeenCalled(); | ||
}); | ||
|
||
it('should install community package on `community-package-install` event', () => { | ||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
eventService.emit('community-package-install', { | ||
packageName: 'test-package', | ||
packageVersion: '1.0.0', | ||
}); | ||
|
||
expect(communityPackagesService.installOrUpdateNpmPackage).toHaveBeenCalledWith( | ||
'test-package', | ||
'1.0.0', | ||
); | ||
}); | ||
|
||
it('should update community package on `community-package-update` event', () => { | ||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
eventService.emit('community-package-update', { | ||
packageName: 'test-package', | ||
packageVersion: '1.0.0', | ||
}); | ||
|
||
expect(communityPackagesService.installOrUpdateNpmPackage).toHaveBeenCalledWith( | ||
'test-package', | ||
'1.0.0', | ||
); | ||
}); | ||
|
||
it('should uninstall community package on `community-package-uninstall` event', () => { | ||
new PubSubHandler( | ||
eventService, | ||
instanceSettings, | ||
license, | ||
eventbus, | ||
externalSecretsManager, | ||
communityPackagesService, | ||
).init(); | ||
|
||
eventService.emit('community-package-uninstall', { | ||
packageName: 'test-package', | ||
}); | ||
|
||
expect(communityPackagesService.removeNpmPackage).toHaveBeenCalledWith('test-package'); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
import { InstanceSettings } from 'n8n-core'; | ||
import { Service } from 'typedi'; | ||
|
||
import { MessageEventBus } from '@/eventbus/message-event-bus/message-event-bus'; | ||
import { EventService } from '@/events/event.service'; | ||
import type { PubSubEventMap } from '@/events/maps/pub-sub.event-map'; | ||
import { ExternalSecretsManager } from '@/external-secrets/external-secrets-manager.ee'; | ||
import { License } from '@/license'; | ||
import { CommunityPackagesService } from '@/services/community-packages.service'; | ||
|
||
/** | ||
* Responsible for handling events emitted from messages received via a pubsub channel. | ||
*/ | ||
@Service() | ||
export class PubSubHandler { | ||
constructor( | ||
private readonly eventService: EventService, | ||
private readonly instanceSettings: InstanceSettings, | ||
private readonly license: License, | ||
private readonly eventbus: MessageEventBus, | ||
private readonly externalSecretsManager: ExternalSecretsManager, | ||
private readonly communityPackagesService: CommunityPackagesService, | ||
) {} | ||
|
||
init() { | ||
if (this.instanceSettings.instanceType === 'webhook') this.setupWebhookHandlers(); | ||
} | ||
|
||
private setupHandlers<EventNames extends keyof PubSubEventMap>( | ||
map: { | ||
[EventName in EventNames]?: (event: PubSubEventMap[EventName]) => void | Promise<void>; | ||
}, | ||
) { | ||
for (const [eventName, handlerFn] of Object.entries(map) as Array< | ||
[EventNames, (event: PubSubEventMap[EventNames]) => void | Promise<void>] | ||
>) { | ||
this.eventService.on(eventName, async (event) => { | ||
await handlerFn(event); | ||
}); | ||
} | ||
} | ||
|
||
// #region Webhook process | ||
|
||
private setupWebhookHandlers() { | ||
this.setupHandlers({ | ||
'reload-license': async () => await this.license.reload(), | ||
'restart-event-bus': async () => await this.eventbus.restart(), | ||
'reload-external-secrets-providers': async () => | ||
await this.externalSecretsManager.reloadAllProviders(), | ||
'community-package-install': async ({ packageName, packageVersion }) => | ||
await this.communityPackagesService.installOrUpdateNpmPackage(packageName, packageVersion), | ||
'community-package-update': async ({ packageName, packageVersion }) => | ||
await this.communityPackagesService.installOrUpdateNpmPackage(packageName, packageVersion), | ||
'community-package-uninstall': async ({ packageName }) => | ||
await this.communityPackagesService.removeNpmPackage(packageName), | ||
}); | ||
} | ||
|
||
// #endregion | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
87 changes: 0 additions & 87 deletions
87
packages/cli/src/services/orchestration/webhook/handle-command-message-webhook.ts
This file was deleted.
Oops, something went wrong.
19 changes: 0 additions & 19 deletions
19
packages/cli/src/services/orchestration/webhook/orchestration.handler.webhook.service.ts
This file was deleted.
Oops, something went wrong.