it('Create', () => co(function * () {
    let server = yield apemanApi({
      port,
      configuration: {
        $api: {
          pingPong: {
            ping () {
              return 'pong'
            }
          },
          $serverMiddlewares: [
            create('/sse/bomb', (client) => co(function * () {
              let count = 10
              while (count >= 0) {
                client.send('tick', JSON.stringify(count))
                yield asleep(100)
                count--
              }
              client.send('boom!')
            }), { keep: false })
          ],
          $pathname: '/api/rpc'
        }
      }

    })
    assert(server)

    let client = apemanApiClient(`${baseUrl}/api/rpc`)
    assert.ok(client)

    {
      let pingPong = yield client.connect('pingPong')
      let pong = yield pingPong.ping()
      assert.equal(pong, 'pong')
    }

    yield asleep(300)

    let eventSource = new EventSource(`${baseUrl}/sse/bomb`)
    eventSource.on('tick', (event) => {
      let { data } = event
      console.log('tick', data)
    })

    yield asleep(500)

    yield server.close()
  }))
  it('Create', () => co(function * () {
    let server = yield apemanApi({
      port,
      configuration: {
        $api: {
          pingPong: {
            ping () {
              return 'pong'
            }
          },
          $middlewares: [
            create({})
          ],
          $pathname: '/api/rpc'
        }
      }

    })
    assert(server)

    let client = apemanApiClient(`${baseUrl}/api/rpc`)
    assert.ok(client)

    {
      let pingPong = yield client.connect('pingPong')
      let pong = yield pingPong.ping()
      assert.equal(pong, 'pong')
    }

    yield asleep(300)
    yield server.close()
  }))
 before(async () => {
   port = await aport()
   server = rfunc({
     foo: {
       async bar (text) {
         const d = new Date()
         await asleep(100)
         return {
           time: new Date() - d,
           text
         }
       },
       hoge () {
         throw Object.assign(new Error('hoge!'), {status: 400})
       },
       $spec: {
         name: 'foo-api',
         methods: {
           hello: {desc: 'Say hello'},
           bye: {desc: 'Say bye'}
         }
       }
     },
     baz () {
       return 'This is baz!'
     },
     $pathname: BASE_URL
   })
   server.listen(port)
   baseUrl = `http://localhost:${port}${BASE_URL}`
 })
 create('/sse/bomb', (client) => co(function * () {
   let count = 10
   while (count >= 0) {
     client.send('tick', JSON.stringify(count))
     yield asleep(100)
     count--
   }
   client.send('boom!')
 }), { keep: false })
  it('Do request', () => co(function * () {
    let client = apemanApiClient(`${proxyBaseUrl}/api/rpc`)
    assert.ok(client)

    {
      let pingPong = yield client.connect('pingPong')
      let pong = yield pingPong.ping()
      assert.equal(pong, 'pong')
    }

    {
      let { statusCode, body } = yield request({
        url: `${proxyBaseUrl}/api/rpc/proxy/hoge`,
        method: 'POST'
      })
      assert.equal(statusCode, 200)
      assert.equal(body, 'request successfully proxied!')
    }
    yield asleep(300)
  }))
 return co.wrap(function * apemanMiddlewareSse (ctx, next) {
   let { query: params = {} } = ctx
   ctx.connected = true
   if (_skip(ctx.url)) {
     yield next()
     return
   }
   let { req, res } = ctx
   let client = new SSEClient(req, res)
   client.params = params
   client.fire = (event, data) => client.send(event, JSON.stringify(data))
   client.initialize()
   try {
     yield Promise.resolve(handler(client, ctx))
   } catch (e) {
     throw e
   }
   while (keep && ctx.connected) {
     yield asleep(0)
   }
 })
  it('Create', () => co(function * () {
    let server = yield apemanApi({
      port,
      configuration: {
        $api: {
          pingPong: {
            ping () {
              let { lang } = this
              return 'pong:' + lang
            }
          },
          $middlewares: [
            create(loc, {})
          ],
          $pathname: '/api/rpc'
        }
      }

    })
    assert(server)

    let agent = superagent()
    let client = apemanApiClient(`${baseUrl}/api/rpc`, { agent })
    assert.ok(client)

    {
      let pingPong = yield client.connect('pingPong')
      let pong = yield pingPong.ping()
      assert.equal(pong, 'pong:en')
    }
    {
      agent.set('accept-language', 'ja')
      let pingPong = yield client.connect('pingPong')
      let pong = yield pingPong.ping()
      assert.equal(pong, 'pong:ja')
    }

    yield asleep(300)
    yield server.close()
  }))
Example #8
0
  it('Akv', async () => {
    let filename = `${__dirname}/../tmp/testing-akv/akv.json`
    let akv = new AKV(filename, {interval: 100})

    await akv.touch()
    assert.ok(fs.existsSync(filename))
    await akv.destroy()
    assert.ok(!fs.existsSync(filename))

    {
      let {storage} = akv
      await storage.write({foo: 'baz'})
      let data = await storage.read()
      assert.deepEqual(data, {foo: 'baz'})
      assert.ok(storage.needsFlush)
      await asleep(300)
      assert.ok(!storage.needsFlush)
    }

    for (let i = 0; i < 5; i++) {
      await akv.set('index', String(i))
      let index = await akv.get('index')
      assert.equal(index, String(i))
    }

    for (let i = 0; i < 100; i++) {
      akv.set('index', String(i))
      akv.get('index').then((index) => {
        // console.log('index', index)
      })
    }
    assert.equal(await akv.get('index'), '99')

    assert.deepEqual(await akv.all(), await akv.all())
    assert.deepEqual(await akv.keys(), await akv.keys())

    await akv.commit()
  })
  it('Command', () => co(function * () {
    let configuration = require.resolve('../misc/mocks/mock-Apemanfile')
    let server = yield apemanApi({
      port,
      configuration
    })
    assert(server)
    // Describe for all api
    {
      let { statusCode, body, headers } = yield request({
        url: `${baseUrl}/api`,
        method: 'OPTIONS'
      })
      assert.equal(statusCode, 200)
      let spec = body.data.attributes
      assert.ok(spec)
    }

    // Use default scope
    {
      let { statusCode, body } = yield request({
        url: `${baseUrl}/api/sign/signin`,
        method: 'POST',
        json: true,
        body: {
          data: {
            type: 'invocations',
            id: uuid.v4(),
            attributes: {
              params: [ 'foo', 'bar' ]
            }
          }
        }
      })
      assert.equal(statusCode, 200)
      let { returns } = body.data.attributes
      assert.deepEqual(returns, { success: true })
    }

    // Use default scope with camel
    {
      let { statusCode, body } = yield request({
        url: `${baseUrl}/api/hoge-hoge/say-hey`,
        method: 'POST',
        json: true,
        body: {
          data: {
            type: 'invocations',
            id: uuid.v4(),
            attributes: {}
          }
        }
      })
      assert.equal(statusCode, 200)
      let { returns } = body.data.attributes
      assert.deepEqual(returns, 'hey')
    }

    // Use custom scope
    {
      let { statusCode, body } = yield request({
        url: `${baseUrl}/api/scoped/admin/user/destroy`,
        method: 'POST',
        json: true,
        body: {
          data: {
            type: 'invocations',
            id: uuid.v4(),
            attributes: {
              params: [ 'foo', 'bar' ]
            }
          }
        }
      })
      assert.equal(statusCode, 200)
      let { returns } = body.data.attributes
      assert.deepEqual(returns, { success: false })
    }

    yield asleep(300)
    yield server.close()
  }))
  it('Command', () => co(function * () {
    let configuration = require.resolve('../misc/mocks/mock-Apemanfile')
    let server = yield apemanApi({
      port,
      configuration
    })
    assert(server)
    let client = new Client(`${baseUrl}/api/rpc`)
    assert.ok(client)

    // Use default scope api
    {
      let spec = yield client.describe('sign')
      assert.ok(spec)
      let sign = yield client.connect('sign')
      let result = yield sign.signin()
      assert.deepEqual(result, { success: true })
    }

    // Use default scope api with camel case names
    {
      let hogeHoge = yield client.connect('hogeHoge')
      let result = yield hogeHoge.sayHey()
      assert.deepEqual(result, 'hey')
    }

    // Use custom scope api
    {
      let admin = client.of('@admin')
      let user = yield admin.connect('user')
      let result = yield user.destroy()
      assert.ok(result)
    }

    // Use server send event
    {
      let spec = yield client.describe('sse')
      let eventSource = client.eventSource('sse')
      eventSource.addEventListener('error', (err) => {
        console.error(err)
      })
      eventSource.addEventListener('tick', (ev) => {
        let { type, data } = ev
        data = JSON.parse(data)
        assert.equal(type, 'tick')
        let { count } = data
        if (count === 1) {
          eventSource.close()
        }
        assert.ok(data)
      })
      asleep(500)
    }

    // Try to reach
    {
      let reached = yield client.reach()
      assert.ok(reached)
    }

    yield asleep(300)
    yield server.close()
  }))