{"id":18616891,"url":"https://github.com/sile/erl-amf","last_synced_at":"2025-04-11T01:32:16.591Z","repository":{"id":7824806,"uuid":"9195870","full_name":"sile/erl-amf","owner":"sile","description":"An Erlang library to encode/decode AMF","archived":false,"fork":false,"pushed_at":"2018-03-11T10:30:39.000Z","size":1097,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-05-01T23:47:16.456Z","etag":null,"topics":["amf","erlang"],"latest_commit_sha":null,"homepage":null,"language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sile.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-04-03T13:59:08.000Z","updated_at":"2023-08-10T15:37:09.000Z","dependencies_parsed_at":"2022-09-17T04:20:45.624Z","dependency_job_id":null,"html_url":"https://github.com/sile/erl-amf","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Ferl-amf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Ferl-amf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Ferl-amf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sile%2Ferl-amf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sile","download_url":"https://codeload.github.com/sile/erl-amf/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248325284,"owners_count":21084901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amf","erlang"],"created_at":"2024-11-07T03:38:11.953Z","updated_at":"2025-04-11T01:32:16.173Z","avatar_url":"https://github.com/sile.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ErlAMF\n\n[![hex.pm version](https://img.shields.io/hexpm/v/amf.svg)](https://hex.pm/packages/amf)\n[![Build Status](https://travis-ci.org/sile/amf.svg?branch=master)](https://travis-ci.org/sile/erl-amf)\n[![Code Coverage](https://codecov.io/gh/sile/amf/branch/master/graph/badge.svg)](https://codecov.io/gh/sile/erl-amf/branch/master)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nErlAMF is an AMF(Action Message Format) encoding/deconding library written in Erlang.\n\n[EDoc Documentation](https://hexdocs.pm/amf/)\n\n## Usage\n### Build\n\nErlAMF uses [rebar3](https://github.com/erlang/rebar3) as build tool.\n\n```sh\n# build\n$ git clone git://github.com/sile/erl-amf.git\n$ cd erl-amf\n$ rebar3 compile\n\n# run unit tests\n$ rebar3 eunit\n```\n\n### Examples\n\n```erlang\n$ erl -pa ebin\n\n%%%\n%%% Encode and Decode\n%%%\n%%% AMF3 encode\n1\u003e {ok, IoList} = amf:encode(amf3, [1,2,3]).\n{ok,[9,7,[1],[[4,1],[4,2],[4,3]]]}\n\n%% AMF3 decode\n2\u003e amf:decode(amf3, list_to_binary(IoList)).\n{ok,[1,2,3],\u003c\u003c\u003e\u003e}\n\n%%%\n%%% AMF values\n%%%\n%% Load records\n%% (Records are defined in \"erl-amf/include/amf.hrl\")\n3\u003e rr(amf).\n[amf_array,amf_avmplus_object,amf_byte_array,amf_date,\n amf_dictionary,amf_exception,amf_object,amf_vector,amf_xml,\n amf_xml_document]\n\n%% Anonymous object\n4\u003e amf:object([{\u003c\u003c\"one\"\u003e\u003e, 1}, {\u003c\u003c\"two\"\u003e\u003e, 2}]).\n#amf_object{class = undefined,dynamic = true,\n            sealed_fields = [],\n            members = [{\u003c\u003c\"one\"\u003e\u003e,1},{\u003c\u003c\"two\"\u003e\u003e,2}]}\n\n5\u003e amf:encode(amf0, v(4)).\n{ok,[3,\n     [\u003c\u003c0,3\u003e\u003e, \u003c\u003c\"one\"\u003e\u003e,\n      [0,\u003c\u003c63,240,0,0,0,0,0,0\u003e\u003e],\n      \u003c\u003c0,3\u003e\u003e, \u003c\u003c\"two\"\u003e\u003e,\n      [0,\u003c\u003c64,0,0,0,0,0,0,0\u003e\u003e]],\n      0,0,9]}\n\n%% Date\n6\u003e amf:encode(amf0, amf:date(now())).\n{ok,[11,\u003c\u003c66,115,221,102,242,183,208,0,0,0\u003e\u003e]}\n\n%%%\n%%% Error\n%%%\n%% The encode/2(and decode/2) function returns an amf_exception() instance as error reason\n7\u003e amf:encode(amf0, can_not_encode).\n{error,#amf_exception{type = unsupported,\n                      message = {value,can_not_encode}}}\n\n8\u003e amf:decode(amf0, \u003c\u003c\u003e\u003e).\n{error,#amf_exception{type = partial,\n                      message = {marker,\u003c\u003c\u003e\u003e}}}\n```\n\n## Mapping between Erlang Values and AMF types(markers)\n\n\u003ctable\u003e\n\u003ctr\u003e\u003cth\u003eErlang Value\u003c/th\u003e\u003cth\u003eAMF0 Marker\u003c/th\u003e\u003cth\u003eAMF3 Marker\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e10\u003c/td\u003e\u003ctd\u003enumber\u003c/td\u003e\u003ctd\u003einteger\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e10.5\u003c/td\u003e\u003ctd\u003enumber\u003c/td\u003e\u003ctd\u003edouble\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003etrue\u003c/td\u003e\u003ctd\u003eboolean\u003c/td\u003e\u003ctd\u003etrue\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003efalse\u003c/td\u003e\u003ctd\u003eboolean\u003c/td\u003e\u003ctd\u003efalse\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003enull\u003c/td\u003e\u003ctd\u003enull\u003c/td\u003e\u003ctd\u003enull\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eundefined\u003c/td\u003e\u003ctd\u003eundefined\u003c/td\u003e\u003ctd\u003eundefined\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u0026lt;\u0026lt;\"string\"\u0026gt;\u0026gt;\u003c/td\u003e\u003ctd\u003estring | long-string\u003c/td\u003e\u003ctd\u003estring\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003emovieclip\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003erecordset\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003eunsupported\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:date(now())\u003c/td\u003e\u003ctd\u003edate\u003c/td\u003e\u003ctd\u003edate\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:xml(\u0026lt;\u0026lt;\"xml\"\u0026gt;\u0026gt;)\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003exml\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:xml_document(\u0026lt;\u0026lt;\"xml\"\u0026gt;\u0026gt;)\u003c/td\u003e\u003ctd\u003exml-document\u003c/td\u003e\u003ctd\u003exml-doc\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:byte_array(\u0026lt;\u0026lt;\"bytes\"\u0026gt;\u0026gt;)\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003ebyte-array\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:vector(int, [-1,2,-3])\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003evector-int\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:vector(uint, [1,2,3])\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003evector-uint\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:vector(double, [-1.0,2.0,-3.0])\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003evector-double\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:vector(\u003c\u003c\"type_name\"\u003e\u003e, [1,\u0026lt;\u0026lt;\"2\"\u0026gt;\u0026gt;,[3]])\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003evector-object\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e[1,2,3]\u003c/td\u003e\u003ctd\u003estrict-array\u003c/td\u003e\u003ctd\u003earray (only dense element)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:array([{\u0026lt;\u0026lt;\"key\"\u0026gt;\u0026gt;, \u0026lt;\u0026lt;\"value\"\u0026gt;\u0026gt;}])\u003c/td\u003e\u003ctd\u003eecma-array\u003c/td\u003e\u003ctd\u003earray (only associative element)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:array([1,2,3], [{\u0026lt;\u0026lt;\"key\"\u0026gt;\u0026gt;, \u0026lt;\u0026lt;\"value\"\u0026gt;\u0026gt;}])\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003earray (mixed)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:object([{\u0026lt;\u0026lt;\"key\"\u0026gt;\u0026gt;, \u0026lt;\u0026lt;\"value\"\u0026gt;\u0026gt;}])\u003c/td\u003e\u003ctd\u003eobject\u003c/td\u003e\u003ctd\u003eobject (anonymous)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:typed_object(\u0026lt;\u0026lt;\"type\"\u0026gt;\u0026gt;, [{\u0026lt;\u0026lt;\"key\"\u0026gt;\u0026gt;, \u0026lt;\u0026lt;\"value\"\u0026gt;\u0026gt;}])\u003c/td\u003e\u003ctd\u003etyped-object\u003c/td\u003e\u003ctd\u003eobject (typed)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:dictionary([{1,2}, {true, false}])\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003ctd\u003edictionary\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eamf:avmplus_object([1,2,3])\u003c/td\u003e\u003ctd\u003eavmplus-object\u003c/td\u003e\u003ctd\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## Limitations\nErlAMF doesn't support following features:\n* Circular reference objects\n* flash.utils.IExternalizable interface\n* No Object/Trait/String reference is used in encoding process\n* Special double value (e.g. NaN, Infinity)\n\n## Reference\n* [AMF0 Specification](http://download.macromedia.com/pub/labs/amf/amf0_spec_121207.pdf)\n* [AMF3 Specification](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/amf/pdf/amf-file-format-spec.pdf)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsile%2Ferl-amf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsile%2Ferl-amf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsile%2Ferl-amf/lists"}