1. /**
  2. * Verifies the integrity of headers metadata for an experiment.
  3. *
  4. * @param {object} headers An object containing the headers metadata.
  5. * @returns {string|null} A success message if headers are valid, or an error message if not. Returns null if headers is invalid.
  6. */
  7. function verifyHeadersMetadata(headers) {
  8. if (!headers || typeof headers !== 'object') {
  9. return "Error: Headers metadata must be an object.";
  10. }
  11. if (typeof headers.timestamp !== 'number') {
  12. return "Error: Timestamp must be a number.";
  13. }
  14. if (typeof headers.version !== 'string' || headers.version.trim() === "") {
  15. return "Error: Version must be a non-empty string.";
  16. }
  17. if (typeof headers.experimentId !== 'string' || headers.experimentId.trim() === "") {
  18. return "Error: Experiment ID must be a non-empty string.";
  19. }
  20. if (headers.signature !== generateSignature(headers)) {
  21. return "Error: Signature does not match the headers metadata.";
  22. }
  23. return null; // Headers metadata is valid.
  24. }
  25. /**
  26. * Generates a signature based on the headers metadata.
  27. * @param {object} headers The headers metadata.
  28. * @returns {string} The generated signature.
  29. */
  30. function generateSignature(headers) {
  31. const str = JSON.stringify(headers); // Convert headers to JSON string.
  32. const hash = crypto.createHash('sha256').update(str).digest('hex'); // Calculate SHA256 hash.
  33. return hash;
  34. }
  35. // Check if crypto is available. This is needed for the signature generation
  36. if (typeof window === 'undefined' || typeof window.crypto === 'undefined') {
  37. console.warn("crypto API is not available in this environment. Signature verification will be disabled.");
  38. generateSignature = () => "Signature generation is disabled";
  39. }
  40. // Example usage (for testing):
  41. // const headers = {
  42. // timestamp: Date.now(),
  43. // version: "1.0",
  44. // experimentId: "myExperiment",
  45. // otherHeader: "someValue"
  46. // };
  47. // const errorMessage = verifyHeadersMetadata(headers);
  48. // if (errorMessage) {
  49. // console.error(errorMessage);
  50. // } else {
  51. // console.log("Headers metadata is valid.");
  52. // }

Add your comment