11-module (ar_bundles ).
2- -export ([signer /1 , is_signed / 1 ]).
3- -export ([id /1 , id /2 , hd /1 , member /2 , find /2 , tagfind / 3 ]).
2+ -export ([signer /1 ]).
3+ -export ([id /1 , id /2 , hd /1 , member /2 , find /2 ]).
44-export ([new_item /4 , sign_item /2 , verify_item /1 ]).
55-export ([encode_tags /1 , decode_tags /1 ]).
6- -export ([serialize /1 , deserialize /1 , serialize_data / 1 , serialize_bundle /2 ]).
6+ -export ([serialize /1 , deserialize /1 , serialize_bundle /2 ]).
77-export ([data_item_signature_data /1 ]).
8- -export ([type /1 ]).
98-include (" include/hb.hrl" ).
109-include_lib (" eunit/include/eunit.hrl" ).
1110
1918signer (# tx { owner = ? DEFAULT_OWNER }) -> undefined ;
2019signer (Item ) -> crypto :hash (sha256 , Item # tx .owner ).
2120
22- % % @doc Check if an item is signed.
23- is_signed (Item ) ->
24- Item # tx .signature =/= ? DEFAULT_SIG .
25-
2621% % @doc Return the ID of an item -- either signed or unsigned as specified.
2722% % If the item is unsigned and the user requests the signed ID, we return
2823% % the atom `not_signed'. In all other cases, we return the ID of the item.
@@ -76,17 +71,6 @@ find(Key, Item = #tx { data = Data }) ->
7671find (_Key , _ ) ->
7772 not_found .
7873
79- % % @doc Case-insensitively find a tag in a list and return its value.
80- tagfind (Key , Tags , Default ) ->
81- LowerCaseKey = hb_util :to_lower (Key ),
82- Found = lists :search (fun ({TagName , _ }) ->
83- hb_util :to_lower (TagName ) == LowerCaseKey
84- end , Tags ),
85- case Found of
86- {value , {_TagName , Value }} -> Value ;
87- false -> Default
88- end .
89-
9074% % @doc Create a new data item. Should only be used for testing.
9175new_item (Target , Anchor , Tags , Data ) ->
9276 dev_arweave_common :reset_ids (
@@ -196,7 +180,7 @@ enforce_valid_tx(TX) ->
196180% % @doc Generate the data segment to be signed for a data item.
197181data_item_signature_data (RawItem ) ->
198182 true = enforce_valid_tx (RawItem ),
199- Item = serialize_data (RawItem ),
183+ Item = dev_arweave_common : serialize_data (RawItem ),
200184 ar_deep_hash :hash ([
201185 utf8_encoded (" dataitem" ),
202186 utf8_encoded (" 1" ),
@@ -237,7 +221,7 @@ serialize(not_found) -> throw(not_found);
237221serialize (TX ) when is_binary (TX ) -> TX ;
238222serialize (RawTX ) when is_record (RawTX , tx ) ->
239223 true = enforce_valid_tx (RawTX ),
240- TX = serialize_data (RawTX ),
224+ TX = dev_arweave_common : serialize_data (RawTX ),
241225 EncodedTags = encode_tags (TX # tx .tags ),
242226 <<
243227 (encode_signature_type (TX # tx .signature_type ))/binary ,
@@ -252,27 +236,6 @@ serialize(RawTX) when is_record(RawTX, tx) ->
252236serialize (TX ) ->
253237 throw ({cannot_serialize_tx , must_be_binary_or_tx , TX }).
254238
255- serialize_data (Item = # tx {data = Data }) when is_binary (Data ) ->
256- Item ;
257- serialize_data (Item = # tx {data = Data }) ->
258- IsBundleMap = type (Item ) == map ,
259- ? event ({serialize_data ,
260- hb_util :human_id (Item # tx .unsigned_id ), hb_util :human_id (Item # tx .id ),
261- {is_bundle_map , IsBundleMap },
262- {is_list , is_list (Data )},
263- {is_map , is_map (Data )}}),
264- ConvertedData =
265- case {IsBundleMap , is_list (Data ), is_map (Data )} of
266- {true , true , false } ->
267- dev_arweave_common :convert_bundle_list_to_map (Data );
268- {false , false , true } ->
269- dev_arweave_common :convert_bundle_map_to_list (Data );
270- _ ->
271- Data
272- end ,
273- {Manifest , SerializedData } = serialize_bundle (ConvertedData , false ),
274- Item # tx {data = SerializedData , manifest = Manifest }.
275-
276239serialize_bundle (List , Normalize ) when is_list (List ) ->
277240 FinalizedData = finalize_bundle_data (
278241 lists :map (
@@ -303,7 +266,7 @@ serialize_bundle(Map, Normalize) when is_map(Map) ->
303266 [{NewManifestUnsignedID , NewManifestSerialized } | maps :values (BinItems )]),
304267 {NewManifest , FinalizedData };
305268serialize_bundle (Data , _Normalize ) when is_binary (Data ) ->
306- Data ;
269+ { undefined , Data } ;
307270serialize_bundle (Data , _Normalize ) ->
308271 throw ({cannot_serialize_tx_data , must_be_list_or_map , Data }).
309272
@@ -454,21 +417,8 @@ deserialize_item(Binary) ->
454417 })
455418 ).
456419
457- type (Item ) ->
458- Format = tagfind (<<" bundle-format" >>, Item # tx .tags , <<>>),
459- Version = tagfind (<<" bundle-version" >>, Item # tx .tags , <<>>),
460- MapTXID = tagfind (<<" bundle-map" >>, Item # tx .tags , <<>>),
461- case {hb_util :to_lower (Format ), hb_util :to_lower (Version ), MapTXID } of
462- {<<" binary" >>, <<" 2.0.0" >>, <<>>} ->
463- list ;
464- {<<" binary" >>, <<" 2.0.0" >>, _ } ->
465- map ;
466- _ ->
467- binary
468- end .
469-
470420maybe_unbundle (Item ) ->
471- case type (Item ) of
421+ case dev_arweave_common : type (Item ) of
472422 list -> unbundle_list (Item );
473423 binary -> Item ;
474424 map -> unbundle_map (Item )
@@ -481,7 +431,7 @@ unbundle_list(Item) ->
481431 end .
482432
483433unbundle_map (Item ) ->
484- MapTXID = tagfind (<<" bundle-map" >>, Item # tx .tags , <<>>),
434+ MapTXID = dev_arweave_common : tagfind (<<" bundle-map" >>, Item # tx .tags , <<>>),
485435 case unbundle (Item # tx .data ) of
486436 detached -> Item # tx {data = detached };
487437 Items ->
@@ -921,7 +871,7 @@ arbundles_list_bundle_roundtrip_test() ->
921871 ? assert (verify_item (Item2 )),
922872 ? assert (verify_item (Item3 )),
923873
924- Reserialized = serialize_data (Deserialized ),
874+ Reserialized = dev_arweave_common : normalize (Deserialized ),
925875 ? event (debug_test , {reserialized , Reserialized }),
926876 ? assert (verify_item (Reserialized )),
927877 ? assertEqual (Bin , Reserialized # tx .data ),
@@ -952,7 +902,7 @@ arbundles_single_list_bundle_roundtrip_test() ->
952902 ? assertEqual ([{<<" Type" >>, <<" list" >>}, {<<" Index" >>, <<" 1" >>}], Item # tx .tags ),
953903 ? assert (verify_item (Item )),
954904
955- Reserialized = serialize_data (Deserialized ),
905+ Reserialized = dev_arweave_common : normalize (Deserialized ),
956906 ? event (debug_test , {reserialized , Reserialized }),
957907 ? assert (verify_item (Reserialized )),
958908 ? assertEqual (Bin , Reserialized # tx .data ),
@@ -984,7 +934,7 @@ arbundles_map_bundle_roundtrip_test() ->
984934 Manifest = Deserialized # tx .manifest ,
985935 ? event (debug_test , {manifest , Manifest }),
986936 ? assertNotEqual (undefined , Manifest ),
987- ? assertEqual (false , is_signed (Manifest )),
937+ ? assertEqual (false , dev_arweave_common : is_signed (Manifest )),
988938 ? assertEqual ([
989939 {<<" data-protocol" >>, <<" bundle-map" >>},
990940 {<<" variant" >>, <<" 0.0.1" >>}
0 commit comments