{"id":27464667,"url":"https://github.com/ryan-rowland/binary-schema","last_synced_at":"2025-04-15T23:01:52.829Z","repository":{"id":77191806,"uuid":"55250868","full_name":"liberty-rowland/binary-schema","owner":"liberty-rowland","description":"Blazing fast two-way serialization between JSON and binary.","archived":false,"fork":false,"pushed_at":"2016-04-07T03:30:47.000Z","size":27,"stargazers_count":7,"open_issues_count":9,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-09T16:02:50.516Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/liberty-rowland.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,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2016-04-01T17:40:52.000Z","updated_at":"2024-01-29T01:23:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"f6fe77f7-d31c-41dd-8130-d17053a8e30c","html_url":"https://github.com/liberty-rowland/binary-schema","commit_stats":{"total_commits":14,"total_committers":2,"mean_commits":7.0,"dds":0.2142857142857143,"last_synced_commit":"a17dd37c448f25af4be0f35113b937bc123b5924"},"previous_names":["liberty-rowland/binary-schema","ryan-rowland/binary-schema"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liberty-rowland%2Fbinary-schema","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liberty-rowland%2Fbinary-schema/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liberty-rowland%2Fbinary-schema/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liberty-rowland%2Fbinary-schema/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liberty-rowland","download_url":"https://codeload.github.com/liberty-rowland/binary-schema/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249167446,"owners_count":21223506,"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":[],"created_at":"2025-04-15T23:01:49.429Z","updated_at":"2025-04-15T23:01:52.785Z","avatar_url":"https://github.com/liberty-rowland.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# binary-schema\nBlazing fast two-way serialization between JSON and binary. Creates a payload\nsmaller than JSON by using a shared schema, and performs faster than JSON.parse\nand JSON.stringify.\n\n### Supported Types\nCurrently these data types are supported: **[utf8, ascii, int8, uint8,\nint16, uint16, int32, uint32, float, double]**\n\nPlanned to support: **[array, object, boolean, number]**\n\nValues can be denoted as nullable by appending a question mark: `{ title: 'ascii?' }`\n# Example Usage\n```js\nimport BinarySchema from 'binary-schema';\n\nconst characterSchema = new BinarySchema({\n  name: 'ascii',\n  title: 'ascii?',\n  race: 'uint8',\n  class: 'uint8',\n  maxHp: 'uint32'\n});\n\nconst binary = characterSchema.pack({\n  name: 'osom',\n  race: 3,\n  class: 7,\n  maxHp: 3500\n});\n\n// binary === \u003cBuffer 07 00 00 0d ac 00 04 6f 73 6f 6d 03 00\u003e\n// binary.length === 13\n\nconst json = characterSchema.unpack(binary);\n\n// json === { class: 7, maxHp: 3500, name: 'osom', race: 3 }\n// JSON.stringify(json).length === 47\n```\n\n# Unpacking from an offset\nIf you're interpreting packets, it may be useful to start reading from\nan offset. For instance, the first byte may contain a UInt8 representing the\ntype of packet you're receiving.\n\n```js\nconst schemas = {\n  0x01: new BinarySchema({ direction: 'uint8' }), // Move\n  0x02: new BinarySchema({ enemyId: 'ascii' })    // Attack\n};\n\nsocket.on('data', (message) =\u003e {\n  const commandId = message.readUInt8(0);\n  const body = schemas[commandId](message, 1);\n})\n```\n\n# API\n\n```js\nclass BinarySchema {\n  constructor(template) {\n    // Compiles pack and unpack methods from the template.\n  }\n\n  pack(json, offset) {\n    // Returns a new buffer containing the packed json.\n    // If offset is specified, [offset] number of undesignated bytes will\n    // precede the packed json (extending the length of the buffer).\n  }\n\n  unpack(buffer, offset) {\n    // Returns the json unpacked from the passed buffer.\n    // If offset is specified, unpack will begin reading from that offset.\n  }\n}\n```\n\n# Benchmarks\n\n###pack\n![pack vs stringify](https://chart.googleapis.com/chart?cht=bvg\u0026chtt=Operations+per+second+in+thousands\u0026chts=%2C%2C\u0026chd=t%3A2659.574468085106%2C2857.1428571428573%2C2500%2C2673.7967914438505%2C2604.1666666666665%2C2604.1666666666665%2C2732.24043715847%2C1992.03187250996%2C507.0993914807302%2C494.0711462450593%7C3267.97385620915%2C3401.360544217687%2C3378.3783783783783%2C3311.2582781456954%2C3424.6575342465753%2C3472.222222222222%2C2941.176470588235%2C2958.579881656805%2C499.001996007984%2C1216.54501216545\u0026chco=FF0000%2C0000FF\u0026chdl=JSON.stringify%7CBinarySchema.pack\u0026chds=a\u0026chxt=y%2Cx\u0026chxl=1%3A%7Cint8%7Cuint8%7Cint16%7Cuint16%7Cint32%7Cuint32%7Cfloat%7Cdouble%7Cutf8%7Cascii\u0026chbh=a%2C4%2C23\u0026chdlp=b%7Cl\u0026chs=600x400)\n\n###unpack\n![unpack vs parse](https://chart.googleapis.com/chart?cht=bvg\u0026chtt=Operations+per+second+in+thousands\u0026chts=%2C%2C\u0026chd=t%3A2747.252747252747%2C2958.579881656805%2C2793.2960893854747%2C2824.858757062147%2C2732.24043715847%2C2857.1428571428573%2C2873.5632183908046%2C1960.7843137254902%2C720.4610951008646%2C682.1282401091405%7C33333.333333333336%2C33333.333333333336%2C33333.333333333336%2C35714.28571428572%2C27777.777777777777%2C35714.28571428572%2C12500%2C10204.081632653062%2C3571.4285714285716%2C4201.680672268908\u0026chco=FF0000%2C0000FF\u0026chdl=JSON.parse%7CBinarySchema.unpack\u0026chds=a\u0026chxt=y%2Cx\u0026chxl=1%3A%7Cint8%7Cuint8%7Cint16%7Cuint16%7Cint32%7Cuint32%7Cfloat%7Cdouble%7Cutf8%7Cascii\u0026chbh=a%2C4%2C23\u0026chdlp=b%7Cl\u0026chs=600x400)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryan-rowland%2Fbinary-schema","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryan-rowland%2Fbinary-schema","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryan-rowland%2Fbinary-schema/lists"}