let proofmodeModule = null;
async function initializeWasm() {
try {
const wasmModule = await import('/wasm/proofmode.js');
await wasmModule.default();
proofmodeModule = wasmModule;
self.postMessage({ type: 'initialized', success: true });
} catch (error) {
console.error('Failed to initialize WASM:', error);
self.postMessage({
type: 'initialized',
success: false,
error: error.message
});
}
}
async function checkProof(fileData, fileName) {
if (!proofmodeModule) {
throw new Error('ProofMode WASM not initialized');
}
try {
const uint8Array = new Uint8Array(fileData);
const files = [{ name: fileName, data: uint8Array }];
const result = await proofmodeModule.checkFiles(files, (msg) => {
console.log('Check progress:', msg);
});
return {
success: true,
result: JSON.parse(result)
};
} catch (error) {
return {
success: false,
error: error.message
};
}
}
async function generateProof(fileData, fileName, options) {
console.log('generateProof called with:', { fileName, options });
if (!proofmodeModule) {
throw new Error('ProofMode WASM not initialized');
}
try {
const uint8Array = new Uint8Array(fileData);
console.log('File data converted to Uint8Array, length:', uint8Array.length);
let capturedProofData = null;
let capturedCsvData = null;
const deviceInfo = {
manufacturer: options.deviceInfo?.manufacturer || 'Web Browser',
model: options.deviceInfo?.model || navigator.userAgent,
os_version: options.deviceInfo?.osVersion || navigator.platform,
...options.deviceInfo
};
const locationInfo = options.locationInfo || null;
const metadata = {
fileName: fileName,
passphrase: options.passphrase || '',
manufacturer: deviceInfo.manufacturer,
model: deviceInfo.model,
osVersion: deviceInfo.osVersion,
platform: deviceInfo.platform || '',
userAgent: deviceInfo.userAgent || '',
screenResolution: deviceInfo.screenResolution || '',
language: deviceInfo.language || '',
timezone: deviceInfo.timezone || '',
...(locationInfo && {
latitude: locationInfo.latitude.toString(),
longitude: locationInfo.longitude.toString(),
accuracy: locationInfo.accuracy ? locationInfo.accuracy.toString() : '',
locationProvider: locationInfo.provider || 'browser_geolocation'
})
};
console.log('Metadata prepared (flattened):', metadata);
console.log('Calling generate_proof_wasm...');
if (!proofmodeModule.generate_proof_wasm) {
console.error('generate_proof_wasm function not found in module');
throw new Error('WASM function generate_proof_wasm not available');
}
const callbacks = {
getDeviceInfo: () => {
console.log('getDeviceInfo callback called');
return deviceInfo; },
getLocationInfo: () => {
console.log('getLocationInfo callback called');
return locationInfo; },
getNetworkInfo: () => {
console.log('getNetworkInfo callback called');
return null;
},
saveData: (hash, filename, data) => {
console.log('saveData callback:', { hash, filename, dataLength: data.length });
return true;
},
saveText: (hash, filename, text) => {
console.log('saveText callback:', { hash, filename, textLength: text.length });
if (filename.endsWith('.proof.json')) {
capturedProofData = JSON.parse(text);
} else if (filename.endsWith('.proof.csv')) {
capturedCsvData = text;
}
return true;
},
signData: (data) => {
console.log('signData callback called, data length:', data.length);
return null;
},
notarizeHash: (hash) => {
console.log('notarizeHash callback called for hash:', hash);
return null;
}
};
console.log('Calling generate_proof_wasm with callbacks...');
const result = proofmodeModule.generate_proof_wasm(
uint8Array,
JSON.stringify(metadata),
callbacks
);
console.log('WASM function returned:', result);
if (capturedProofData) {
return {
success: true,
result: capturedProofData
};
} else {
return {
success: true,
result: {
file_hash_sha256: result,
timestamp: new Date().toISOString(),
proofPath: `${result}.proof.json`
}
};
}
} catch (error) {
console.error('Error in generateProof:', error);
console.error('Error stack:', error.stack);
return {
success: false,
error: error.message || 'Unknown error occurred'
};
}
}
self.addEventListener('message', async (event) => {
const { type, payload } = event.data;
console.log('Worker received message:', type, payload);
switch (type) {
case 'init':
await initializeWasm();
break;
case 'check':
try {
const checkResult = await checkProof(payload.fileData, payload.fileName);
self.postMessage({
type: 'checkResult',
id: payload.id,
...checkResult
});
} catch (error) {
console.error('Check error:', error);
self.postMessage({
type: 'checkResult',
id: payload.id,
success: false,
error: error.message
});
}
break;
case 'generate':
try {
console.log('Processing generate request...');
const generateResult = await generateProof(
payload.fileData,
payload.fileName,
payload.options
);
console.log('Generate result:', generateResult);
self.postMessage({
type: 'generateResult',
id: payload.id,
...generateResult
});
} catch (error) {
console.error('Generate error:', error);
self.postMessage({
type: 'generateResult',
id: payload.id,
success: false,
error: error.message
});
}
break;
default:
console.warn('Unknown message type:', type);
}
});