Skip to content

Commit

Permalink
Add Firehose
Browse files Browse the repository at this point in the history
  • Loading branch information
antigravities committed Apr 12, 2019
1 parent 9cc6433 commit d6e7bfb
Show file tree
Hide file tree
Showing 6 changed files with 178 additions and 64 deletions.
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

API wrapper for Barter.vg

![](https://nodei.co/npm/libbarter.png)

# [Documentation](https://github.com/antigravities/libbarter/wiki)

# Example
Expand All @@ -16,10 +18,24 @@ const Barter = require("./index.js");
let firstOffer = await offers[Object.keys(offers)[0]].getFullOffer();
let firstItem = firstOffer.items.to[0];
let firstFullItem = await firstItem.getFullItem();
console.log(firstFullItem);
})();
```

# Tests

libbarter comes with a test suite powered by [jest](https://jestjs.io) that evaluates many features.

```
git clone https://github.com/antigravities/libbarter
cd libbarter
npm i --dev
npm test
```

Grab a cup of tea, tests may take up to 2 minutes to complete as `GlobalOfferCollector` is covered.

# License

[LGPL v3](https://www.gnu.org/licenses/lgpl-3.0.en.html)
10 changes: 8 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ module.exports = class Barter {
this.myCookie = myCookie;

this._cached = {};
this._firehose = {};

this._request = require("request-promise");
this._he = require("he");
Expand All @@ -20,6 +21,8 @@ module.exports = class Barter {
this._Item = require("./lib/item.js");
this._GlobalOfferCollector = require("./lib/globaloffercollector.js");
this._FeedOffer = require("./lib/feedoffer.js");
this._Firehose = require("./lib/firehose.js");
this._FirehoseItem = require("./lib/firehoseitem.js");

this._Symbols = require("./lib/symbols.js");
}
Expand Down Expand Up @@ -104,8 +107,11 @@ module.exports = class Barter {
}

getGlobalOfferCollector(pollTime = 30000) {
if (this._globalOfferCollector) return this._globalOfferCollector;
else return new this._GlobalOfferCollector(pollTime, this);
return new this._GlobalOfferCollector(pollTime, this);
}

getFirehose(hose, cache = [], pollTime = 300000){
return new this._Firehose(hose, cache, pollTime, this);
}

async getUserBySteamID(steamid) {
Expand Down
38 changes: 38 additions & 0 deletions lib/firehose.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const EventEmitter = require("events");

module.exports = class Firehose extends EventEmitter {
constructor(target, ignore = [], pollTime = 300000, libbarter){
super();

this._libbarter = libbarter;
this._target = target;
this._cache = ignore;

this._interval = setInterval(() => this._poll(), pollTime);
setTimeout(() => this._poll(), 500);
}

async _poll(){
let items = await this._libbarter._doRequest("https://barter.vg/firehose/" + this._target);

let newCache = Object.keys(items);

let result = [];

newCache.forEach(i => {
if( this._cache.indexOf(i) < 0 ) result.push(new this._libbarter._FirehoseItem(items[i], i, this._libbarter));
});

result.forEach(i => {
this.emit("item", i);
});

this.emit("items", newCache);

this._cache = newCache;
}

async destroy(){
clearInterval(this._interval);
}
}
14 changes: 14 additions & 0 deletions lib/firehoseitem.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module.exports = class FirehoseItem {
constructor(firehoseItem, lineItemID, libbarter){
this.user = new libbarter._LimitedUser(firehoseItem.user_id, firehoseItem.steam_persona, libbarter);
this.title = firehoseItem.title;
this.id = firehoseItem.item_id;
this.lineItem = lineItemID;

this._libbarter = libbarter;
}

async getFullItem(){
await this._libbarter.getItem(this.id, this._libbarter);
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "libbarter",
"version": "1.0.0",
"version": "1.1.0",
"description": "Barter.vg wrapper in Node.js",
"main": "index.js",
"scripts": {
Expand Down
162 changes: 101 additions & 61 deletions test/barter.test.js
Original file line number Diff line number Diff line change
@@ -1,62 +1,102 @@
const libbarter = require("../index.js");

const Barter = new libbarter();

test("getCollection() returns an array of valid CollectionItems", () => {
return Barter.getCollection("3ede", "b").then(collection => {
expect(collection.filter(i => i instanceof Barter._CollectionItem).length).toBe(collection.length);
expect(collection[0].id).toBe(9555);
});
});

test("getGlobalOfferCollector() returns a GlobalOfferCollector that emits FeedOffers (this may take a moment...)", () => {
jest.setTimeout(120000);

let collector = Barter.getGlobalOfferCollector(1000);

expect(collector instanceof Barter._GlobalOfferCollector).toBe(true);

return new Promise((resolve, reject) => {
collector.once("offer", offer => {
expect(offer instanceof Barter._FeedOffer).toBe(true);
resolve();
});
});
});

test("getItem() returns a valid Item", () => {
return Barter.getItem(9555).then(item => {
expect(item instanceof Barter._Item).toBe(true);
expect(item.title).toBe("Trading Card");
});
});

test("getOffer() returns a valid Offer", () => {
return Barter.getOffer(2247076).then(offer => {
expect(offer instanceof Barter._Offer).toBe(true);
expect(offer.opened).toBe(false);
expect(offer.isMultiUser).toBe(false);
expect(offer.to.id).toBe("3ede");
});
});

test("getOffers() returns an object of valid LimitedOffers", () => {
return Barter.getOffers("3ede").then(offers => {
expect(Object.keys(offers).filter(i => offers[i] instanceof Barter._LimitedOffer).length).toBe(Object.keys(offers).length);
expect(offers[2247076].isFailed).toBe(false);
});
});

test("getUser() returns a valid User", () => {
return Barter.getUser("3ede").then(user => {
expect(user instanceof Barter._User).toBe(true);
expect(user.steamid).toBe("76561198852754414");
});
});

test("getUserBySteamID() returns a valid User", () => {
return Barter.getUserBySteamID("76561198852754414").then(user => {
expect(user instanceof Barter._User).toBe(true);
expect(user.id).toBe("3ede");
});
const libbarter = require("../index.js");

const Barter = new libbarter();

test("getCollection() returns an array of valid CollectionItems", () => {
return Barter.getCollection("3ede", "b").then(collection => {
expect(collection.filter(i => i instanceof Barter._CollectionItem).length).toBe(collection.length);
expect(collection[0].id).toBe(9555);
});
});

test("getGlobalOfferCollector() returns a GlobalOfferCollector that emits FeedOffers (this may take a moment...)", () => {
jest.setTimeout(120000);

let collector = Barter.getGlobalOfferCollector(1000);

expect(collector instanceof Barter._GlobalOfferCollector).toBe(true);

return new Promise((resolve, reject) => {
collector.once("offer", offer => {
expect(offer instanceof Barter._FeedOffer).toBe(true);
resolve();
});
});
});

test("getItem() returns a valid Item", () => {
return Barter.getItem(9555).then(item => {
expect(item instanceof Barter._Item).toBe(true);
expect(item.title).toBe("Trading Card");
});
});

test("getOffer() returns a valid Offer", () => {
return Barter.getOffer(2247076).then(offer => {
expect(offer instanceof Barter._Offer).toBe(true);
expect(offer.opened).toBe(false);
expect(offer.isMultiUser).toBe(false);
expect(offer.to.id).toBe("3ede");
});
});

test("getOffers() returns an object of valid LimitedOffers", () => {
return Barter.getOffers("3ede").then(offers => {
expect(Object.keys(offers).filter(i => offers[i] instanceof Barter._LimitedOffer).length).toBe(Object.keys(offers).length);
expect(offers[2247076].isFailed).toBe(false);
});
});

test("getUser() returns a valid User", () => {
return Barter.getUser("3ede").then(user => {
expect(user instanceof Barter._User).toBe(true);
expect(user.steamid).toBe("76561198852754414");
});
});

test("getUserBySteamID() returns a valid User", () => {
return Barter.getUserBySteamID("76561198852754414").then(user => {
expect(user instanceof Barter._User).toBe(true);
expect(user.id).toBe("3ede");
});
});

test("getFirehose() returns a valid Firehose that emits FirehoseItems", () => {
return new Promise((resolve, reject) => {
let fh = Barter.getFirehose("wishlists");

expect(fh instanceof Barter._Firehose).toBe(true);
fh.once("item", resolve);
}).then(item => {
expect(item instanceof Barter._FirehoseItem).toBe(true);
expect(item.user instanceof Barter._LimitedUser).toBe(true);
});
});

test("Firehose respects cache", () => {
let items;

return new Promise((resolve, reject) => {
let fh = Barter.getFirehose("wishlists");

fh.once("items", i => {
items = i;

fh.destroy();

fh = Barter.getFirehose("wishlists", items);

let ok = true;

fh.on("item", item => {
if( items.indexOf(item.lineItem) > -1 ) ok = false;
});

fh.on("items", () => {
resolve(ok);
});
});
}).then(res => {
expect(res).toBe(true);
});
});

0 comments on commit d6e7bfb

Please sign in to comment.