mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-06-04 05:18:13 +02:00
260 lines
10 KiB
TypeScript
260 lines
10 KiB
TypeScript
import type {
|
|
DesktopControlCommand,
|
|
DesktopGateComposePayload,
|
|
DesktopGateDecryptBatchPayload,
|
|
DesktopGateDecryptPayload,
|
|
DesktopGatePersonaActivatePayload,
|
|
DesktopGatePersonaCreatePayload,
|
|
DesktopGateRequestPayload,
|
|
DesktopGateRotatePayload,
|
|
DesktopNewsFeedPayload,
|
|
DesktopPrivacySettingsPayload,
|
|
DesktopWormholeSettingsPayload,
|
|
LocalControlInvokeRequest,
|
|
} from '@/lib/desktopControlContract';
|
|
|
|
export type DesktopControlHttpRequest = {
|
|
path: string;
|
|
method: string;
|
|
payload?:
|
|
| DesktopWormholeSettingsPayload
|
|
| DesktopPrivacySettingsPayload
|
|
| DesktopNewsFeedPayload[]
|
|
| DesktopGateRequestPayload
|
|
| DesktopGatePersonaCreatePayload
|
|
| DesktopGatePersonaActivatePayload
|
|
| DesktopGateRotatePayload
|
|
| DesktopGateComposePayload
|
|
| DesktopGateDecryptPayload
|
|
| DesktopGateDecryptBatchPayload;
|
|
};
|
|
|
|
function parseJsonBody(bodyText?: string): unknown {
|
|
if (!bodyText) return undefined;
|
|
try {
|
|
return JSON.parse(bodyText);
|
|
} catch {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export function commandToHttpRequest(
|
|
command: DesktopControlCommand,
|
|
payload?: unknown,
|
|
): DesktopControlHttpRequest {
|
|
switch (command) {
|
|
case 'wormhole.status':
|
|
return { path: '/api/wormhole/status', method: 'GET' };
|
|
case 'wormhole.connect':
|
|
return { path: '/api/wormhole/connect', method: 'POST' };
|
|
case 'wormhole.disconnect':
|
|
return { path: '/api/wormhole/disconnect', method: 'POST' };
|
|
case 'wormhole.restart':
|
|
return { path: '/api/wormhole/restart', method: 'POST' };
|
|
case 'wormhole.gate.enter':
|
|
return {
|
|
path: '/api/wormhole/gate/enter',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateRequestPayload,
|
|
};
|
|
case 'wormhole.gate.leave':
|
|
return {
|
|
path: '/api/wormhole/gate/leave',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateRequestPayload,
|
|
};
|
|
case 'wormhole.gate.personas.get':
|
|
return {
|
|
path: `/api/wormhole/gate/${encodeURIComponent((payload as DesktopGateRequestPayload).gate_id)}/personas`,
|
|
method: 'GET',
|
|
};
|
|
case 'wormhole.gate.persona.create':
|
|
return {
|
|
path: '/api/wormhole/gate/persona/create',
|
|
method: 'POST',
|
|
payload: payload as DesktopGatePersonaCreatePayload,
|
|
};
|
|
case 'wormhole.gate.persona.activate':
|
|
return {
|
|
path: '/api/wormhole/gate/persona/activate',
|
|
method: 'POST',
|
|
payload: payload as DesktopGatePersonaActivatePayload,
|
|
};
|
|
case 'wormhole.gate.persona.clear':
|
|
return {
|
|
path: '/api/wormhole/gate/persona/clear',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateRequestPayload,
|
|
};
|
|
case 'wormhole.gate.key.get':
|
|
return {
|
|
path: `/api/wormhole/gate/${encodeURIComponent((payload as DesktopGateRequestPayload).gate_id)}/key`,
|
|
method: 'GET',
|
|
};
|
|
case 'wormhole.gate.key.rotate':
|
|
return {
|
|
path: '/api/wormhole/gate/key/rotate',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateRotatePayload,
|
|
};
|
|
case 'wormhole.gate.state.resync':
|
|
return {
|
|
path: '/api/wormhole/gate/state/export',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateRequestPayload,
|
|
};
|
|
case 'wormhole.gate.proof':
|
|
return {
|
|
path: '/api/wormhole/gate/proof',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateRequestPayload,
|
|
};
|
|
case 'wormhole.gate.message.compose':
|
|
return {
|
|
path: '/api/wormhole/gate/message/compose',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateComposePayload,
|
|
};
|
|
case 'wormhole.gate.message.post':
|
|
return {
|
|
path: '/api/wormhole/gate/message/post',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateComposePayload,
|
|
};
|
|
case 'wormhole.gate.message.decrypt':
|
|
return {
|
|
path: '/api/wormhole/gate/message/decrypt',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateDecryptPayload,
|
|
};
|
|
case 'wormhole.gate.messages.decrypt':
|
|
return {
|
|
path: '/api/wormhole/gate/messages/decrypt',
|
|
method: 'POST',
|
|
payload: payload as DesktopGateDecryptBatchPayload,
|
|
};
|
|
case 'settings.wormhole.get':
|
|
return { path: '/api/settings/wormhole', method: 'GET' };
|
|
case 'settings.wormhole.set':
|
|
return { path: '/api/settings/wormhole', method: 'PUT', payload: payload as DesktopWormholeSettingsPayload };
|
|
case 'settings.privacy.get':
|
|
return { path: '/api/settings/privacy-profile', method: 'GET' };
|
|
case 'settings.privacy.set':
|
|
return {
|
|
path: '/api/settings/privacy-profile',
|
|
method: 'PUT',
|
|
payload: payload as DesktopPrivacySettingsPayload,
|
|
};
|
|
case 'settings.api_keys.get':
|
|
return { path: '/api/settings/api-keys', method: 'GET' };
|
|
case 'settings.news.get':
|
|
return { path: '/api/settings/news-feeds', method: 'GET' };
|
|
case 'settings.news.set':
|
|
return { path: '/api/settings/news-feeds', method: 'PUT', payload: payload as DesktopNewsFeedPayload[] };
|
|
case 'settings.news.reset':
|
|
return { path: '/api/settings/news-feeds/reset', method: 'POST' };
|
|
case 'system.update':
|
|
return { path: '/api/system/update', method: 'POST' };
|
|
default: {
|
|
const exhaustive: never = command;
|
|
throw new Error(`desktop_control_command_unsupported:${exhaustive}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
export function httpRequestToInvokeRequest(
|
|
path: string,
|
|
method: string,
|
|
bodyText?: string,
|
|
): LocalControlInvokeRequest | null {
|
|
const payload = parseJsonBody(bodyText);
|
|
const upperMethod = method.toUpperCase();
|
|
if (upperMethod === 'GET' && path === '/api/wormhole/status') {
|
|
return { command: 'wormhole.status', payload: undefined };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/connect') {
|
|
return { command: 'wormhole.connect', payload: undefined };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/disconnect') {
|
|
return { command: 'wormhole.disconnect', payload: undefined };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/restart') {
|
|
return { command: 'wormhole.restart', payload: undefined };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/enter') {
|
|
return { command: 'wormhole.gate.enter', payload: payload as DesktopGateRequestPayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/leave') {
|
|
return { command: 'wormhole.gate.leave', payload: payload as DesktopGateRequestPayload };
|
|
}
|
|
if (upperMethod === 'GET' && /^\/api\/wormhole\/gate\/[^/]+\/personas$/.test(path)) {
|
|
const gateId = decodeURIComponent(path.split('/')[4] || '');
|
|
return { command: 'wormhole.gate.personas.get', payload: { gate_id: gateId } };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/persona/create') {
|
|
return { command: 'wormhole.gate.persona.create', payload: payload as DesktopGatePersonaCreatePayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/persona/activate') {
|
|
return { command: 'wormhole.gate.persona.activate', payload: payload as DesktopGatePersonaActivatePayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/persona/clear') {
|
|
return { command: 'wormhole.gate.persona.clear', payload: payload as DesktopGateRequestPayload };
|
|
}
|
|
if (upperMethod === 'GET' && /^\/api\/wormhole\/gate\/[^/]+\/key$/.test(path)) {
|
|
const gateId = decodeURIComponent(path.split('/')[4] || '');
|
|
return { command: 'wormhole.gate.key.get', payload: { gate_id: gateId } };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/key/rotate') {
|
|
return { command: 'wormhole.gate.key.rotate', payload: payload as DesktopGateRotatePayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/state/export') {
|
|
return { command: 'wormhole.gate.state.resync', payload: payload as DesktopGateRequestPayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/proof') {
|
|
return { command: 'wormhole.gate.proof', payload: payload as DesktopGateRequestPayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/message/compose') {
|
|
return { command: 'wormhole.gate.message.compose', payload: payload as DesktopGateComposePayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/message/post') {
|
|
return { command: 'wormhole.gate.message.post', payload: payload as DesktopGateComposePayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/message/decrypt') {
|
|
return { command: 'wormhole.gate.message.decrypt', payload: payload as DesktopGateDecryptPayload };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/wormhole/gate/messages/decrypt') {
|
|
return {
|
|
command: 'wormhole.gate.messages.decrypt',
|
|
payload: payload as DesktopGateDecryptBatchPayload,
|
|
};
|
|
}
|
|
if (upperMethod === 'GET' && path === '/api/settings/wormhole') {
|
|
return { command: 'settings.wormhole.get', payload: undefined };
|
|
}
|
|
if (upperMethod === 'PUT' && path === '/api/settings/wormhole') {
|
|
return { command: 'settings.wormhole.set', payload: payload as DesktopWormholeSettingsPayload };
|
|
}
|
|
if (upperMethod === 'GET' && path === '/api/settings/privacy-profile') {
|
|
return { command: 'settings.privacy.get', payload: undefined };
|
|
}
|
|
if (upperMethod === 'PUT' && path === '/api/settings/privacy-profile') {
|
|
return { command: 'settings.privacy.set', payload: payload as DesktopPrivacySettingsPayload };
|
|
}
|
|
if (upperMethod === 'GET' && path === '/api/settings/api-keys') {
|
|
return { command: 'settings.api_keys.get', payload: undefined };
|
|
}
|
|
if (upperMethod === 'GET' && path === '/api/settings/news-feeds') {
|
|
return { command: 'settings.news.get', payload: undefined };
|
|
}
|
|
if (upperMethod === 'PUT' && path === '/api/settings/news-feeds') {
|
|
return { command: 'settings.news.set', payload: payload as DesktopNewsFeedPayload[] };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/settings/news-feeds/reset') {
|
|
return { command: 'settings.news.reset', payload: undefined };
|
|
}
|
|
if (upperMethod === 'POST' && path === '/api/system/update') {
|
|
return { command: 'system.update', payload: undefined };
|
|
}
|
|
return null;
|
|
}
|