diff --git a/src/backend/services/push/PushService.delivery.test.ts b/src/backend/services/push/PushService.delivery.test.ts index 690b7ed14..d5b56aa21 100644 --- a/src/backend/services/push/PushService.delivery.test.ts +++ b/src/backend/services/push/PushService.delivery.test.ts @@ -104,7 +104,21 @@ const makeApp = async ( ); }; -const registerDevice = ( +/** One live session per user, so devices count as active. */ +const sessions = new WeakMap>(); +const sessionOf = async (server: PuterServer, userId: number) => { + const mine = sessions.get(server) ?? new Map(); + sessions.set(server, mine); + let uid = mine.get(userId); + if (!uid) { + uid = ((await server.stores.session.create(userId)) as { uuid: string }) + .uuid; + mine.set(userId, uid); + } + return uid; +}; + +const registerDevice = async ( server: PuterServer, userId: number, token: string, @@ -112,7 +126,7 @@ const registerDevice = ( ) => server.stores.pushDevice.register({ userId, - sessionUid: `sess-${uuidv4()}`, + sessionUid: await sessionOf(server, userId), platform: opts.platform ?? 'web', token, appUid: opts.appUid ?? null, diff --git a/src/backend/services/push/PushService.presence.test.ts b/src/backend/services/push/PushService.presence.test.ts index 229a303bc..381afe7e7 100644 --- a/src/backend/services/push/PushService.presence.test.ts +++ b/src/backend/services/push/PushService.presence.test.ts @@ -100,7 +100,11 @@ const makePerson = async (): Promise => { ); await env.server.stores.pushDevice.register({ userId: user.id, - sessionUid: `sess-${uuidv4()}`, + sessionUid: ( + (await env.server.stores.session.create(user.id)) as { + uuid: string; + } + ).uuid, platform: 'web', token: `tok-${uuidv4()}`, }); diff --git a/src/backend/services/push/PushService.ts b/src/backend/services/push/PushService.ts index ea8010a2d..89d66f8ce 100644 --- a/src/backend/services/push/PushService.ts +++ b/src/backend/services/push/PushService.ts @@ -181,7 +181,7 @@ export class PushService extends PuterService { return; } - await this.#send(devices, message); + await this.#send(userId, devices, message); } /** The name the server stamped on the message, else the app row's. */ @@ -211,6 +211,7 @@ export class PushService extends PuterService { /** One call per platform batch; each device's result is recorded once. */ async #send( + userId: number, devices: PushDeliveryTarget[], message: PushMessage, ): Promise { @@ -285,8 +286,8 @@ export class PushService extends PuterService { }); } await Promise.all([ - this.stores.pushDevice.touch(delivered), - this.stores.pushDevice.recordFailure(failed), + this.stores.pushDevice.touch(userId, delivered), + this.stores.pushDevice.recordFailure(userId, failed), this.stores.pushDevice.removeByTokenHashes(unregistered), ]); }