OpChan/src/lib/services/MessageService.ts

88 lines
2.5 KiB
TypeScript
Raw Normal View History

2025-08-28 18:44:35 +05:30
import { OpchanMessage } from '@/types/forum';
2025-08-30 18:34:50 +05:30
import { UnsignedMessage } from '@/types/waku';
import { DelegationManager } from '@/lib/delegation';
2025-07-30 13:22:06 +05:30
import messageManager from '@/lib/waku';
export interface MessageResult {
success: boolean;
message?: OpchanMessage;
error?: string;
}
2025-08-28 18:44:35 +05:30
export interface MessageServiceInterface {
2025-08-30 18:34:50 +05:30
sendMessage(message: UnsignedMessage): Promise<MessageResult>;
2025-08-28 18:44:35 +05:30
verifyMessage(message: OpchanMessage): boolean;
}
export class MessageService implements MessageServiceInterface {
private delegationManager: DelegationManager;
2025-07-30 13:22:06 +05:30
constructor(delegationManager: DelegationManager) {
this.delegationManager = delegationManager;
2025-07-30 13:22:06 +05:30
}
/**
* Sign and send a message to the Waku network
*/
2025-08-30 18:34:50 +05:30
async sendMessage(message: UnsignedMessage): Promise<MessageResult> {
2025-07-30 13:22:06 +05:30
try {
const signedMessage =
this.delegationManager.signMessageWithDelegatedKey(message);
2025-08-30 18:34:50 +05:30
2025-07-30 13:22:06 +05:30
if (!signedMessage) {
// Check if delegation exists but is expired
2025-08-30 18:34:50 +05:30
const isDelegationExpired =
this.delegationManager.isDelegationValid() === false;
2025-08-30 18:34:50 +05:30
2025-07-30 13:22:06 +05:30
return {
success: false,
2025-08-30 18:34:50 +05:30
error: isDelegationExpired
2025-07-30 13:22:06 +05:30
? 'Key delegation expired. Please re-delegate your key through the profile menu.'
2025-08-30 18:34:50 +05:30
: 'Key delegation required. Please delegate a signing key from your profile menu to post without wallet approval for each action.',
2025-07-30 13:22:06 +05:30
};
}
2025-08-30 18:34:50 +05:30
2025-07-30 13:22:06 +05:30
await messageManager.sendMessage(signedMessage);
2025-08-30 18:34:50 +05:30
2025-07-30 13:22:06 +05:30
return {
success: true,
2025-08-30 18:34:50 +05:30
message: signedMessage,
2025-07-30 13:22:06 +05:30
};
} catch (error) {
2025-08-30 18:34:50 +05:30
console.error('Error signing and sending message:', error);
let errorMessage = 'Failed to sign and send message. Please try again.';
2025-07-30 13:22:06 +05:30
if (error instanceof Error) {
2025-08-30 18:34:50 +05:30
if (
error.message.includes('timeout') ||
error.message.includes('network')
) {
errorMessage =
'Network issue detected. Please check your connection and try again.';
} else if (
error.message.includes('rejected') ||
error.message.includes('denied')
) {
errorMessage =
'Wallet signature request was rejected. Please approve signing to continue.';
2025-07-30 13:22:06 +05:30
} else {
errorMessage = error.message;
}
}
2025-08-30 18:34:50 +05:30
2025-07-30 13:22:06 +05:30
return {
success: false,
2025-08-30 18:34:50 +05:30
error: errorMessage,
2025-07-30 13:22:06 +05:30
};
}
}
/**
* Verify a message signature
*/
verifyMessage(message: OpchanMessage): boolean {
return this.delegationManager.verifyMessage(message);
2025-07-30 13:22:06 +05:30
}
2025-08-30 18:34:50 +05:30
}