Add Android node foundation with FCM push support

This commit is contained in:
William Valentin
2026-02-16 12:55:22 -08:00
parent 58c4b0b9bb
commit a954d7e136
11 changed files with 190 additions and 19 deletions
+40
View File
@@ -275,4 +275,44 @@ describe('node handlers', () => {
expect((result as { result: { push: { tokenPreview: string } } }).result.push.tokenPreview).toContain('abcd1234');
expect(states.get('conn-1')?.pushToken?.provider).toBe('apns');
});
it('accepts fcm push token registration for android companions', async () => {
const states = new Map<string, NodeConnectionState>([['conn-1', {
node: {
nodeId: 'android-node',
role: 'companion',
protocolVersion: 1,
capabilities: ['notifications'],
registeredAt: Date.now(),
},
}]]);
const handlers = createNodeHandlers({
enabled: true,
locationEnabled: true,
pushEnabled: true,
allowedRoles: ['companion'],
featureGates: {},
getConnectionState: (connectionId) => states.get(connectionId),
setNodeRegistration: () => {},
setNodeLocation: () => {},
setNodeStatus: () => {},
setNodePushToken: (connectionId, pushToken) => {
const prior = states.get(connectionId) ?? {};
states.set(connectionId, { ...prior, pushToken });
},
});
const result = await handlers['node.push_token.set']({
id: 9,
method: 'node.push_token.set',
params: {
connectionId: 'conn-1',
provider: 'fcm',
token: 'fcm_abcdefghijklmnopqrstuvwxyz123456',
},
});
expect((result as { result: { updated: boolean } }).result.updated).toBe(true);
expect(states.get('conn-1')?.pushToken?.provider).toBe('fcm');
expect(states.get('conn-1')?.pushToken?.environment).toBeUndefined();
});
});
+4 -4
View File
@@ -50,10 +50,10 @@ export interface NodeStatus {
}
export interface NodePushToken {
provider: 'apns';
provider: 'apns' | 'fcm';
token: string;
topic?: string;
environment: 'sandbox' | 'production';
environment?: 'sandbox' | 'production';
registeredAt: number;
}
@@ -279,10 +279,10 @@ export function createNodeHandlers(deps: NodeHandlerDeps) {
}
const pushToken: NodePushToken = {
provider: 'apns',
provider: parsed.provider,
token: parsed.token,
topic: parsed.topic || undefined,
environment: parsed.environment ?? 'production',
environment: parsed.provider === 'apns' ? (parsed.environment ?? 'production') : undefined,
registeredAt: Date.now(),
};
deps.setNodePushToken(parsed.connectionId, pushToken);
+1 -1
View File
@@ -46,7 +46,7 @@ export interface NodePushTokenSummary {
provider: NodePushToken['provider'];
tokenPreview: string;
topic?: string;
environment: NodePushToken['environment'];
environment?: NodePushToken['environment'];
registeredAt: number;
}