Skip to content

Commit 24e2c9e

Browse files
committed
fix: replace node buffers with uint8arrays
Pulls in the latest interface-datastore and replaces use of node Buffers with Uint8Arrays Depends on: - [ ] ipfs/interface-datastore#43 - [ ] ipfs/js-datastore-core#27 - [ ] libp2p/js-libp2p-record#23
1 parent 9b1aaca commit 24e2c9e

File tree

5 files changed

+37
-39
lines changed

5 files changed

+37
-39
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ Try to subscribe a topic with Pubsub and receive the current local value if avai
7575

7676
Arguments:
7777

78-
- `key` (Buffer): a key representing a unique identifier of the object to subscribe.
78+
- `key` (Uint8Array): a key representing a unique identifier of the object to subscribe.
7979

80-
Returns `Promise<Buffer>` containing the most recent known record stored.
80+
Returns `Promise<Uint8Array>` containing the most recent known record stored.
8181

8282
#### Put
8383

@@ -89,8 +89,8 @@ Publishes a value through pubsub.
8989

9090
Arguments:
9191

92-
- `key` (Buffer): a key representing a unique identifier of the object to publish.
93-
- `val` (Buffer): value to be propagated.
92+
- `key` (Uint8Array): a key representing a unique identifier of the object to publish.
93+
- `val` (Uint8Array): value to be propagated.
9494

9595
Returns `Promise<void>`
9696

@@ -104,7 +104,7 @@ Unsubscribe a previously subscribe value.
104104

105105
Arguments:
106106

107-
- `key` (Buffer): a key representing a unique identifier of the object to publish.
107+
- `key` (Uint8Array): a key representing a unique identifier of the object to publish.
108108

109109
Returns `Promise<void>`
110110

package.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,18 @@
3232
},
3333
"homepage": "https://github.com/ipfs/js-datastore-pubsub#readme",
3434
"dependencies": {
35-
"buffer": "^5.6.0",
3635
"debug": "^4.1.1",
3736
"err-code": "^2.0.3",
38-
"interface-datastore": "^1.0.4",
39-
"multibase": "^0.7.0"
37+
"interface-datastore": "ipfs/interface-datastore#fix/remove-node-buffer",
38+
"multibase": "^2.0.0"
4039
},
4140
"devDependencies": {
4241
"aegir": "^25.0.0",
43-
"chai": "^4.2.0",
4442
"detect-node": "^2.0.4",
45-
"dirty-chai": "^2.0.1",
43+
"ipfs-utils": "^2.3.1",
4644
"it-pair": "^1.0.0",
4745
"libp2p-gossipsub": "^0.4.5",
48-
"libp2p-record": "^0.7.3",
46+
"libp2p-record": "libp2p/js-libp2p-record#fix/support-uint8arrays-in-place-of-buffers",
4947
"p-wait-for": "^3.1.0",
5048
"peer-id": "^0.13.13",
5149
"sinon": "^9.0.2"

src/index.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
'use strict'
22

3-
const { Buffer } = require('buffer')
43
const { Key, Adapter } = require('interface-datastore')
54
const { encodeBase32, keyToTopic, topicToKey } = require('./utils')
65

@@ -54,20 +53,20 @@ class DatastorePubsub extends Adapter {
5453

5554
/**
5655
* Publishes a value through pubsub.
57-
* @param {Buffer} key identifier of the value to be published.
58-
* @param {Buffer} val value to be propagated.
56+
* @param {Uint8Array} key identifier of the value to be published.
57+
* @param {Uint8Array} val value to be propagated.
5958
* @returns {Promise}
6059
*/
6160
async put (key, val) { // eslint-disable-line require-await
62-
if (!Buffer.isBuffer(key)) {
61+
if (!(key instanceof Uint8Array)) {
6362
const errMsg = 'datastore key does not have a valid format'
6463

6564
log.error(errMsg)
6665
throw errcode(new Error(errMsg), 'ERR_INVALID_DATASTORE_KEY')
6766
}
6867

69-
if (!Buffer.isBuffer(val)) {
70-
const errMsg = 'received value is not a buffer'
68+
if (!(val instanceof Uint8Array)) {
69+
const errMsg = 'received value is not a Uint8Array'
7170

7271
log.error(errMsg)
7372
throw errcode(new Error(errMsg), 'ERR_INVALID_VALUE_RECEIVED')
@@ -83,11 +82,11 @@ class DatastorePubsub extends Adapter {
8382

8483
/**
8584
* Try to subscribe a topic with Pubsub and returns the local value if available.
86-
* @param {Buffer} key identifier of the value to be subscribed.
87-
* @returns {Promise<Buffer>}
85+
* @param {Uint8Array} key identifier of the value to be subscribed.
86+
* @returns {Promise<Uint8Array>}
8887
*/
8988
async get (key) {
90-
if (!Buffer.isBuffer(key)) {
89+
if (!(key instanceof Uint8Array)) {
9190
const errMsg = 'datastore key does not have a valid format'
9291

9392
log.error(errMsg)
@@ -118,7 +117,7 @@ class DatastorePubsub extends Adapter {
118117

119118
/**
120119
* Unsubscribe topic.
121-
* @param {Buffer} key identifier of the value to unsubscribe.
120+
* @param {Uint8Array} key identifier of the value to unsubscribe.
122121
* @returns {void}
123122
*/
124123
unsubscribe (key) {
@@ -148,7 +147,7 @@ class DatastorePubsub extends Adapter {
148147
throw errcode(new Error(errMsg), 'ERR_NOT_FOUND')
149148
}
150149

151-
if (!Buffer.isBuffer(dsVal)) {
150+
if (!(dsVal instanceof Uint8Array)) {
152151
const errMsg = 'found record that we couldn\'t convert to a value'
153152

154153
log.error(errMsg)
@@ -210,7 +209,7 @@ class DatastorePubsub extends Adapter {
210209
}
211210

212211
if (isBetter) {
213-
await this._storeRecord(Buffer.from(key), data)
212+
await this._storeRecord(key, data)
214213
}
215214
}
216215

src/utils.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
const multibase = require('multibase')
44
const errcode = require('err-code')
5+
const TextEncoder = require('ipfs-utils/src/text-encoder')
6+
const TextDecoder = require('ipfs-utils/src/text-decoder')
7+
const utf8Encoder = new TextEncoder('utf8')
8+
const utf8Decoder = new TextDecoder('utf8')
59

610
const namespace = '/record/'
711
const base64urlCode = 'u' // base64url code from multibase
@@ -14,7 +18,11 @@ module.exports.encodeBase32 = (buf) => {
1418
module.exports.keyToTopic = (key) => {
1519
// Record-store keys are arbitrary binary. However, pubsub requires UTF-8 string topic IDs
1620
// Encodes to "/record/base64url(key)"
17-
const b64url = multibase.encode('base64url', key).slice(1).toString()
21+
if (typeof key === 'string' || key instanceof String) {
22+
key = utf8Encoder.encode(key)
23+
}
24+
25+
const b64url = utf8Decoder.decode(multibase.encode('base64url', key).slice(1))
1826

1927
return `${namespace}${b64url}`
2028
}

test/index.spec.js

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
/* eslint-env mocha */
22
'use strict'
33

4-
const { Buffer } = require('buffer')
5-
const chai = require('chai')
6-
const dirtyChai = require('dirty-chai')
7-
const expect = chai.expect
8-
chai.use(dirtyChai)
4+
const { expect } = require('aegir/utils/chai')
95
const sinon = require('sinon')
106
const errcode = require('err-code')
117
const isNode = require('detect-node')
8+
const TextEncoder = require('ipfs-utils/src/text-encoder')
9+
const utf8Encoder = new TextEncoder('utf8')
1210

1311
const DatastorePubsub = require('../src')
1412

@@ -85,7 +83,7 @@ describe('datastore-pubsub', function () {
8583
beforeEach(() => {
8684
keyRef = `key${testCounter}`
8785
key = (new Key(keyRef)).toBuffer()
88-
record = new Record(key, Buffer.from(value))
86+
record = new Record(key, utf8Encoder.encode(value))
8987

9088
serializedRecord = record.serialize()
9189
})
@@ -110,13 +108,8 @@ describe('datastore-pubsub', function () {
110108
expect(subscribers).to.exist()
111109
expect(subscribers).to.not.include(subsTopic) // not subscribed key reference yet
112110

113-
const res = await dsPubsubA.get(key)
114-
.then(() => expect.fail('Should have failed to fetch key'), (err) => {
115-
// not locally stored record
116-
expect(err.code).to.equal('ERR_NOT_FOUND')
117-
})
118-
119-
expect(res).to.not.exist()
111+
// not locally stored record
112+
await expect(dsPubsubA.get(key)).to.eventually.be.rejected().with.property('code', 'ERR_NOT_FOUND')
120113

121114
subscribers = await pubsubA.getTopics()
122115

@@ -327,7 +320,7 @@ describe('datastore-pubsub', function () {
327320
}
328321

329322
const newValue = 'new value'
330-
const record = new Record(key, Buffer.from(newValue))
323+
const record = new Record(key, utf8Encoder.encode(newValue))
331324
const newSerializedRecord = record.serialize()
332325

333326
const dsPubsubA = new DatastorePubsub(pubsubA, datastoreA, peerIdA, smoothValidator)
@@ -377,7 +370,7 @@ describe('datastore-pubsub', function () {
377370
}
378371

379372
const newValue = 'new value'
380-
const record = new Record(key, Buffer.from(newValue))
373+
const record = new Record(key, utf8Encoder.encode(newValue))
381374
const newSerializedRecord = record.serialize()
382375

383376
const dsPubsubA = new DatastorePubsub(pubsubA, datastoreA, peerIdA, smoothValidator)

0 commit comments

Comments
 (0)