Skip to content

Commit bd02c0c

Browse files
committed
feat: codecs table + impl
1 parent ef92d54 commit bd02c0c

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

package.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"name": "multicodec-packed",
3+
"version": "0.0.0",
4+
"description": "JavaScript implementation of the multicodec-packed specification",
5+
"main": "src/index.js",
6+
"directories": {
7+
"test": "test"
8+
},
9+
"scripts": {
10+
"test": "echo \"Error: no test specified\" && exit 1"
11+
},
12+
"repository": {
13+
"type": "git",
14+
"url": "git+https://github.com/multiformats/js-multicodec-packed.git"
15+
},
16+
"keywords": [
17+
"IPFS",
18+
"multiformats",
19+
"multicodec",
20+
"binary",
21+
"packed",
22+
"the",
23+
"data!"
24+
],
25+
"author": "David Dias <daviddias@ipfs.io>",
26+
"license": "MIT",
27+
"bugs": {
28+
"url": "https://github.com/multiformats/js-multicodec-packed/issues"
29+
},
30+
"homepage": "https://github.com/multiformats/js-multicodec-packed#readme",
31+
"dependencies": {
32+
"varint": "^4.0.1"
33+
}
34+
}

src/base-table.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const varint = require('varint')
2+
3+
exports = module.exports
4+
5+
// Miscellaneous
6+
exports.raw = varintBuf(0) // 0x00
7+
8+
// Multiformats
9+
exports.multicodec = varintBuf(64) // 0x40
10+
exports.multihash = varintBuf(65) // 0x41
11+
exports.multiaddr = varintBuf(66) // 0x42
12+
13+
// Serialization formats
14+
exports.protobuf = varintBuf(80) // 0x50
15+
exports.cbor = varintBuf(81) // 0x51
16+
exports.rlp = varintBuf(96) // 0x60
17+
18+
function varintBuf (n) {
19+
return new Buffer(varint.encode(n))
20+
}

src/index.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
'use strict'
2+
3+
const table = require('./base-table')
4+
const varint = require('varint')
5+
6+
exports = module.exports
7+
8+
exports.addPrefix = (multicodecStrOrCode, data) => {
9+
let pfx
10+
11+
if (Buffer.isBuffer(multicodecStrOrCode)) {
12+
pfx = multicodecStrOrCode
13+
} else {
14+
if (table[multicodecStrOrCode]) {
15+
pfx = table[multicodecStrOrCode]
16+
} else {
17+
throw new Error('multicodec not recognized')
18+
}
19+
}
20+
return Buffer.concat([pfx, data])
21+
}
22+
23+
exports.rmPrefix = (data) => {
24+
varint.decode(data)
25+
return data.slice(varint.decode.bytes)
26+
}
27+
28+
exports.getMulticodec = (prefixedData) => {
29+
const code = new Buffer(varint.decode(prefixedData))
30+
Object.keys(table)
31+
.forEach((multicodec) => {
32+
if (Buffer.isEqual(code, table[multicodec])) {
33+
return multicodec
34+
}
35+
})
36+
}

test/multicodec.spec.js

Whitespace-only changes.

0 commit comments

Comments
 (0)