diff --git a/CHANGELOG.md b/CHANGELOG.md
index e4342fb61..a83838ebe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+
+# [15.1.0](https://github.com/ipfs/js-ipfs-api/compare/v15.0.2...v15.1.0) (2017-11-14)
+
+
+### Bug Fixes
+
+* adapting HTTP API to the interface-ipfs-core spec ([#625](https://github.com/ipfs/js-ipfs-api/issues/625)) ([8e58225](https://github.com/ipfs/js-ipfs-api/commit/8e58225))
+
+
+### Features
+
+* windows interop ([#624](https://github.com/ipfs/js-ipfs-api/issues/624)) ([40557d0](https://github.com/ipfs/js-ipfs-api/commit/40557d0))
+
+
+
## [15.0.2](https://github.com/ipfs/js-ipfs-api/compare/v15.0.1...v15.0.2) (2017-11-13)
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 000000000..b3d477011
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,23 @@
+environment:
+ matrix:
+ - nodejs_version: "6"
+ - nodejs_version: "8"
+
+# cache:
+# - node_modules
+
+platform:
+ - x64
+
+install:
+ - ps: Install-Product node $env:nodejs_version $env:platform
+ - node --version
+ - npm --version
+ - npm install
+
+test_script:
+ - npm test
+
+build: off
+
+version: "{build}"
diff --git a/package.json b/package.json
index f95cfb847..03a86f4f1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ipfs-api",
- "version": "15.0.2",
+ "version": "15.1.0",
"description": "A client library for the IPFS HTTP API. Follows interface-ipfs-core spec",
"main": "src/index.js",
"browser": {
@@ -49,7 +49,7 @@
"readable-stream": "^2.3.3",
"stream-http": "^2.7.2",
"streamifier": "^0.1.1",
- "tar-stream": "^1.5.4"
+ "tar-stream": "^1.5.5"
},
"engines": {
"node": ">=6.0.0",
@@ -65,7 +65,7 @@
"dirty-chai": "^2.0.1",
"eslint-plugin-react": "^7.4.0",
"gulp": "^3.9.1",
- "interface-ipfs-core": "~0.34.0",
+ "interface-ipfs-core": "~0.34.3",
"hapi": "^16.6.2",
"ipfsd-ctl": "~0.24.1",
"pre-commit": "^1.2.2",
@@ -118,6 +118,7 @@
"Pedro Teixeira ",
"Pete Thomas ",
"Richard Littauer ",
+ "Richard Schneider ",
"Stephen Whitmore ",
"Tara Vancil ",
"Travis Person ",
diff --git a/src/ls.js b/src/ls.js
index 20082301f..78dc4d5bd 100644
--- a/src/ls.js
+++ b/src/ls.js
@@ -15,6 +15,48 @@ module.exports = (arg) => {
path: 'ls',
args: args,
qs: opts
- }, callback)
+ }, (err, results) => {
+ if (err) {
+ return callback(err)
+ }
+
+ let result = results.Objects
+ if (!result) {
+ return callback(new Error('expected .Objects in results'))
+ }
+
+ result = result[0]
+ if (!result) {
+ return callback(new Error('expected one array in results.Objects'))
+ }
+
+ result = result.Links
+ if (!Array.isArray(result)) {
+ return callback(new Error('expected one array in results.Objects[0].Links'))
+ }
+
+ result = result.map((link) => ({
+ depth: 1,
+ name: link.Name,
+ path: args + '/' + link.Name,
+ size: link.Size,
+ hash: link.Hash,
+ type: typeOf(link)
+ }))
+
+ callback(null, result)
+ })
})
}
+
+function typeOf (link) {
+ switch (link.Type) {
+ case 1:
+ case 5:
+ return 'dir'
+ case 2:
+ return 'file'
+ default:
+ return 'unknown'
+ }
+}
diff --git a/src/utils/get-files-stream.js b/src/utils/get-files-stream.js
index b283cee7a..8a44c8f75 100644
--- a/src/utils/get-files-stream.js
+++ b/src/utils/get-files-stream.js
@@ -46,6 +46,8 @@ function loadPaths (opts, file) {
}
if (stats.isDirectory() && opts.recursive) {
+ // glob requires a POSIX filename
+ file = file.split(path.sep).join('/')
const globEscapedDir = escape(file) + (file.endsWith('/') ? '' : '/')
const mg = new glob.sync.GlobSync(`${globEscapedDir}` + '**/*', {
follow: followSymlinks,
diff --git a/src/utils/request-api.js b/src/utils/request-api.js
index 61815fde8..8cac6cbef 100644
--- a/src/utils/request-api.js
+++ b/src/utils/request-api.js
@@ -57,7 +57,15 @@ function onRes (buffer, cb) {
res.on('end', () => {
let err = res.trailers['x-stream-error']
if (err) {
- err = JSON.parse(err)
+ // Not all errors are JSON
+ try {
+ err = JSON.parse(err)
+ } catch (e) {
+ err = {
+ Code: 'n/a',
+ Message: err
+ }
+ }
const error = new Error(`Server responded with 500`)
error.code = err.Code
error.message = err.Message
diff --git a/test/diag.spec.js b/test/diag.spec.js
index 7a74e2be5..ca88ba225 100644
--- a/test/diag.spec.js
+++ b/test/diag.spec.js
@@ -6,10 +6,16 @@ const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
+const os = require('os')
describe('.diag', function () {
this.timeout(50 * 1000)
+ if (os.platform() === 'win32') {
+ it('skip these on Windows')
+ return
+ }
+
let ipfs
let fc
diff --git a/test/ipfs-factory/client.js b/test/ipfs-factory/client.js
index d30b08966..a3df65e0e 100644
--- a/test/ipfs-factory/client.js
+++ b/test/ipfs-factory/client.js
@@ -31,6 +31,7 @@ function Factory () {
spawnNode()
} else {
ioC = io.connect(sioUrl, sioOptions)
+ ioC.once('error', callback)
ioC.once('connect_error', callback)
ioC.once('connect', () => {
sioConnected = true
diff --git a/test/ipfs-factory/server-routes.js b/test/ipfs-factory/server-routes.js
index 4b83dd962..31c60019a 100644
--- a/test/ipfs-factory/server-routes.js
+++ b/test/ipfs-factory/server-routes.js
@@ -6,6 +6,7 @@ const DaemonSpawner = require('./daemon-spawner')
module.exports = (http) => {
const io = new SocketIO(http.listener)
io.on('connection', handle)
+ io.on('error', (err) => this.emit('error', err))
const ds = new DaemonSpawner()
@@ -17,7 +18,7 @@ module.exports = (http) => {
function spawnNode (repoPath, config) {
ds.spawnNode(repoPath, config, (err, apiAddr) => {
if (err) {
- throw err
+ return this.emit('error', err)
}
this.emit('fc-node', apiAddr.toString())
})
@@ -26,7 +27,7 @@ module.exports = (http) => {
function dismantle () {
ds.dismantle((err) => {
if (err) {
- throw err
+ return this.emit('error', err)
}
this.emit('fc-nodes-shutdown')
})
diff --git a/test/ls.spec.js b/test/ls.spec.js
index 0b2bcc828..4cbf845f4 100644
--- a/test/ls.spec.js
+++ b/test/ls.spec.js
@@ -40,17 +40,6 @@ describe('.ls', function () {
after((done) => fc.dismantle(done))
describe('Callback API', () => {
- it('should correctly retrieve links', function (done) {
- ipfs.ls(folder, (err, res) => {
- expect(err).to.not.exist()
-
- expect(res).to.have.a.property('Objects')
- expect(res.Objects[0]).to.have.a.property('Links')
- expect(res.Objects[0]).to.have.property('Hash', 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh')
- done()
- })
- })
-
it('should correctly handle a nonexist()ing hash', function (done) {
ipfs.ls('surelynotavalidhashheh?', (err, res) => {
expect(err).to.exist()
@@ -69,15 +58,6 @@ describe('.ls', function () {
})
describe('Promises API', () => {
- it('should correctly retrieve links', () => {
- return ipfs.ls(folder)
- .then((res) => {
- expect(res).to.have.a.property('Objects')
- expect(res.Objects[0]).to.have.a.property('Links')
- expect(res.Objects[0]).to.have.property('Hash', 'QmQao3KNcpCsdXaLGpjieFGMfXzsSXgsf6Rnc5dJJA3QMh')
- })
- })
-
it('should correctly handle a nonexist()ing hash', () => {
return ipfs.ls('surelynotavalidhashheh?')
.catch((err) => expect(err).to.exist())
diff --git a/test/request-api.spec.js b/test/request-api.spec.js
index 18e45d522..5edfafba4 100644
--- a/test/request-api.spec.js
+++ b/test/request-api.spec.js
@@ -33,10 +33,9 @@ describe('\'deal with HTTP weirdness\' tests', () => {
})
describe('trailer headers', () => {
- it('should deal with trailer x-stream-error correctly', (done) => {
- if (!isNode) {
- return done()
- }
+ // TODO: needs fixing https://github.com/ipfs/js-ipfs-api/pull/624#issuecomment-344181950
+ it.skip('should deal with trailer x-stream-error correctly', (done) => {
+ if (!isNode) { return done() }
const server = require('http').createServer((req, res) => {
const resStream = pump(res, ndjson.stringify())