module Sidetree module Model # https://identity.foundation/sidetree/spec/#provisional-proof-file class ProvisionalProofFile < CASFileBase attr_reader :update_proofs # Initialize # @param [Array[JSON::JWS]] update_proofs Array of update proof. def initialize(update_proofs) @update_proofs = update_proofs end # Parse provisional proof file from compressed data. # @param [String] proof_file compressed provisional proof file. # @param [Boolean] compressed Whether the proof_file is compressed or not, default: true. # @return [Sidetree::Model::ProvisionalProofFile] # @raise [Sidetree::Error] def self.parse(proof_file, compressed: true) decompressed = ( if compressed decompress(proof_file, Sidetree::Params::MAX_PROOF_FILE_SIZE) else proof_file end ) begin json = JSON.parse(decompressed, symbolize_names: true) json.keys.each do |k| unless k == :operations raise Sidetree::Error, "Unexpected property #{k.to_s} in provisional proof file" end end unless json[:operations] raise Sidetree::Error, "Provisional proof file does not have any operation proofs" end json[:operations].keys.each do |k| unless k == :update raise Sidetree::Error, "Unexpected property #{k.to_s} in provisional proof file" end end unless json[:operations][:update].is_a?(Array) raise Sidetree::Error, "Provisional proof file update property not array" end update_proofs = json[:operations][:update].each.map do |update| update.keys.each do |k| unless k == :signedData raise Sidetree::Error, "Unexpected property #{k.to_s} in provisional proof file" end end Sidetree::Util::JWS.parse(update[:signedData]) end if update_proofs.empty? raise Sidetree::Error, "Provisional proof file has no proof" end ProvisionalProofFile.new(update_proofs) rescue JSON::ParserError raise Sidetree::Error, "Provisional proof file is not json" end end # Build json string to be stored in CAS. # @return [String] json string. def to_json params = { operations: { update: update_proofs.map { |u| { signedData: u.to_s } } } } params.to_json end end end end