feat: 계정 Web Push 전달 기반과 사건 판정을 추가한다
게임 상태 변경과 같은 트랜잭션에 내구성 outbox를 기록하고 Gateway가 계정 설정과 기기 구독으로 fan-out하도록 한다. 전역 기본값은 비활성으로 유지하며 migration과 회귀 테스트를 함께 추가한다.
This commit is contained in:
@@ -46,6 +46,7 @@ import { createBestEffortResourceCloser } from './services/bestEffortResourceClo
|
||||
import { RemoteContentImageStore } from './services/remoteContentImageStore.js';
|
||||
import { ReadModelOutboxWorker } from './realtime/outboxWorker.js';
|
||||
import { DeferredGeneralAccessWorker } from './services/deferredGeneralAccess.js';
|
||||
import { WebPushOutboxWorker } from './services/webPushOutboxWorker.js';
|
||||
|
||||
const extractBearerToken = (value: string | string[] | undefined): string | null => {
|
||||
if (!value) {
|
||||
@@ -168,9 +169,23 @@ export const createGameApiServer = async () => {
|
||||
onError: (error) => app.log.error({ err: error }, 'deferred general access flush failed'),
|
||||
}
|
||||
);
|
||||
const webPushOutboxWorker = new WebPushOutboxWorker(
|
||||
postgres.prisma,
|
||||
config.gatewayInternalApiUrl,
|
||||
config.gameTokenSecret,
|
||||
config.profileName,
|
||||
{
|
||||
intervalMs: config.webPushOutboxPollMs,
|
||||
onError: (error) => app.log.error({ err: error }, 'web push outbox dispatch failed'),
|
||||
}
|
||||
);
|
||||
let flushSubscriberStarted = false;
|
||||
let realtimeHubStarted = false;
|
||||
const closeResources = createBestEffortResourceCloser([
|
||||
{
|
||||
name: 'web-push-outbox-worker',
|
||||
run: () => webPushOutboxWorker.stop(),
|
||||
},
|
||||
{
|
||||
name: 'deferred-general-access-worker',
|
||||
run: () => deferredGeneralAccessWorker.stop(),
|
||||
@@ -395,6 +410,7 @@ export const createGameApiServer = async () => {
|
||||
await flushSubscriber.start();
|
||||
flushSubscriberStarted = true;
|
||||
readModelOutboxWorker.start();
|
||||
webPushOutboxWorker.start();
|
||||
deferredGeneralAccessWorker.start();
|
||||
accountIconResetReconciler.start();
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user