├── .circleci
└── config.yml
├── .eslintrc
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── examples
├── paid-resources-images
│ ├── README.md
│ ├── images
│ │ └── example.png
│ ├── index.js
│ ├── package-lock.json
│ ├── package.json
│ └── static
│ │ └── index.html
└── paid-resources-video
│ ├── README.md
│ ├── index.js
│ ├── package-lock.json
│ ├── package.json
│ └── static
│ └── index.html
├── index.js
├── package-lock.json
├── package.json
└── src
├── bucket.js
├── monetizer.js
├── payer.js
└── stream-wrapper.js
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | # Javascript Node CircleCI 2.0 configuration file
2 | #
3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details
4 | #
5 | version: 2
6 |
7 | defaults: &defaults
8 | working_directory: ~/repo
9 | docker:
10 | - image: circleci/node:8.11.3
11 |
12 | jobs:
13 | test:
14 | <<: *defaults
15 | steps:
16 |
17 | - run:
18 | # By default node is installed as root and we are running as circleci
19 | # Using sudo causes wierd issues so we just switch to installing globals in our home dir
20 | name: Setup NPM to make global installs to home directory
21 | command: |
22 | echo "export PATH=$HOME/bin:$PATH" >> $BASH_ENV
23 | npm set prefix=$HOME
24 |
25 | - checkout
26 |
27 | - restore_cache:
28 | keys:
29 | # when lock file changes, use increasingly general patterns to restore cache
30 | - "node-v1-{{ .Branch }}-{{ checksum \"package-lock.json\" }}"
31 | - "node-v1-{{ .Branch }}-"
32 | - "node-v1-"
33 |
34 | - run:
35 | name: Install
36 | command: npm install
37 |
38 |
39 | - run:
40 | name: Lint
41 | command: npm run lint
42 |
43 | - save_cache:
44 | paths:
45 | - node_modules
46 | key: node-v1-{{ .Branch }}-{{ checksum "package-lock.json" }}
47 |
48 | - persist_to_workspace:
49 | root: ~/repo
50 | paths: .
51 |
52 | deploy:
53 | <<: *defaults
54 | steps:
55 | - attach_workspace:
56 | at: ~/repo
57 | - run:
58 | name: Authenticate with registry
59 | command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc
60 | - run:
61 | name: Publish package
62 | command: npm publish
63 |
64 | workflows:
65 | version: 2
66 | test-deploy:
67 | jobs:
68 | - test:
69 | filters:
70 | tags:
71 | only: /^v.*/
72 | - deploy:
73 | requires:
74 | - test
75 | filters:
76 | tags:
77 | only: /^v.*/
78 | branches:
79 | only: /^master$/
80 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | extends: standard
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | examples/paid-resources-video/videos
3 | example.webm
4 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to Interledger.js Repositories
2 |
3 | ## Getting Involved
4 |
5 | Detailed contribution guidelines are coming soon...
6 |
7 | ## Contributor License Agreement
8 |
9 | This project uses the [JS Foundation](https://js.foundation) CLA for licensing contributions.
10 |
11 | Please submit your pull request as you would with any other open source project on GitHub and our CLA Assistant bot will guide you through the signing process.
12 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2016 JS Foundation and contributors
2 | Copyright 2015-2016 Ripple, Inc. and contributors
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use
5 | this file except in compliance with the License. You may obtain a copy of the
6 | License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Web Monetization Receiver
2 | > Server-side library for advanced Web Monetization integrations
3 |
4 | - [Overview](#overview)
5 | - [Examples](#examples)
6 | - [API](#api)
7 | - [`Monetizer`](#monetizer)
8 | - [`Monetizer.koa`](#monetizerkoa)
9 | - [`Monetizer.generateSPSPResponse`](#monetizergeneratespspresponse)
10 | - [`Monetizer.listen`](#monetizerlisten)
11 | - [`Monetizer.getBucket`](#monetizergetbucket)
12 | - [`Bucket`](#bucket)
13 | - [`Bucket.fund`](#bucketfund)
14 | - [`Bucket.spend`](#bucketspend)
15 | - [`Bucket.awaitBalance`](#bucketawaitbalance)
16 | - [`Bucket.awaitAndSpend`](#bucketawaitandspend)
17 | - [`Bucket.monetizeStream`](#bucketmonetizestream)
18 | - [`Payer`](#payer)
19 | - [`Payer.pay`](#payerpay)
20 |
21 | ## Overview
22 |
23 | Lots of sites can benefit from [Web Monetization](https://webmonetization.org).
24 | Most of the time, you can add a little bit of javascript that causes Web
25 | Monetization enabled users to donate to you ([The scripts are available
26 | here](https://github.com/interledgerjs/web-monetization-scripts)).
27 |
28 | Some sites might want to do more than this. For example, an image gallery might
29 | want to offer some images only to its Web Monetization enabled users. Or a
30 | video site might charge per second of video streamed.
31 |
32 | This repository contains tools which aim to make these advanced integrations easier.
33 |
34 | ## Examples
35 |
36 | Run `npm install` in this repository's root, then follow the README of the
37 | example you want to run.
38 |
39 | - [Serve Paid Images](https://github.com/sharafian/web-monetization-receiver/tree/master/examples/paid-resources-images)
40 | - [Serve Paid Video](https://github.com/sharafian/web-monetization-receiver/tree/master/examples/paid-resources-video)
41 |
42 | ## API
43 |
44 | ### `Monetizer`
45 |
46 | ```js
47 | const { Monetizer } = require('web-monetization-receiver')
48 | const monetizer = new Monetizer()
49 | ```
50 |
51 | Creates a "Monetizer" that wraps an [ILP/STREAM
52 | server](https://github.com/interledgerjs/ilp-protocol-stream) and exposes an
53 | easy to use API.
54 |
55 | You can use Monetizer to charge for different actions on your server using Web
56 | Monetization. It's best suited for web apps where your user is browsing your
57 | site and paying continuously with Web Monetization.
58 |
59 | #### Parameters
60 |
61 | - `opts: Object` - (Optional) Options for this Monetizer.
62 |
63 | - `opts.plugin: IlpPlugin` - (Optional) ILP Plugin to listen for payments
64 | with. By default, Monetizer creates a plugin to your local `moneyd` server.
65 |
66 | - `opts.buckets: Object` - (Optional) Options regarding buckets of payment that
67 | have been received by different site users.
68 |
69 | - `opts.buckets.timeout: Number` - (Optional) How long to wait before clearing
70 | an unused bucket.
71 |
72 | - `opts.buckets.capacity: Number` - (Optional) Maximum amount of payment to
73 | accumulate in a single bucket.
74 |
75 | ### `Monetizer.koa`
76 |
77 | ```js
78 | app.use(monetizer.koa())
79 | ```
80 |
81 | Connects this Monetizer instance to a [Koa](https://koajs.com/) app.
82 |
83 | - Adds an
84 | [SPSP](https://github.com/interledger/rfcs/tree/master/0009-simple-payment-setup-protocol)
85 | receiver to the server (responds to requests with `Accept: application/spsp4+json`)
86 |
87 | - Sets a `webMonetization` cookie on every client that hits the site. This is
88 | then used to associate each client with a bucket of payment, so that they can
89 | request paid resources from the server.
90 |
91 | - Adds `ctx.webMonetization` to the server, with the payment bucket associate
92 | with the current client. This can be used to charge for requests server-side.
93 | Look at the [Examples](#examples) section to see some ways to use it, or keep
94 | reading the API.
95 |
96 | #### Parameters
97 |
98 | - `opts: Object` - (Optional) Additional options for the receiver
99 |
100 | - `opts.spsp: boolean` - (Optional) (Default `true`) Whether to respond to SPSP
101 | requests. If this is set to false, you must write an SPSP receiver endpoint
102 | yourself using the `generateSPSPResponse` function.
103 |
104 | #### Return
105 |
106 | - Async middleware function for use by Koa.
107 |
108 | ### `Monetizer.generateSPSPResponse`
109 |
110 | ```js
111 | const jsonResponse = await monetizer.generateSPSPResponse(tag)
112 | ```
113 |
114 | Returns an SPSP response that allows a client to pay us. If you're using the
115 | `monetizer.koa()` you don't need to call this function anywhere. If you're not
116 | using Koa, then return `await monetizer.generateSPSPResponse(tag)` for any
117 | request that has `Accept` of `application/spsp4+json`. The `tag` should be a
118 | cookie that identifies the user.
119 |
120 | #### Parameters
121 |
122 | - `tag: string` - (Optional) Tag corresponding to this user.
123 |
124 | #### Return
125 |
126 | - `response: Object` - SPSP details that let your client pay you over
127 | Interledger. If they pay to these details, then their payment will
128 | accumulate in a bucket identified by their `tag`.
129 |
130 | - `response.destination_account: string` - ILP address for the client to pay
131 | to.
132 |
133 | - `response.shared_secret: string` - Shared secret used for authentication and
134 | encryption of data passed over Interledger.
135 |
136 | ### `Monetizer.listen`
137 |
138 | ```js
139 | await monetizer.listen()
140 | ```
141 |
142 | Initializes the STREAM server of this Monetizer. If you use
143 | `generateSPSPResponse` then it will call this function automatically.
144 |
145 | #### Parameters
146 |
147 | - None
148 |
149 | #### Return
150 |
151 | - Promise to null, resolves when server is initialized.
152 |
153 | ### `Monetizer.getBucket`
154 |
155 | ```js
156 | const bucket = monetizer.getBucket(tag)
157 | ```
158 |
159 | Gets a bucket associated with a given tag. If you're using the Koa middleware
160 | then on any route you can access `ctx.webMonetization` to access the current user's
161 | bucket (equivalent of `monetizer.getBucket(ctx.cookie.get('webMonetization'))`).
162 |
163 | If no money has been paid into the bucket, you'll just get an empty bucket.
164 |
165 | After a timeout (configurable via `opts.buckets.timeout` in the Monetizer
166 | constructor) any bucket that hasn't been used will be cleaned up.
167 |
168 | #### Parameters
169 |
170 | - `tag: string` - Tag corresponding to this user.
171 |
172 | #### Return
173 |
174 | - `bucket: Bucket` - [Bucket](#bucket) of payment for this user
175 |
176 | ### `Bucket`
177 |
178 | A bucket represents the payment received by the server from a specific user.
179 | You can use a bucket object to add/spend funds.
180 |
181 | The bucket constructor shouldn't be called directly, instead you should get it
182 | from `monetizer.getBucket` (or from `ctx.webMonetization` if you're using Koa).
183 |
184 | ### `Bucket.fund`
185 |
186 | ```js
187 | bucket.fund('1000')
188 | ```
189 |
190 | This function adds the given number of units to the bucket. There usually is no
191 | reason to call this directly, because the Monetizer's SPSP server will
192 | automatically fund the necessary buckets whenever payments are received.
193 |
194 | #### Parameters
195 |
196 | - `amount: string` - Amount of units (denominated in the units of your
197 | plugin/local moneyd) to add to this bucket.
198 |
199 | #### Return
200 |
201 | None
202 |
203 | ### `Bucket.spend`
204 |
205 | ```js
206 | if (bucket.spend('300')) {
207 | return paidContent
208 | } else {
209 | throw new Error('insufficient funds')
210 | }
211 | ```
212 |
213 | Subtracts funds from the bucket. Returns `true` if there were enough funds,
214 | and `false` otherwise.
215 |
216 | #### Parameters
217 |
218 | - `amount: string` - Amount of units (denominated in the units of your
219 | plugin/local moneyd) to subtract from this bucket.
220 |
221 | #### Return
222 |
223 | - `success: boolean` - Whether the bucket had enough funds and was subtracted
224 | from.
225 |
226 | ### `Bucket.awaitBalance`
227 |
228 | ```js
229 | await bucket.awaitBalance('1000')
230 | console.log('user can spend 1000 units')
231 | ```
232 |
233 | Waits until the user has accumulated a certain number of units in their bucket.
234 | This is useful for a web server where the client attempts to load all resources
235 | immediately but will take some time to pay for all of them (See [Examples](#examples)).
236 |
237 | This represents an absolute amount. If you `awaitBalance('1000')` it waits for
238 | the user to have 1000 units total, not 1000 units more than they did when the
239 | function was called.
240 |
241 | #### Parameters
242 |
243 | - `amount: string` - Amount of units (denominated in the units of your
244 | plugin/local moneyd) to wait for.
245 |
246 | #### Return
247 |
248 | - Promise to void which resolves when the amount is reached.
249 |
250 | ### `Bucket.awaitAndSpend`
251 |
252 | ```js
253 | await bucket.awaitAndSpend('1000')
254 | return paidContent
255 | ```
256 |
257 | Combines `awaitBalance` and `spend` into an atomic operation. First the balance
258 | is awaited, and then it is spent. If the spend fails, the await is repeated.
259 |
260 | #### Parameters
261 |
262 | - `amount: string` - Amount of units (denominated in the units of your
263 | plugin/local moneyd) to wait for and then spend.
264 |
265 | #### Return
266 |
267 | - Promise to void which resolves when the amount is reached and spent.
268 |
269 | ### `Bucket.monetizeStream`
270 |
271 | ```js
272 | const stream = fs.createReadStream('video.webm')
273 | return bucket.monetizeStream(stream)
274 | ```
275 |
276 | ```js
277 | const stream = fs.createReadStream('video.webm')
278 | return bucket.monetizeStream(stream, {
279 | freeBytes: 10000,
280 | costPerByte: (1 / 5000)
281 | })
282 | ```
283 |
284 | Turns a boring regular stream into a cool paid stream. Whenever a chunk of data
285 | is ready on the stream being read from, `chunk.length * costPerByte` units are
286 | subtracted from the bucket. If the bucket hasn't got sufficient funds, the read
287 | stream is paused. Once the bucket gets sufficient funds, the stream is resumed.
288 |
289 | You can use `freeBytes` to send a certain amount of data upfront without requiring
290 | payment (useful for buffering video quickly). `costPerByte` lets you fine-tune how
291 | much payment bandwidth is required to keep up with the stream.
292 |
293 | To see an example of usage, refer to the [video example](#examples).
294 |
295 | #### Parameters
296 |
297 | - `stream: ReadableStream` - [Node.js Readable
298 | Stream](https://nodejs.org/api/stream.html#stream_readable_streams) which is
299 | being monetized.
300 |
301 | - `opts: Object` - (Optional) Options to fine-tune the payment for this stream.
302 |
303 | - `opts.freeBytes: Number` - (Optional) How many free bytes to send up front.
304 | Default `0`.
305 |
306 | - `opts.costPerByte: Number` - (Optional) How much to charge per byte sent over
307 | this stream. Default `1 / 5000` (on a typical [Coil](https://coil.com) plan,
308 | this represents a rate of 500Kb/s)
309 |
310 | #### Return
311 |
312 | - `stream: ReadableStream` - Transformed stream which will charge for money as
313 | it goes. This stream also implements a special `money` event which fires
314 | whenever payment is charged for data going through the stream.
315 |
316 | ### `Payer`
317 |
318 | ```js
319 | const payer = new Payer({
320 | streamOpts: {
321 | minExchangeRatePrecision: 2
322 | }
323 | })
324 | ```
325 |
326 | Creates a `Payer` object. A Payer can be used to efficiently pay out to many different
327 | SPSP receivers. It keeps connections to each of the receivers cached until they time out
328 | in order to minimize the amount of connection re-establishment.
329 |
330 | #### Parameters
331 |
332 | - `opts: Object` - (Optional) additional options for this payer
333 | - `opts.streamOpts: Object` - (Optional) additional override object for
334 | `IlpStream.createConnection` calls. [You can read about the format
335 | here.](https://interledgerjs.github.io/ilp-protocol-stream/interfaces/_connection_.connectionopts.html)
336 |
337 | #### Return
338 |
339 | - `payer: Payer` - Payer object
340 |
341 | ### `Payer.pay`
342 |
343 | ```js
344 | await payer.pay('$twitter.xrptipbot.com/interledger', '100')
345 | ```
346 |
347 | Sends some money to a payment pointer. If a STREAM connection to this payment
348 | pointer already exists then the money is sent over that connection. If no
349 | STREAM connection to this payment pointer exists, then one is created.
350 |
351 | If the STREAM connection does not exist and cannot be established then this
352 | function will reject.
353 |
354 | #### Parameters
355 |
356 | - `pointer: string` - Payment pointer to send funds to.
357 |
358 | - `amount: string` - Amount of units (denominated in the units of your
359 | plugin/local moneyd) to send.
360 |
361 | #### Returns
362 |
363 | - Promise to void. Rejects if SPSP details cannot be loaded or the STREAM
364 | connection fails.
365 |
--------------------------------------------------------------------------------
/examples/paid-resources-images/README.md:
--------------------------------------------------------------------------------
1 | # Paid Resources Images
2 |
3 | Web server that charges users for images. When a web monetized user
4 | goes to this page, they'll receive an image of a rabbit after they
5 | send 300 drops.
6 |
7 | ## Setup
8 |
9 | - [Make sure you're running Moneyd on the
10 | livenet.](https://medium.com/interledger-blog/joining-the-live-ilp-network-eab123a73665)
11 |
12 | - Make sure you've either got an active [Coil](https://coil.com) subscription,
13 | or are running [your own Web Monetization
14 | provider](https://github.com/interledgerjs/ilp-wm-provider).
15 |
16 | ```sh
17 | npm install
18 | node index.js
19 | ```
20 |
21 | Then go to [http://localhost:8095](http://localhost:8095). After you pay 300
22 | drops, you'll receive the example image.
23 |
--------------------------------------------------------------------------------
/examples/paid-resources-images/images/example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/interledgerjs/web-monetization-receiver/ec71588155d39df90c116f43786f77ae59f06248/examples/paid-resources-images/images/example.png
--------------------------------------------------------------------------------
/examples/paid-resources-images/index.js:
--------------------------------------------------------------------------------
1 | const Koa = require('koa')
2 | const app = new Koa()
3 | const router = require('koa-router')()
4 | const serve = require('koa-static')
5 | const path = require('path')
6 | const fs = require('fs')
7 |
8 | // const { Monetizer } = require('web-monetization-receiver')
9 | const { Monetizer } = require('../..')
10 | const monetizer = new Monetizer()
11 |
12 | const cost = 300
13 |
14 | router.get('/images/:id', async ctx => {
15 | await ctx.webMonetization.awaitAndSpend(cost)
16 | ctx.body = fs.readFileSync(path.resolve(
17 | __dirname,
18 | 'images',
19 | ctx.params.id
20 | ))
21 | })
22 |
23 | app
24 | .use(monetizer.koa())
25 | .use(router.routes())
26 | .use(router.allowedMethods())
27 | .use(serve(path.resolve(__dirname, './static')))
28 | .listen(process.env.PORT || 8095)
29 |
30 | console.log('listening on',
31 | process.env.PORT || 8095)
32 |
--------------------------------------------------------------------------------
/examples/paid-resources-images/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "paid-resources-images",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "accepts": {
8 | "version": "1.3.5",
9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
11 | "requires": {
12 | "mime-types": "~2.1.18",
13 | "negotiator": "0.6.1"
14 | }
15 | },
16 | "any-promise": {
17 | "version": "1.3.0",
18 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
19 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
20 | },
21 | "cache-content-type": {
22 | "version": "1.0.1",
23 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
24 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
25 | "requires": {
26 | "mime-types": "^2.1.18",
27 | "ylru": "^1.2.0"
28 | }
29 | },
30 | "co": {
31 | "version": "4.6.0",
32 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
33 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
34 | },
35 | "content-disposition": {
36 | "version": "0.5.2",
37 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
38 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
39 | },
40 | "content-type": {
41 | "version": "1.0.4",
42 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
43 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
44 | },
45 | "cookies": {
46 | "version": "0.7.2",
47 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.2.tgz",
48 | "integrity": "sha512-J2JjH9T3PUNKPHknprxgCrCaZshIfxW2j49gq1E1CP5Micj1LppWAR2y9EHSQAzEiX84zOsScWNwUZ0b/ChlMw==",
49 | "requires": {
50 | "depd": "~1.1.2",
51 | "keygrip": "~1.0.2"
52 | }
53 | },
54 | "debug": {
55 | "version": "3.1.0",
56 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
57 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
58 | "requires": {
59 | "ms": "2.0.0"
60 | }
61 | },
62 | "deep-equal": {
63 | "version": "1.0.1",
64 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
65 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
66 | },
67 | "delegates": {
68 | "version": "1.0.0",
69 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
70 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
71 | },
72 | "depd": {
73 | "version": "1.1.2",
74 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
75 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
76 | },
77 | "destroy": {
78 | "version": "1.0.4",
79 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
80 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
81 | },
82 | "ee-first": {
83 | "version": "1.1.1",
84 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
85 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
86 | },
87 | "error-inject": {
88 | "version": "1.0.0",
89 | "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz",
90 | "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc="
91 | },
92 | "escape-html": {
93 | "version": "1.0.3",
94 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
95 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
96 | },
97 | "fresh": {
98 | "version": "0.5.2",
99 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
100 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
101 | },
102 | "http-assert": {
103 | "version": "1.4.0",
104 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.0.tgz",
105 | "integrity": "sha512-tPVv62a6l3BbQoM/N5qo969l0OFxqpnQzNUPeYfTP6Spo4zkgWeDBD1D5thI7sDLg7jCCihXTLB0X8UtdyAy8A==",
106 | "requires": {
107 | "deep-equal": "~1.0.1",
108 | "http-errors": "~1.7.1"
109 | }
110 | },
111 | "http-errors": {
112 | "version": "1.7.1",
113 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.1.tgz",
114 | "integrity": "sha512-jWEUgtZWGSMba9I1N3gc1HmvpBUaNC9vDdA46yScAdp+C5rdEuKWUBLWTQpW9FwSWSbYYs++b6SDCxf9UEJzfw==",
115 | "requires": {
116 | "depd": "~1.1.2",
117 | "inherits": "2.0.3",
118 | "setprototypeof": "1.1.0",
119 | "statuses": ">= 1.5.0 < 2",
120 | "toidentifier": "1.0.0"
121 | }
122 | },
123 | "inherits": {
124 | "version": "2.0.3",
125 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
126 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
127 | },
128 | "is-generator-function": {
129 | "version": "1.0.7",
130 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz",
131 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw=="
132 | },
133 | "isarray": {
134 | "version": "0.0.1",
135 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
136 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
137 | },
138 | "keygrip": {
139 | "version": "1.0.3",
140 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz",
141 | "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g=="
142 | },
143 | "koa": {
144 | "version": "2.5.3",
145 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.5.3.tgz",
146 | "integrity": "sha512-U6rgy2kwlfO+3P1phAidDrRZpGfwcpHCxl33wFe+fHXalpzEshHGnMaSU7I/ZeDFpGRQkbQOYsXkXfUjn+AtdQ==",
147 | "requires": {
148 | "accepts": "^1.3.5",
149 | "cache-content-type": "^1.0.0",
150 | "content-disposition": "~0.5.2",
151 | "content-type": "^1.0.4",
152 | "cookies": "~0.7.1",
153 | "debug": "~3.1.0",
154 | "delegates": "^1.0.0",
155 | "depd": "^1.1.2",
156 | "destroy": "^1.0.4",
157 | "error-inject": "^1.0.0",
158 | "escape-html": "^1.0.3",
159 | "fresh": "~0.5.2",
160 | "http-assert": "^1.3.0",
161 | "http-errors": "^1.6.3",
162 | "is-generator-function": "^1.0.7",
163 | "koa-compose": "^4.1.0",
164 | "koa-convert": "^1.2.0",
165 | "koa-is-json": "^1.0.0",
166 | "on-finished": "^2.3.0",
167 | "only": "~0.0.2",
168 | "parseurl": "^1.3.2",
169 | "statuses": "^1.5.0",
170 | "type-is": "^1.6.16",
171 | "vary": "^1.1.2"
172 | }
173 | },
174 | "koa-compose": {
175 | "version": "4.1.0",
176 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
177 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="
178 | },
179 | "koa-convert": {
180 | "version": "1.2.0",
181 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz",
182 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=",
183 | "requires": {
184 | "co": "^4.6.0",
185 | "koa-compose": "^3.0.0"
186 | },
187 | "dependencies": {
188 | "koa-compose": {
189 | "version": "3.2.1",
190 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz",
191 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=",
192 | "requires": {
193 | "any-promise": "^1.1.0"
194 | }
195 | }
196 | }
197 | },
198 | "koa-is-json": {
199 | "version": "1.0.0",
200 | "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz",
201 | "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ="
202 | },
203 | "koa-router": {
204 | "version": "7.4.0",
205 | "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz",
206 | "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==",
207 | "requires": {
208 | "debug": "^3.1.0",
209 | "http-errors": "^1.3.1",
210 | "koa-compose": "^3.0.0",
211 | "methods": "^1.0.1",
212 | "path-to-regexp": "^1.1.1",
213 | "urijs": "^1.19.0"
214 | },
215 | "dependencies": {
216 | "koa-compose": {
217 | "version": "3.2.1",
218 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz",
219 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=",
220 | "requires": {
221 | "any-promise": "^1.1.0"
222 | }
223 | }
224 | }
225 | },
226 | "koa-send": {
227 | "version": "5.0.0",
228 | "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.0.tgz",
229 | "integrity": "sha512-90ZotV7t0p3uN9sRwW2D484rAaKIsD8tAVtypw/aBU+ryfV+fR2xrcAwhI8Wl6WRkojLUs/cB9SBSCuIb+IanQ==",
230 | "requires": {
231 | "debug": "^3.1.0",
232 | "http-errors": "^1.6.3",
233 | "mz": "^2.7.0",
234 | "resolve-path": "^1.4.0"
235 | }
236 | },
237 | "koa-static": {
238 | "version": "5.0.0",
239 | "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz",
240 | "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==",
241 | "requires": {
242 | "debug": "^3.1.0",
243 | "koa-send": "^5.0.0"
244 | }
245 | },
246 | "media-typer": {
247 | "version": "0.3.0",
248 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
249 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
250 | },
251 | "methods": {
252 | "version": "1.1.2",
253 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
254 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
255 | },
256 | "mime-db": {
257 | "version": "1.36.0",
258 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
259 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
260 | },
261 | "mime-types": {
262 | "version": "2.1.20",
263 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
264 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
265 | "requires": {
266 | "mime-db": "~1.36.0"
267 | }
268 | },
269 | "ms": {
270 | "version": "2.0.0",
271 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
272 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
273 | },
274 | "mz": {
275 | "version": "2.7.0",
276 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
277 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
278 | "requires": {
279 | "any-promise": "^1.0.0",
280 | "object-assign": "^4.0.1",
281 | "thenify-all": "^1.0.0"
282 | }
283 | },
284 | "negotiator": {
285 | "version": "0.6.1",
286 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
287 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
288 | },
289 | "object-assign": {
290 | "version": "4.1.1",
291 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
292 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
293 | },
294 | "on-finished": {
295 | "version": "2.3.0",
296 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
297 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
298 | "requires": {
299 | "ee-first": "1.1.1"
300 | }
301 | },
302 | "only": {
303 | "version": "0.0.2",
304 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
305 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q="
306 | },
307 | "parseurl": {
308 | "version": "1.3.2",
309 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
310 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
311 | },
312 | "path-is-absolute": {
313 | "version": "1.0.1",
314 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
315 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
316 | },
317 | "path-to-regexp": {
318 | "version": "1.7.0",
319 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
320 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
321 | "requires": {
322 | "isarray": "0.0.1"
323 | }
324 | },
325 | "resolve-path": {
326 | "version": "1.4.0",
327 | "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz",
328 | "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=",
329 | "requires": {
330 | "http-errors": "~1.6.2",
331 | "path-is-absolute": "1.0.1"
332 | },
333 | "dependencies": {
334 | "http-errors": {
335 | "version": "1.6.3",
336 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
337 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
338 | "requires": {
339 | "depd": "~1.1.2",
340 | "inherits": "2.0.3",
341 | "setprototypeof": "1.1.0",
342 | "statuses": ">= 1.4.0 < 2"
343 | }
344 | }
345 | }
346 | },
347 | "setprototypeof": {
348 | "version": "1.1.0",
349 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
350 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
351 | },
352 | "statuses": {
353 | "version": "1.5.0",
354 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
355 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
356 | },
357 | "thenify": {
358 | "version": "3.3.0",
359 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
360 | "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
361 | "requires": {
362 | "any-promise": "^1.0.0"
363 | }
364 | },
365 | "thenify-all": {
366 | "version": "1.6.0",
367 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
368 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
369 | "requires": {
370 | "thenify": ">= 3.1.0 < 4"
371 | }
372 | },
373 | "toidentifier": {
374 | "version": "1.0.0",
375 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
376 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
377 | },
378 | "type-is": {
379 | "version": "1.6.16",
380 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
381 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
382 | "requires": {
383 | "media-typer": "0.3.0",
384 | "mime-types": "~2.1.18"
385 | }
386 | },
387 | "urijs": {
388 | "version": "1.19.1",
389 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
390 | "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg=="
391 | },
392 | "vary": {
393 | "version": "1.1.2",
394 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
395 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
396 | },
397 | "ylru": {
398 | "version": "1.2.1",
399 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
400 | "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ=="
401 | }
402 | }
403 | }
404 |
--------------------------------------------------------------------------------
/examples/paid-resources-images/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "paid-resources-images",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "koa": "^2.5.3",
13 | "koa-router": "^7.4.0",
14 | "koa-static": "^5.0.0"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/examples/paid-resources-images/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 | Web Monetization Receiver
13 | Paid Resources Images
14 |
15 |

16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/examples/paid-resources-video/README.md:
--------------------------------------------------------------------------------
1 | # Paid Resources Video
2 |
3 | Stream a video with streaming payments. When a web monetized user goes to this
4 | page, they'll receive a video of ["Big Buck
5 | Bunny"](https://en.wikipedia.org/wiki/Big_Buck_Bunny). If they stop paying,
6 | then the video will stop (after its buffer is exhausted).
7 |
8 | ## Setup
9 |
10 | - [Make sure you're running Moneyd on the
11 | livenet.](https://medium.com/interledger-blog/joining-the-live-ilp-network-eab123a73665)
12 |
13 | - Make sure you've either got an active [Coil](https://coil.com) subscription,
14 | or are running [your own Web Monetization
15 | provider](https://github.com/interledgerjs/ilp-wm-provider).
16 |
17 | ```sh
18 | # download the video because it's too large to put into git
19 | mkdir videos
20 | wget https://upload.wikimedia.org/wikipedia/commons/transcoded/c/c0/Big_Buck_Bunny_4K.webm/Big_Buck_Bunny_4K.webm.480p.webm -O videos/example.webm
21 |
22 | npm install
23 | node index.js
24 | ```
25 |
26 | Then go to [http://localhost:8096](http://localhost:8096). Hit play on the
27 | video, and you'll see it stream. If you stop moneyd or your web monetization
28 | provider, you'll see the video stop after a minute (or however long you've
29 | buffered).
30 |
--------------------------------------------------------------------------------
/examples/paid-resources-video/index.js:
--------------------------------------------------------------------------------
1 | const Koa = require('koa')
2 | const app = new Koa()
3 | const router = require('koa-router')()
4 | const serve = require('koa-static')
5 | const path = require('path')
6 | const fs = require('fs')
7 |
8 | // const { Monetizer } = require('web-monetization-receiver')
9 | const { Monetizer } = require('../..')
10 | const monetizer = new Monetizer()
11 |
12 | router.get('/videos/:id', async ctx => {
13 | const stream = fs.createReadStream(path.resolve(
14 | __dirname,
15 | 'videos',
16 | ctx.params.id
17 | ))
18 |
19 | ctx.body = ctx.webMonetization.monetizeStream(stream, {
20 | freeBytes: 100000,
21 | costPerByte: (1 / 5000)
22 | })
23 | })
24 |
25 | app
26 | .use(monetizer.koa())
27 | .use(router.routes())
28 | .use(router.allowedMethods())
29 | .use(serve(path.resolve(__dirname, './static')))
30 | .listen(process.env.PORT || 8096)
31 |
32 | console.log('listening on',
33 | process.env.PORT || 8096)
34 |
--------------------------------------------------------------------------------
/examples/paid-resources-video/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "paid-resources-video",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "accepts": {
8 | "version": "1.3.5",
9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
11 | "requires": {
12 | "mime-types": "~2.1.18",
13 | "negotiator": "0.6.1"
14 | }
15 | },
16 | "any-promise": {
17 | "version": "1.3.0",
18 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
19 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
20 | },
21 | "cache-content-type": {
22 | "version": "1.0.1",
23 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
24 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
25 | "requires": {
26 | "mime-types": "^2.1.18",
27 | "ylru": "^1.2.0"
28 | }
29 | },
30 | "co": {
31 | "version": "4.6.0",
32 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
33 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
34 | },
35 | "content-disposition": {
36 | "version": "0.5.2",
37 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
38 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
39 | },
40 | "content-type": {
41 | "version": "1.0.4",
42 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
43 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
44 | },
45 | "cookies": {
46 | "version": "0.7.2",
47 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.2.tgz",
48 | "integrity": "sha512-J2JjH9T3PUNKPHknprxgCrCaZshIfxW2j49gq1E1CP5Micj1LppWAR2y9EHSQAzEiX84zOsScWNwUZ0b/ChlMw==",
49 | "requires": {
50 | "depd": "~1.1.2",
51 | "keygrip": "~1.0.2"
52 | }
53 | },
54 | "debug": {
55 | "version": "3.1.0",
56 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
57 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
58 | "requires": {
59 | "ms": "2.0.0"
60 | }
61 | },
62 | "deep-equal": {
63 | "version": "1.0.1",
64 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
65 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
66 | },
67 | "delegates": {
68 | "version": "1.0.0",
69 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
70 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
71 | },
72 | "depd": {
73 | "version": "1.1.2",
74 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
75 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
76 | },
77 | "destroy": {
78 | "version": "1.0.4",
79 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
80 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
81 | },
82 | "ee-first": {
83 | "version": "1.1.1",
84 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
85 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
86 | },
87 | "error-inject": {
88 | "version": "1.0.0",
89 | "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz",
90 | "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc="
91 | },
92 | "escape-html": {
93 | "version": "1.0.3",
94 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
95 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
96 | },
97 | "fresh": {
98 | "version": "0.5.2",
99 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
100 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
101 | },
102 | "http-assert": {
103 | "version": "1.4.0",
104 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.0.tgz",
105 | "integrity": "sha512-tPVv62a6l3BbQoM/N5qo969l0OFxqpnQzNUPeYfTP6Spo4zkgWeDBD1D5thI7sDLg7jCCihXTLB0X8UtdyAy8A==",
106 | "requires": {
107 | "deep-equal": "~1.0.1",
108 | "http-errors": "~1.7.1"
109 | }
110 | },
111 | "http-errors": {
112 | "version": "1.7.1",
113 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.1.tgz",
114 | "integrity": "sha512-jWEUgtZWGSMba9I1N3gc1HmvpBUaNC9vDdA46yScAdp+C5rdEuKWUBLWTQpW9FwSWSbYYs++b6SDCxf9UEJzfw==",
115 | "requires": {
116 | "depd": "~1.1.2",
117 | "inherits": "2.0.3",
118 | "setprototypeof": "1.1.0",
119 | "statuses": ">= 1.5.0 < 2",
120 | "toidentifier": "1.0.0"
121 | }
122 | },
123 | "inherits": {
124 | "version": "2.0.3",
125 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
126 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
127 | },
128 | "is-generator-function": {
129 | "version": "1.0.7",
130 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz",
131 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw=="
132 | },
133 | "isarray": {
134 | "version": "0.0.1",
135 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
136 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
137 | },
138 | "keygrip": {
139 | "version": "1.0.3",
140 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz",
141 | "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g=="
142 | },
143 | "koa": {
144 | "version": "2.5.3",
145 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.5.3.tgz",
146 | "integrity": "sha512-U6rgy2kwlfO+3P1phAidDrRZpGfwcpHCxl33wFe+fHXalpzEshHGnMaSU7I/ZeDFpGRQkbQOYsXkXfUjn+AtdQ==",
147 | "requires": {
148 | "accepts": "^1.3.5",
149 | "cache-content-type": "^1.0.0",
150 | "content-disposition": "~0.5.2",
151 | "content-type": "^1.0.4",
152 | "cookies": "~0.7.1",
153 | "debug": "~3.1.0",
154 | "delegates": "^1.0.0",
155 | "depd": "^1.1.2",
156 | "destroy": "^1.0.4",
157 | "error-inject": "^1.0.0",
158 | "escape-html": "^1.0.3",
159 | "fresh": "~0.5.2",
160 | "http-assert": "^1.3.0",
161 | "http-errors": "^1.6.3",
162 | "is-generator-function": "^1.0.7",
163 | "koa-compose": "^4.1.0",
164 | "koa-convert": "^1.2.0",
165 | "koa-is-json": "^1.0.0",
166 | "on-finished": "^2.3.0",
167 | "only": "~0.0.2",
168 | "parseurl": "^1.3.2",
169 | "statuses": "^1.5.0",
170 | "type-is": "^1.6.16",
171 | "vary": "^1.1.2"
172 | }
173 | },
174 | "koa-compose": {
175 | "version": "4.1.0",
176 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
177 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="
178 | },
179 | "koa-convert": {
180 | "version": "1.2.0",
181 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz",
182 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=",
183 | "requires": {
184 | "co": "^4.6.0",
185 | "koa-compose": "^3.0.0"
186 | },
187 | "dependencies": {
188 | "koa-compose": {
189 | "version": "3.2.1",
190 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz",
191 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=",
192 | "requires": {
193 | "any-promise": "^1.1.0"
194 | }
195 | }
196 | }
197 | },
198 | "koa-is-json": {
199 | "version": "1.0.0",
200 | "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz",
201 | "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ="
202 | },
203 | "koa-router": {
204 | "version": "7.4.0",
205 | "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz",
206 | "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==",
207 | "requires": {
208 | "debug": "^3.1.0",
209 | "http-errors": "^1.3.1",
210 | "koa-compose": "^3.0.0",
211 | "methods": "^1.0.1",
212 | "path-to-regexp": "^1.1.1",
213 | "urijs": "^1.19.0"
214 | },
215 | "dependencies": {
216 | "koa-compose": {
217 | "version": "3.2.1",
218 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz",
219 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=",
220 | "requires": {
221 | "any-promise": "^1.1.0"
222 | }
223 | }
224 | }
225 | },
226 | "koa-send": {
227 | "version": "5.0.0",
228 | "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.0.tgz",
229 | "integrity": "sha512-90ZotV7t0p3uN9sRwW2D484rAaKIsD8tAVtypw/aBU+ryfV+fR2xrcAwhI8Wl6WRkojLUs/cB9SBSCuIb+IanQ==",
230 | "requires": {
231 | "debug": "^3.1.0",
232 | "http-errors": "^1.6.3",
233 | "mz": "^2.7.0",
234 | "resolve-path": "^1.4.0"
235 | }
236 | },
237 | "koa-static": {
238 | "version": "5.0.0",
239 | "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz",
240 | "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==",
241 | "requires": {
242 | "debug": "^3.1.0",
243 | "koa-send": "^5.0.0"
244 | }
245 | },
246 | "media-typer": {
247 | "version": "0.3.0",
248 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
249 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
250 | },
251 | "methods": {
252 | "version": "1.1.2",
253 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
254 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
255 | },
256 | "mime-db": {
257 | "version": "1.36.0",
258 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
259 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
260 | },
261 | "mime-types": {
262 | "version": "2.1.20",
263 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
264 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
265 | "requires": {
266 | "mime-db": "~1.36.0"
267 | }
268 | },
269 | "ms": {
270 | "version": "2.0.0",
271 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
272 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
273 | },
274 | "mz": {
275 | "version": "2.7.0",
276 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
277 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
278 | "requires": {
279 | "any-promise": "^1.0.0",
280 | "object-assign": "^4.0.1",
281 | "thenify-all": "^1.0.0"
282 | }
283 | },
284 | "negotiator": {
285 | "version": "0.6.1",
286 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
287 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
288 | },
289 | "object-assign": {
290 | "version": "4.1.1",
291 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
292 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
293 | },
294 | "on-finished": {
295 | "version": "2.3.0",
296 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
297 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
298 | "requires": {
299 | "ee-first": "1.1.1"
300 | }
301 | },
302 | "only": {
303 | "version": "0.0.2",
304 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
305 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q="
306 | },
307 | "parseurl": {
308 | "version": "1.3.2",
309 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
310 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
311 | },
312 | "path-is-absolute": {
313 | "version": "1.0.1",
314 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
315 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
316 | },
317 | "path-to-regexp": {
318 | "version": "1.7.0",
319 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
320 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
321 | "requires": {
322 | "isarray": "0.0.1"
323 | }
324 | },
325 | "resolve-path": {
326 | "version": "1.4.0",
327 | "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz",
328 | "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=",
329 | "requires": {
330 | "http-errors": "~1.6.2",
331 | "path-is-absolute": "1.0.1"
332 | },
333 | "dependencies": {
334 | "http-errors": {
335 | "version": "1.6.3",
336 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
337 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
338 | "requires": {
339 | "depd": "~1.1.2",
340 | "inherits": "2.0.3",
341 | "setprototypeof": "1.1.0",
342 | "statuses": ">= 1.4.0 < 2"
343 | }
344 | }
345 | }
346 | },
347 | "setprototypeof": {
348 | "version": "1.1.0",
349 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
350 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
351 | },
352 | "statuses": {
353 | "version": "1.5.0",
354 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
355 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
356 | },
357 | "thenify": {
358 | "version": "3.3.0",
359 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
360 | "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
361 | "requires": {
362 | "any-promise": "^1.0.0"
363 | }
364 | },
365 | "thenify-all": {
366 | "version": "1.6.0",
367 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
368 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
369 | "requires": {
370 | "thenify": ">= 3.1.0 < 4"
371 | }
372 | },
373 | "toidentifier": {
374 | "version": "1.0.0",
375 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
376 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
377 | },
378 | "type-is": {
379 | "version": "1.6.16",
380 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
381 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
382 | "requires": {
383 | "media-typer": "0.3.0",
384 | "mime-types": "~2.1.18"
385 | }
386 | },
387 | "urijs": {
388 | "version": "1.19.1",
389 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
390 | "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg=="
391 | },
392 | "vary": {
393 | "version": "1.1.2",
394 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
395 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
396 | },
397 | "ylru": {
398 | "version": "1.2.1",
399 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
400 | "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ=="
401 | }
402 | }
403 | }
404 |
--------------------------------------------------------------------------------
/examples/paid-resources-video/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "paid-resources-video",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "koa": "^2.5.3",
13 | "koa-router": "^7.4.0",
14 | "koa-static": "^5.0.0"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/examples/paid-resources-video/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 | Web Monetization Receiver
13 | Paid Resources Video
14 |
15 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | Monetizer: require('./src/monetizer'),
3 | Payer: require('./src/payer')
4 | }
5 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "web-monetization-receiver",
3 | "version": "1.1.3",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/debug": {
8 | "version": "0.0.30",
9 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz",
10 | "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ=="
11 | },
12 | "@types/events": {
13 | "version": "3.0.0",
14 | "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
15 | "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
16 | },
17 | "@types/node": {
18 | "version": "10.10.2",
19 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.10.2.tgz",
20 | "integrity": "sha512-yg1zoc4aUbsVyKg2eMpmNthOI+Edn2ntiLRxHjhGeFtTwg3CORdqkY0tBZh+TNPnTTtf4iyU5TVxbHVdEjrDTQ=="
21 | },
22 | "@types/ws": {
23 | "version": "6.0.1",
24 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz",
25 | "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==",
26 | "requires": {
27 | "@types/events": "*",
28 | "@types/node": "*"
29 | }
30 | },
31 | "acorn": {
32 | "version": "5.7.3",
33 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
34 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
35 | "dev": true
36 | },
37 | "acorn-jsx": {
38 | "version": "3.0.1",
39 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
40 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
41 | "dev": true,
42 | "requires": {
43 | "acorn": "^3.0.4"
44 | },
45 | "dependencies": {
46 | "acorn": {
47 | "version": "3.3.0",
48 | "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
49 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
50 | "dev": true
51 | }
52 | }
53 | },
54 | "ajv": {
55 | "version": "5.5.2",
56 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
57 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
58 | "dev": true,
59 | "requires": {
60 | "co": "^4.6.0",
61 | "fast-deep-equal": "^1.0.0",
62 | "fast-json-stable-stringify": "^2.0.0",
63 | "json-schema-traverse": "^0.3.0"
64 | }
65 | },
66 | "ajv-keywords": {
67 | "version": "2.1.1",
68 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
69 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
70 | "dev": true
71 | },
72 | "ansi-escapes": {
73 | "version": "3.1.0",
74 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
75 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
76 | "dev": true
77 | },
78 | "ansi-regex": {
79 | "version": "2.1.1",
80 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
81 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
82 | "dev": true
83 | },
84 | "ansi-styles": {
85 | "version": "2.2.1",
86 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
87 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
88 | "dev": true
89 | },
90 | "argparse": {
91 | "version": "1.0.10",
92 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
93 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
94 | "dev": true,
95 | "requires": {
96 | "sprintf-js": "~1.0.2"
97 | }
98 | },
99 | "array-union": {
100 | "version": "1.0.2",
101 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
102 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
103 | "dev": true,
104 | "requires": {
105 | "array-uniq": "^1.0.1"
106 | }
107 | },
108 | "array-uniq": {
109 | "version": "1.0.3",
110 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
111 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
112 | "dev": true
113 | },
114 | "arrify": {
115 | "version": "1.0.1",
116 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
117 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
118 | "dev": true
119 | },
120 | "async-limiter": {
121 | "version": "1.0.0",
122 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
123 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
124 | },
125 | "axios": {
126 | "version": "0.18.0",
127 | "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
128 | "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
129 | "requires": {
130 | "follow-redirects": "^1.3.0",
131 | "is-buffer": "^1.1.5"
132 | }
133 | },
134 | "babel-code-frame": {
135 | "version": "6.26.0",
136 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
137 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
138 | "dev": true,
139 | "requires": {
140 | "chalk": "^1.1.3",
141 | "esutils": "^2.0.2",
142 | "js-tokens": "^3.0.2"
143 | },
144 | "dependencies": {
145 | "chalk": {
146 | "version": "1.1.3",
147 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
148 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
149 | "dev": true,
150 | "requires": {
151 | "ansi-styles": "^2.2.1",
152 | "escape-string-regexp": "^1.0.2",
153 | "has-ansi": "^2.0.0",
154 | "strip-ansi": "^3.0.0",
155 | "supports-color": "^2.0.0"
156 | }
157 | },
158 | "strip-ansi": {
159 | "version": "3.0.1",
160 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
161 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
162 | "dev": true,
163 | "requires": {
164 | "ansi-regex": "^2.0.0"
165 | }
166 | },
167 | "supports-color": {
168 | "version": "2.0.0",
169 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
170 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
171 | "dev": true
172 | }
173 | }
174 | },
175 | "balanced-match": {
176 | "version": "1.0.0",
177 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
178 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
179 | "dev": true
180 | },
181 | "bignumber.js": {
182 | "version": "7.2.1",
183 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
184 | "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ=="
185 | },
186 | "brace-expansion": {
187 | "version": "1.1.11",
188 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
189 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
190 | "dev": true,
191 | "requires": {
192 | "balanced-match": "^1.0.0",
193 | "concat-map": "0.0.1"
194 | }
195 | },
196 | "btp-packet": {
197 | "version": "2.2.0",
198 | "resolved": "https://registry.npmjs.org/btp-packet/-/btp-packet-2.2.0.tgz",
199 | "integrity": "sha512-OjmYBdr0AJpeoLZcm8IiOBNvGNtIfqM46JDZVztUosRJGFRtkWlir1BmYtopsRGK9z3fIT9s0NKlqhhAL+vQ1A==",
200 | "requires": {
201 | "dateformat": "^3.0.3",
202 | "oer-utils": "^4.0.0"
203 | },
204 | "dependencies": {
205 | "oer-utils": {
206 | "version": "4.0.0",
207 | "resolved": "https://registry.npmjs.org/oer-utils/-/oer-utils-4.0.0.tgz",
208 | "integrity": "sha512-WxX0gNGSS0Lzig4IdliHlIQ03PVTpIuLFbOAag5lJrx1hWNG3f/yhx3QOmORpoXe2e53HZbeet8qoOAsiWz5BQ==",
209 | "requires": {
210 | "bignumber.js": "^7.2.1"
211 | }
212 | }
213 | }
214 | },
215 | "buffer-from": {
216 | "version": "1.1.1",
217 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
218 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
219 | },
220 | "builtin-modules": {
221 | "version": "1.1.1",
222 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
223 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
224 | "dev": true
225 | },
226 | "caller-path": {
227 | "version": "0.1.0",
228 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
229 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
230 | "dev": true,
231 | "requires": {
232 | "callsites": "^0.2.0"
233 | }
234 | },
235 | "callsites": {
236 | "version": "0.2.0",
237 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
238 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
239 | "dev": true
240 | },
241 | "chalk": {
242 | "version": "2.4.1",
243 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
244 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
245 | "dev": true,
246 | "requires": {
247 | "ansi-styles": "^3.2.1",
248 | "escape-string-regexp": "^1.0.5",
249 | "supports-color": "^5.3.0"
250 | },
251 | "dependencies": {
252 | "ansi-styles": {
253 | "version": "3.2.1",
254 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
255 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
256 | "dev": true,
257 | "requires": {
258 | "color-convert": "^1.9.0"
259 | }
260 | }
261 | }
262 | },
263 | "chardet": {
264 | "version": "0.4.2",
265 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
266 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
267 | "dev": true
268 | },
269 | "circular-json": {
270 | "version": "0.3.3",
271 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
272 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
273 | "dev": true
274 | },
275 | "cli-cursor": {
276 | "version": "2.1.0",
277 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
278 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
279 | "dev": true,
280 | "requires": {
281 | "restore-cursor": "^2.0.0"
282 | }
283 | },
284 | "cli-width": {
285 | "version": "2.2.0",
286 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
287 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
288 | "dev": true
289 | },
290 | "co": {
291 | "version": "4.6.0",
292 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
293 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
294 | "dev": true
295 | },
296 | "color-convert": {
297 | "version": "1.9.3",
298 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
299 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
300 | "dev": true,
301 | "requires": {
302 | "color-name": "1.1.3"
303 | }
304 | },
305 | "color-name": {
306 | "version": "1.1.3",
307 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
308 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
309 | "dev": true
310 | },
311 | "concat-map": {
312 | "version": "0.0.1",
313 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
314 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
315 | "dev": true
316 | },
317 | "concat-stream": {
318 | "version": "1.6.2",
319 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
320 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
321 | "dev": true,
322 | "requires": {
323 | "buffer-from": "^1.0.0",
324 | "inherits": "^2.0.3",
325 | "readable-stream": "^2.2.2",
326 | "typedarray": "^0.0.6"
327 | }
328 | },
329 | "contains-path": {
330 | "version": "0.1.0",
331 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
332 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
333 | "dev": true
334 | },
335 | "core-util-is": {
336 | "version": "1.0.2",
337 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
338 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
339 | "dev": true
340 | },
341 | "cross-spawn": {
342 | "version": "5.1.0",
343 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
344 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
345 | "dev": true,
346 | "requires": {
347 | "lru-cache": "^4.0.1",
348 | "shebang-command": "^1.2.0",
349 | "which": "^1.2.9"
350 | }
351 | },
352 | "dateformat": {
353 | "version": "3.0.3",
354 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
355 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
356 | },
357 | "debug": {
358 | "version": "4.0.1",
359 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz",
360 | "integrity": "sha512-K23FHJ/Mt404FSlp6gSZCevIbTMLX0j3fmHhUEhQ3Wq0FMODW3+cUSoLdy1Gx4polAf4t/lphhmHH35BB8cLYw==",
361 | "requires": {
362 | "ms": "^2.1.1"
363 | }
364 | },
365 | "deep-is": {
366 | "version": "0.1.3",
367 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
368 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
369 | "dev": true
370 | },
371 | "del": {
372 | "version": "2.2.2",
373 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
374 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
375 | "dev": true,
376 | "requires": {
377 | "globby": "^5.0.0",
378 | "is-path-cwd": "^1.0.0",
379 | "is-path-in-cwd": "^1.0.0",
380 | "object-assign": "^4.0.1",
381 | "pify": "^2.0.0",
382 | "pinkie-promise": "^2.0.0",
383 | "rimraf": "^2.2.8"
384 | }
385 | },
386 | "doctrine": {
387 | "version": "2.1.0",
388 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
389 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
390 | "dev": true,
391 | "requires": {
392 | "esutils": "^2.0.2"
393 | }
394 | },
395 | "error-ex": {
396 | "version": "1.3.2",
397 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
398 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
399 | "dev": true,
400 | "requires": {
401 | "is-arrayish": "^0.2.1"
402 | }
403 | },
404 | "escape-string-regexp": {
405 | "version": "1.0.5",
406 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
407 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
408 | "dev": true
409 | },
410 | "eslint": {
411 | "version": "4.19.1",
412 | "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
413 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
414 | "dev": true,
415 | "requires": {
416 | "ajv": "^5.3.0",
417 | "babel-code-frame": "^6.22.0",
418 | "chalk": "^2.1.0",
419 | "concat-stream": "^1.6.0",
420 | "cross-spawn": "^5.1.0",
421 | "debug": "^3.1.0",
422 | "doctrine": "^2.1.0",
423 | "eslint-scope": "^3.7.1",
424 | "eslint-visitor-keys": "^1.0.0",
425 | "espree": "^3.5.4",
426 | "esquery": "^1.0.0",
427 | "esutils": "^2.0.2",
428 | "file-entry-cache": "^2.0.0",
429 | "functional-red-black-tree": "^1.0.1",
430 | "glob": "^7.1.2",
431 | "globals": "^11.0.1",
432 | "ignore": "^3.3.3",
433 | "imurmurhash": "^0.1.4",
434 | "inquirer": "^3.0.6",
435 | "is-resolvable": "^1.0.0",
436 | "js-yaml": "^3.9.1",
437 | "json-stable-stringify-without-jsonify": "^1.0.1",
438 | "levn": "^0.3.0",
439 | "lodash": "^4.17.4",
440 | "minimatch": "^3.0.2",
441 | "mkdirp": "^0.5.1",
442 | "natural-compare": "^1.4.0",
443 | "optionator": "^0.8.2",
444 | "path-is-inside": "^1.0.2",
445 | "pluralize": "^7.0.0",
446 | "progress": "^2.0.0",
447 | "regexpp": "^1.0.1",
448 | "require-uncached": "^1.0.3",
449 | "semver": "^5.3.0",
450 | "strip-ansi": "^4.0.0",
451 | "strip-json-comments": "~2.0.1",
452 | "table": "4.0.2",
453 | "text-table": "~0.2.0"
454 | },
455 | "dependencies": {
456 | "debug": {
457 | "version": "3.2.5",
458 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
459 | "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
460 | "dev": true,
461 | "requires": {
462 | "ms": "^2.1.1"
463 | }
464 | }
465 | }
466 | },
467 | "eslint-config-standard": {
468 | "version": "11.0.0",
469 | "resolved": "http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz",
470 | "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==",
471 | "dev": true
472 | },
473 | "eslint-import-resolver-node": {
474 | "version": "0.3.2",
475 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
476 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
477 | "dev": true,
478 | "requires": {
479 | "debug": "^2.6.9",
480 | "resolve": "^1.5.0"
481 | },
482 | "dependencies": {
483 | "debug": {
484 | "version": "2.6.9",
485 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
486 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
487 | "dev": true,
488 | "requires": {
489 | "ms": "2.0.0"
490 | }
491 | },
492 | "ms": {
493 | "version": "2.0.0",
494 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
495 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
496 | "dev": true
497 | }
498 | }
499 | },
500 | "eslint-module-utils": {
501 | "version": "2.2.0",
502 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
503 | "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
504 | "dev": true,
505 | "requires": {
506 | "debug": "^2.6.8",
507 | "pkg-dir": "^1.0.0"
508 | },
509 | "dependencies": {
510 | "debug": {
511 | "version": "2.6.9",
512 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
513 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
514 | "dev": true,
515 | "requires": {
516 | "ms": "2.0.0"
517 | }
518 | },
519 | "ms": {
520 | "version": "2.0.0",
521 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
522 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
523 | "dev": true
524 | }
525 | }
526 | },
527 | "eslint-plugin-import": {
528 | "version": "2.14.0",
529 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz",
530 | "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==",
531 | "dev": true,
532 | "requires": {
533 | "contains-path": "^0.1.0",
534 | "debug": "^2.6.8",
535 | "doctrine": "1.5.0",
536 | "eslint-import-resolver-node": "^0.3.1",
537 | "eslint-module-utils": "^2.2.0",
538 | "has": "^1.0.1",
539 | "lodash": "^4.17.4",
540 | "minimatch": "^3.0.3",
541 | "read-pkg-up": "^2.0.0",
542 | "resolve": "^1.6.0"
543 | },
544 | "dependencies": {
545 | "debug": {
546 | "version": "2.6.9",
547 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
548 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
549 | "dev": true,
550 | "requires": {
551 | "ms": "2.0.0"
552 | }
553 | },
554 | "doctrine": {
555 | "version": "1.5.0",
556 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
557 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
558 | "dev": true,
559 | "requires": {
560 | "esutils": "^2.0.2",
561 | "isarray": "^1.0.0"
562 | }
563 | },
564 | "ms": {
565 | "version": "2.0.0",
566 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
567 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
568 | "dev": true
569 | }
570 | }
571 | },
572 | "eslint-plugin-node": {
573 | "version": "5.2.1",
574 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz",
575 | "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==",
576 | "dev": true,
577 | "requires": {
578 | "ignore": "^3.3.6",
579 | "minimatch": "^3.0.4",
580 | "resolve": "^1.3.3",
581 | "semver": "5.3.0"
582 | },
583 | "dependencies": {
584 | "semver": {
585 | "version": "5.3.0",
586 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
587 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
588 | "dev": true
589 | }
590 | }
591 | },
592 | "eslint-plugin-promise": {
593 | "version": "3.8.0",
594 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz",
595 | "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==",
596 | "dev": true
597 | },
598 | "eslint-plugin-standard": {
599 | "version": "3.1.0",
600 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz",
601 | "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==",
602 | "dev": true
603 | },
604 | "eslint-scope": {
605 | "version": "3.7.3",
606 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
607 | "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
608 | "dev": true,
609 | "requires": {
610 | "esrecurse": "^4.1.0",
611 | "estraverse": "^4.1.1"
612 | }
613 | },
614 | "eslint-visitor-keys": {
615 | "version": "1.0.0",
616 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
617 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
618 | "dev": true
619 | },
620 | "espree": {
621 | "version": "3.5.4",
622 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
623 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
624 | "dev": true,
625 | "requires": {
626 | "acorn": "^5.5.0",
627 | "acorn-jsx": "^3.0.0"
628 | }
629 | },
630 | "esprima": {
631 | "version": "4.0.1",
632 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
633 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
634 | "dev": true
635 | },
636 | "esquery": {
637 | "version": "1.0.1",
638 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
639 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
640 | "dev": true,
641 | "requires": {
642 | "estraverse": "^4.0.0"
643 | }
644 | },
645 | "esrecurse": {
646 | "version": "4.2.1",
647 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
648 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
649 | "dev": true,
650 | "requires": {
651 | "estraverse": "^4.1.0"
652 | }
653 | },
654 | "estraverse": {
655 | "version": "4.2.0",
656 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
657 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
658 | "dev": true
659 | },
660 | "esutils": {
661 | "version": "2.0.2",
662 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
663 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
664 | "dev": true
665 | },
666 | "eventemitter2": {
667 | "version": "5.0.1",
668 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
669 | "integrity": "sha1-YZegldX7a1folC9v1+qtY6CclFI="
670 | },
671 | "extensible-error": {
672 | "version": "1.0.2",
673 | "resolved": "https://registry.npmjs.org/extensible-error/-/extensible-error-1.0.2.tgz",
674 | "integrity": "sha512-kXU1FiTsGT8PyMKtFM074RK/VBpzwuQJicAHqBpsPDeTXBQiSALPjkjKXlyKdG/GP6lR7bBaEkq8qdoO2geu9g=="
675 | },
676 | "external-editor": {
677 | "version": "2.2.0",
678 | "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
679 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
680 | "dev": true,
681 | "requires": {
682 | "chardet": "^0.4.0",
683 | "iconv-lite": "^0.4.17",
684 | "tmp": "^0.0.33"
685 | }
686 | },
687 | "fast-deep-equal": {
688 | "version": "1.1.0",
689 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
690 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
691 | "dev": true
692 | },
693 | "fast-json-stable-stringify": {
694 | "version": "2.0.0",
695 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
696 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
697 | "dev": true
698 | },
699 | "fast-levenshtein": {
700 | "version": "2.0.6",
701 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
702 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
703 | "dev": true
704 | },
705 | "figures": {
706 | "version": "2.0.0",
707 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
708 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
709 | "dev": true,
710 | "requires": {
711 | "escape-string-regexp": "^1.0.5"
712 | }
713 | },
714 | "file-entry-cache": {
715 | "version": "2.0.0",
716 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
717 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
718 | "dev": true,
719 | "requires": {
720 | "flat-cache": "^1.2.1",
721 | "object-assign": "^4.0.1"
722 | }
723 | },
724 | "find-up": {
725 | "version": "1.1.2",
726 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
727 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
728 | "dev": true,
729 | "requires": {
730 | "path-exists": "^2.0.0",
731 | "pinkie-promise": "^2.0.0"
732 | }
733 | },
734 | "flat-cache": {
735 | "version": "1.3.0",
736 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
737 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
738 | "dev": true,
739 | "requires": {
740 | "circular-json": "^0.3.1",
741 | "del": "^2.0.2",
742 | "graceful-fs": "^4.1.2",
743 | "write": "^0.2.1"
744 | }
745 | },
746 | "follow-redirects": {
747 | "version": "1.5.8",
748 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.8.tgz",
749 | "integrity": "sha512-sy1mXPmv7kLAMKW/8XofG7o9T+6gAjzdZK4AJF6ryqQYUa/hnzgiypoeUecZ53x7XiqKNEpNqLtS97MshW2nxg==",
750 | "requires": {
751 | "debug": "=3.1.0"
752 | },
753 | "dependencies": {
754 | "debug": {
755 | "version": "3.1.0",
756 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
757 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
758 | "requires": {
759 | "ms": "2.0.0"
760 | }
761 | },
762 | "ms": {
763 | "version": "2.0.0",
764 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
765 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
766 | }
767 | }
768 | },
769 | "fs.realpath": {
770 | "version": "1.0.0",
771 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
772 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
773 | "dev": true
774 | },
775 | "function-bind": {
776 | "version": "1.1.1",
777 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
778 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
779 | "dev": true
780 | },
781 | "functional-red-black-tree": {
782 | "version": "1.0.1",
783 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
784 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
785 | "dev": true
786 | },
787 | "glob": {
788 | "version": "7.1.3",
789 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
790 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
791 | "dev": true,
792 | "requires": {
793 | "fs.realpath": "^1.0.0",
794 | "inflight": "^1.0.4",
795 | "inherits": "2",
796 | "minimatch": "^3.0.4",
797 | "once": "^1.3.0",
798 | "path-is-absolute": "^1.0.0"
799 | }
800 | },
801 | "globals": {
802 | "version": "11.7.0",
803 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
804 | "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
805 | "dev": true
806 | },
807 | "globby": {
808 | "version": "5.0.0",
809 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
810 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
811 | "dev": true,
812 | "requires": {
813 | "array-union": "^1.0.1",
814 | "arrify": "^1.0.0",
815 | "glob": "^7.0.3",
816 | "object-assign": "^4.0.1",
817 | "pify": "^2.0.0",
818 | "pinkie-promise": "^2.0.0"
819 | }
820 | },
821 | "graceful-fs": {
822 | "version": "4.1.11",
823 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
824 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
825 | "dev": true
826 | },
827 | "has": {
828 | "version": "1.0.3",
829 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
830 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
831 | "dev": true,
832 | "requires": {
833 | "function-bind": "^1.1.1"
834 | }
835 | },
836 | "has-ansi": {
837 | "version": "2.0.0",
838 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
839 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
840 | "dev": true,
841 | "requires": {
842 | "ansi-regex": "^2.0.0"
843 | }
844 | },
845 | "has-flag": {
846 | "version": "3.0.0",
847 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
848 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
849 | },
850 | "hosted-git-info": {
851 | "version": "2.7.1",
852 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
853 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
854 | "dev": true
855 | },
856 | "iconv-lite": {
857 | "version": "0.4.24",
858 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
859 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
860 | "dev": true,
861 | "requires": {
862 | "safer-buffer": ">= 2.1.2 < 3"
863 | }
864 | },
865 | "ignore": {
866 | "version": "3.3.10",
867 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
868 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
869 | "dev": true
870 | },
871 | "ilp-logger": {
872 | "version": "1.1.2",
873 | "resolved": "https://registry.npmjs.org/ilp-logger/-/ilp-logger-1.1.2.tgz",
874 | "integrity": "sha512-LTPA2cwtBGOSiHuspdESKRXQT8CCoGVIUQAeHlNKDz132qwtwwd7KPVWAbGkZer7EQaLW1Cwa9vGR61sSYINww==",
875 | "requires": {
876 | "@types/debug": "^0.0.30",
877 | "debug": "^4.0.0",
878 | "source-map-support": "^0.5.9",
879 | "supports-color": "^5.5.0"
880 | }
881 | },
882 | "ilp-packet": {
883 | "version": "3.0.0",
884 | "resolved": "https://registry.npmjs.org/ilp-packet/-/ilp-packet-3.0.0.tgz",
885 | "integrity": "sha512-mqB39/fN7wvMWD88bky0MBtb98q826bArUokf1T0+B/gkg65Z6fcgCTMACenebO0ExtjxPIln38VmhlqWUE7Tg==",
886 | "requires": {
887 | "bignumber.js": "^7.2.1",
888 | "extensible-error": "^1.0.2",
889 | "long": "^4.0.0",
890 | "oer-utils": "^3.0.1"
891 | }
892 | },
893 | "ilp-plugin": {
894 | "version": "3.3.1",
895 | "resolved": "https://registry.npmjs.org/ilp-plugin/-/ilp-plugin-3.3.1.tgz",
896 | "integrity": "sha512-3ItpX6EqZUvkXXrw/+CMbZt0o93Ij+BrGYW0R9y5J3BoLOl7pUmYcG7+F8M/bmnFVeDKlesROZOhAki0lpabjg==",
897 | "requires": {
898 | "ilp-logger": "^1.0.2",
899 | "ilp-plugin-btp": "^1.2.1"
900 | }
901 | },
902 | "ilp-plugin-btp": {
903 | "version": "1.3.11",
904 | "resolved": "https://registry.npmjs.org/ilp-plugin-btp/-/ilp-plugin-btp-1.3.11.tgz",
905 | "integrity": "sha512-B3icW6W5975qQLNSPB+1L13tpc5TbxLNpKSvATedH8huY+5JbHdlfmQoeXTieQZYhta0W16DQcZ3tev1TMsW2A==",
906 | "requires": {
907 | "@types/debug": "0.0.30",
908 | "@types/node": "^10.7.1",
909 | "@types/ws": "^6.0.0",
910 | "btp-packet": "^2.2.0",
911 | "debug": "^3.1.0",
912 | "eventemitter2": "^5.0.0",
913 | "ilp-logger": "^1.1.3",
914 | "ws": "^6.0.0"
915 | },
916 | "dependencies": {
917 | "debug": {
918 | "version": "3.2.6",
919 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
920 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
921 | "requires": {
922 | "ms": "^2.1.1"
923 | }
924 | },
925 | "ilp-logger": {
926 | "version": "1.1.3",
927 | "resolved": "https://registry.npmjs.org/ilp-logger/-/ilp-logger-1.1.3.tgz",
928 | "integrity": "sha512-zjCe82YGI1SMnwDf2GGKhGqx0V4UcpReZSiYuBy9KvyOW08Da4geOJfhNd+h9jczDIQ+mFxrbeKoBa/Zbs/5xw==",
929 | "requires": {
930 | "@types/debug": "^0.0.31",
931 | "debug": "^4.1.0",
932 | "supports-color": "^5.5.0"
933 | },
934 | "dependencies": {
935 | "@types/debug": {
936 | "version": "0.0.31",
937 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.31.tgz",
938 | "integrity": "sha512-LS1MCPaQKqspg7FvexuhmDbWUhE2yIJ+4AgVIyObfc06/UKZ8REgxGNjZc82wPLWmbeOm7S+gSsLgo75TanG4A=="
939 | },
940 | "debug": {
941 | "version": "4.1.1",
942 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
943 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
944 | "requires": {
945 | "ms": "^2.1.1"
946 | }
947 | }
948 | }
949 | }
950 | }
951 | },
952 | "ilp-protocol-ildcp": {
953 | "version": "2.0.0",
954 | "resolved": "https://registry.npmjs.org/ilp-protocol-ildcp/-/ilp-protocol-ildcp-2.0.0.tgz",
955 | "integrity": "sha512-ThJeAQpvoPGXby8RvFGFsLQrl0IwTOwNADNGmZxpXPcqHBQ54zL+lFlUePWnyISt4vnJGA6ccIPssElgGk/0Fw==",
956 | "requires": {
957 | "debug": "^3.1.0",
958 | "ilp-packet": "^3.0.0",
959 | "oer-utils": "^3.0.1"
960 | },
961 | "dependencies": {
962 | "debug": {
963 | "version": "3.2.5",
964 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
965 | "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
966 | "requires": {
967 | "ms": "^2.1.1"
968 | }
969 | }
970 | }
971 | },
972 | "ilp-protocol-stream": {
973 | "version": "1.8.3",
974 | "resolved": "https://registry.npmjs.org/ilp-protocol-stream/-/ilp-protocol-stream-1.8.3.tgz",
975 | "integrity": "sha512-FHe9DmMapETFeiG9A1zuL8H0Sp7/PCTeVHK4BNtMYcTt2PXAAjyzWbLp/CJF+ML0RCCVONQ5SDaSgEFgNu6/+w==",
976 | "requires": {
977 | "@types/node": "^10.7.1",
978 | "bignumber.js": "^7.2.1",
979 | "debug": "^4.0.0",
980 | "ilp-logger": "^1.1.2",
981 | "ilp-packet": "^3.0.0",
982 | "ilp-protocol-ildcp": "^2.0.0",
983 | "oer-utils": "^3.0.1",
984 | "source-map-support": "^0.5.6"
985 | }
986 | },
987 | "imurmurhash": {
988 | "version": "0.1.4",
989 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
990 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
991 | "dev": true
992 | },
993 | "inflight": {
994 | "version": "1.0.6",
995 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
996 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
997 | "dev": true,
998 | "requires": {
999 | "once": "^1.3.0",
1000 | "wrappy": "1"
1001 | }
1002 | },
1003 | "inherits": {
1004 | "version": "2.0.3",
1005 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1006 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1007 | "dev": true
1008 | },
1009 | "inquirer": {
1010 | "version": "3.3.0",
1011 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
1012 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
1013 | "dev": true,
1014 | "requires": {
1015 | "ansi-escapes": "^3.0.0",
1016 | "chalk": "^2.0.0",
1017 | "cli-cursor": "^2.1.0",
1018 | "cli-width": "^2.0.0",
1019 | "external-editor": "^2.0.4",
1020 | "figures": "^2.0.0",
1021 | "lodash": "^4.3.0",
1022 | "mute-stream": "0.0.7",
1023 | "run-async": "^2.2.0",
1024 | "rx-lite": "^4.0.8",
1025 | "rx-lite-aggregates": "^4.0.8",
1026 | "string-width": "^2.1.0",
1027 | "strip-ansi": "^4.0.0",
1028 | "through": "^2.3.6"
1029 | }
1030 | },
1031 | "is-arrayish": {
1032 | "version": "0.2.1",
1033 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1034 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1035 | "dev": true
1036 | },
1037 | "is-buffer": {
1038 | "version": "1.1.6",
1039 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1040 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
1041 | },
1042 | "is-builtin-module": {
1043 | "version": "1.0.0",
1044 | "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
1045 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
1046 | "dev": true,
1047 | "requires": {
1048 | "builtin-modules": "^1.0.0"
1049 | }
1050 | },
1051 | "is-fullwidth-code-point": {
1052 | "version": "2.0.0",
1053 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1054 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1055 | "dev": true
1056 | },
1057 | "is-path-cwd": {
1058 | "version": "1.0.0",
1059 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
1060 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
1061 | "dev": true
1062 | },
1063 | "is-path-in-cwd": {
1064 | "version": "1.0.1",
1065 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
1066 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
1067 | "dev": true,
1068 | "requires": {
1069 | "is-path-inside": "^1.0.0"
1070 | }
1071 | },
1072 | "is-path-inside": {
1073 | "version": "1.0.1",
1074 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
1075 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
1076 | "dev": true,
1077 | "requires": {
1078 | "path-is-inside": "^1.0.1"
1079 | }
1080 | },
1081 | "is-promise": {
1082 | "version": "2.1.0",
1083 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1084 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1085 | "dev": true
1086 | },
1087 | "is-resolvable": {
1088 | "version": "1.1.0",
1089 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
1090 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
1091 | "dev": true
1092 | },
1093 | "isarray": {
1094 | "version": "1.0.0",
1095 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1096 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1097 | "dev": true
1098 | },
1099 | "isexe": {
1100 | "version": "2.0.0",
1101 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1102 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1103 | "dev": true
1104 | },
1105 | "js-tokens": {
1106 | "version": "3.0.2",
1107 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
1108 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
1109 | "dev": true
1110 | },
1111 | "js-yaml": {
1112 | "version": "3.12.0",
1113 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
1114 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
1115 | "dev": true,
1116 | "requires": {
1117 | "argparse": "^1.0.7",
1118 | "esprima": "^4.0.0"
1119 | }
1120 | },
1121 | "json-schema-traverse": {
1122 | "version": "0.3.1",
1123 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
1124 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
1125 | "dev": true
1126 | },
1127 | "json-stable-stringify-without-jsonify": {
1128 | "version": "1.0.1",
1129 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1130 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1131 | "dev": true
1132 | },
1133 | "levn": {
1134 | "version": "0.3.0",
1135 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1136 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1137 | "dev": true,
1138 | "requires": {
1139 | "prelude-ls": "~1.1.2",
1140 | "type-check": "~0.3.2"
1141 | }
1142 | },
1143 | "load-json-file": {
1144 | "version": "2.0.0",
1145 | "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
1146 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
1147 | "dev": true,
1148 | "requires": {
1149 | "graceful-fs": "^4.1.2",
1150 | "parse-json": "^2.2.0",
1151 | "pify": "^2.0.0",
1152 | "strip-bom": "^3.0.0"
1153 | }
1154 | },
1155 | "locate-path": {
1156 | "version": "2.0.0",
1157 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
1158 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
1159 | "dev": true,
1160 | "requires": {
1161 | "p-locate": "^2.0.0",
1162 | "path-exists": "^3.0.0"
1163 | },
1164 | "dependencies": {
1165 | "path-exists": {
1166 | "version": "3.0.0",
1167 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1168 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1169 | "dev": true
1170 | }
1171 | }
1172 | },
1173 | "lodash": {
1174 | "version": "4.17.11",
1175 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
1176 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
1177 | "dev": true
1178 | },
1179 | "long": {
1180 | "version": "4.0.0",
1181 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
1182 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
1183 | },
1184 | "lru-cache": {
1185 | "version": "4.1.3",
1186 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
1187 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
1188 | "dev": true,
1189 | "requires": {
1190 | "pseudomap": "^1.0.2",
1191 | "yallist": "^2.1.2"
1192 | }
1193 | },
1194 | "mimic-fn": {
1195 | "version": "1.2.0",
1196 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1197 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1198 | "dev": true
1199 | },
1200 | "minimatch": {
1201 | "version": "3.0.4",
1202 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1203 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1204 | "dev": true,
1205 | "requires": {
1206 | "brace-expansion": "^1.1.7"
1207 | }
1208 | },
1209 | "minimist": {
1210 | "version": "0.0.8",
1211 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1212 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1213 | "dev": true
1214 | },
1215 | "mkdirp": {
1216 | "version": "0.5.1",
1217 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1218 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1219 | "dev": true,
1220 | "requires": {
1221 | "minimist": "0.0.8"
1222 | }
1223 | },
1224 | "ms": {
1225 | "version": "2.1.1",
1226 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1227 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1228 | },
1229 | "mute-stream": {
1230 | "version": "0.0.7",
1231 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1232 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
1233 | "dev": true
1234 | },
1235 | "natural-compare": {
1236 | "version": "1.4.0",
1237 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1238 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1239 | "dev": true
1240 | },
1241 | "normalize-package-data": {
1242 | "version": "2.4.0",
1243 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
1244 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
1245 | "dev": true,
1246 | "requires": {
1247 | "hosted-git-info": "^2.1.4",
1248 | "is-builtin-module": "^1.0.0",
1249 | "semver": "2 || 3 || 4 || 5",
1250 | "validate-npm-package-license": "^3.0.1"
1251 | }
1252 | },
1253 | "object-assign": {
1254 | "version": "4.1.1",
1255 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1256 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1257 | "dev": true
1258 | },
1259 | "oer-utils": {
1260 | "version": "3.0.1",
1261 | "resolved": "https://registry.npmjs.org/oer-utils/-/oer-utils-3.0.1.tgz",
1262 | "integrity": "sha512-cyVlY/pP3zhfb9cpv/lcMlVejaVSLJo4Y5ExP39dEcTYP8JwCReWbglOhFNnxLJT3PFQi+6IHHfOWuDmjW9LyA==",
1263 | "requires": {
1264 | "bignumber.js": "^7.2.1"
1265 | }
1266 | },
1267 | "once": {
1268 | "version": "1.4.0",
1269 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1270 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1271 | "dev": true,
1272 | "requires": {
1273 | "wrappy": "1"
1274 | }
1275 | },
1276 | "onetime": {
1277 | "version": "2.0.1",
1278 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1279 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1280 | "dev": true,
1281 | "requires": {
1282 | "mimic-fn": "^1.0.0"
1283 | }
1284 | },
1285 | "optionator": {
1286 | "version": "0.8.2",
1287 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
1288 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
1289 | "dev": true,
1290 | "requires": {
1291 | "deep-is": "~0.1.3",
1292 | "fast-levenshtein": "~2.0.4",
1293 | "levn": "~0.3.0",
1294 | "prelude-ls": "~1.1.2",
1295 | "type-check": "~0.3.2",
1296 | "wordwrap": "~1.0.0"
1297 | }
1298 | },
1299 | "os-tmpdir": {
1300 | "version": "1.0.2",
1301 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1302 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1303 | "dev": true
1304 | },
1305 | "p-limit": {
1306 | "version": "1.3.0",
1307 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
1308 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
1309 | "dev": true,
1310 | "requires": {
1311 | "p-try": "^1.0.0"
1312 | }
1313 | },
1314 | "p-locate": {
1315 | "version": "2.0.0",
1316 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
1317 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
1318 | "dev": true,
1319 | "requires": {
1320 | "p-limit": "^1.1.0"
1321 | }
1322 | },
1323 | "p-try": {
1324 | "version": "1.0.0",
1325 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
1326 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
1327 | "dev": true
1328 | },
1329 | "parse-json": {
1330 | "version": "2.2.0",
1331 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1332 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1333 | "dev": true,
1334 | "requires": {
1335 | "error-ex": "^1.2.0"
1336 | }
1337 | },
1338 | "path-exists": {
1339 | "version": "2.1.0",
1340 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
1341 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
1342 | "dev": true,
1343 | "requires": {
1344 | "pinkie-promise": "^2.0.0"
1345 | }
1346 | },
1347 | "path-is-absolute": {
1348 | "version": "1.0.1",
1349 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1350 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1351 | "dev": true
1352 | },
1353 | "path-is-inside": {
1354 | "version": "1.0.2",
1355 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1356 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1357 | "dev": true
1358 | },
1359 | "path-parse": {
1360 | "version": "1.0.6",
1361 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1362 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1363 | "dev": true
1364 | },
1365 | "path-type": {
1366 | "version": "2.0.0",
1367 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
1368 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
1369 | "dev": true,
1370 | "requires": {
1371 | "pify": "^2.0.0"
1372 | }
1373 | },
1374 | "pify": {
1375 | "version": "2.3.0",
1376 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1377 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1378 | "dev": true
1379 | },
1380 | "pinkie": {
1381 | "version": "2.0.4",
1382 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1383 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
1384 | "dev": true
1385 | },
1386 | "pinkie-promise": {
1387 | "version": "2.0.1",
1388 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1389 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1390 | "dev": true,
1391 | "requires": {
1392 | "pinkie": "^2.0.0"
1393 | }
1394 | },
1395 | "pkg-dir": {
1396 | "version": "1.0.0",
1397 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
1398 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
1399 | "dev": true,
1400 | "requires": {
1401 | "find-up": "^1.0.0"
1402 | }
1403 | },
1404 | "pluralize": {
1405 | "version": "7.0.0",
1406 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
1407 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
1408 | "dev": true
1409 | },
1410 | "prelude-ls": {
1411 | "version": "1.1.2",
1412 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1413 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
1414 | "dev": true
1415 | },
1416 | "process-nextick-args": {
1417 | "version": "2.0.0",
1418 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1419 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1420 | "dev": true
1421 | },
1422 | "progress": {
1423 | "version": "2.0.0",
1424 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
1425 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
1426 | "dev": true
1427 | },
1428 | "pseudomap": {
1429 | "version": "1.0.2",
1430 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1431 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1432 | "dev": true
1433 | },
1434 | "read-pkg": {
1435 | "version": "2.0.0",
1436 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
1437 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
1438 | "dev": true,
1439 | "requires": {
1440 | "load-json-file": "^2.0.0",
1441 | "normalize-package-data": "^2.3.2",
1442 | "path-type": "^2.0.0"
1443 | }
1444 | },
1445 | "read-pkg-up": {
1446 | "version": "2.0.0",
1447 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
1448 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
1449 | "dev": true,
1450 | "requires": {
1451 | "find-up": "^2.0.0",
1452 | "read-pkg": "^2.0.0"
1453 | },
1454 | "dependencies": {
1455 | "find-up": {
1456 | "version": "2.1.0",
1457 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1458 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1459 | "dev": true,
1460 | "requires": {
1461 | "locate-path": "^2.0.0"
1462 | }
1463 | }
1464 | }
1465 | },
1466 | "readable-stream": {
1467 | "version": "2.3.6",
1468 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1469 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1470 | "dev": true,
1471 | "requires": {
1472 | "core-util-is": "~1.0.0",
1473 | "inherits": "~2.0.3",
1474 | "isarray": "~1.0.0",
1475 | "process-nextick-args": "~2.0.0",
1476 | "safe-buffer": "~5.1.1",
1477 | "string_decoder": "~1.1.1",
1478 | "util-deprecate": "~1.0.1"
1479 | }
1480 | },
1481 | "regexpp": {
1482 | "version": "1.1.0",
1483 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
1484 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
1485 | "dev": true
1486 | },
1487 | "require-uncached": {
1488 | "version": "1.0.3",
1489 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
1490 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
1491 | "dev": true,
1492 | "requires": {
1493 | "caller-path": "^0.1.0",
1494 | "resolve-from": "^1.0.0"
1495 | }
1496 | },
1497 | "resolve": {
1498 | "version": "1.8.1",
1499 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
1500 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
1501 | "dev": true,
1502 | "requires": {
1503 | "path-parse": "^1.0.5"
1504 | }
1505 | },
1506 | "resolve-from": {
1507 | "version": "1.0.1",
1508 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
1509 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
1510 | "dev": true
1511 | },
1512 | "restore-cursor": {
1513 | "version": "2.0.0",
1514 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1515 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1516 | "dev": true,
1517 | "requires": {
1518 | "onetime": "^2.0.0",
1519 | "signal-exit": "^3.0.2"
1520 | }
1521 | },
1522 | "rimraf": {
1523 | "version": "2.6.2",
1524 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1525 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1526 | "dev": true,
1527 | "requires": {
1528 | "glob": "^7.0.5"
1529 | }
1530 | },
1531 | "run-async": {
1532 | "version": "2.3.0",
1533 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1534 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1535 | "dev": true,
1536 | "requires": {
1537 | "is-promise": "^2.1.0"
1538 | }
1539 | },
1540 | "rx-lite": {
1541 | "version": "4.0.8",
1542 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
1543 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
1544 | "dev": true
1545 | },
1546 | "rx-lite-aggregates": {
1547 | "version": "4.0.8",
1548 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
1549 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
1550 | "dev": true,
1551 | "requires": {
1552 | "rx-lite": "*"
1553 | }
1554 | },
1555 | "safe-buffer": {
1556 | "version": "5.1.2",
1557 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1558 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1559 | "dev": true
1560 | },
1561 | "safer-buffer": {
1562 | "version": "2.1.2",
1563 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1564 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1565 | "dev": true
1566 | },
1567 | "semver": {
1568 | "version": "5.5.1",
1569 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
1570 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
1571 | "dev": true
1572 | },
1573 | "shebang-command": {
1574 | "version": "1.2.0",
1575 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1576 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1577 | "dev": true,
1578 | "requires": {
1579 | "shebang-regex": "^1.0.0"
1580 | }
1581 | },
1582 | "shebang-regex": {
1583 | "version": "1.0.0",
1584 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1585 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1586 | "dev": true
1587 | },
1588 | "signal-exit": {
1589 | "version": "3.0.2",
1590 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1591 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1592 | "dev": true
1593 | },
1594 | "slice-ansi": {
1595 | "version": "1.0.0",
1596 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
1597 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
1598 | "dev": true,
1599 | "requires": {
1600 | "is-fullwidth-code-point": "^2.0.0"
1601 | }
1602 | },
1603 | "source-map": {
1604 | "version": "0.6.1",
1605 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1606 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1607 | },
1608 | "source-map-support": {
1609 | "version": "0.5.9",
1610 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz",
1611 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==",
1612 | "requires": {
1613 | "buffer-from": "^1.0.0",
1614 | "source-map": "^0.6.0"
1615 | }
1616 | },
1617 | "spdx-correct": {
1618 | "version": "3.0.0",
1619 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
1620 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
1621 | "dev": true,
1622 | "requires": {
1623 | "spdx-expression-parse": "^3.0.0",
1624 | "spdx-license-ids": "^3.0.0"
1625 | }
1626 | },
1627 | "spdx-exceptions": {
1628 | "version": "2.1.0",
1629 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
1630 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
1631 | "dev": true
1632 | },
1633 | "spdx-expression-parse": {
1634 | "version": "3.0.0",
1635 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
1636 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
1637 | "dev": true,
1638 | "requires": {
1639 | "spdx-exceptions": "^2.1.0",
1640 | "spdx-license-ids": "^3.0.0"
1641 | }
1642 | },
1643 | "spdx-license-ids": {
1644 | "version": "3.0.1",
1645 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
1646 | "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==",
1647 | "dev": true
1648 | },
1649 | "sprintf-js": {
1650 | "version": "1.0.3",
1651 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1652 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1653 | "dev": true
1654 | },
1655 | "string-width": {
1656 | "version": "2.1.1",
1657 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1658 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1659 | "dev": true,
1660 | "requires": {
1661 | "is-fullwidth-code-point": "^2.0.0",
1662 | "strip-ansi": "^4.0.0"
1663 | }
1664 | },
1665 | "string_decoder": {
1666 | "version": "1.1.1",
1667 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1668 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1669 | "dev": true,
1670 | "requires": {
1671 | "safe-buffer": "~5.1.0"
1672 | }
1673 | },
1674 | "strip-ansi": {
1675 | "version": "4.0.0",
1676 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1677 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1678 | "dev": true,
1679 | "requires": {
1680 | "ansi-regex": "^3.0.0"
1681 | },
1682 | "dependencies": {
1683 | "ansi-regex": {
1684 | "version": "3.0.0",
1685 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1686 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1687 | "dev": true
1688 | }
1689 | }
1690 | },
1691 | "strip-bom": {
1692 | "version": "3.0.0",
1693 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
1694 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
1695 | "dev": true
1696 | },
1697 | "strip-json-comments": {
1698 | "version": "2.0.1",
1699 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1700 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1701 | "dev": true
1702 | },
1703 | "supports-color": {
1704 | "version": "5.5.0",
1705 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1706 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1707 | "requires": {
1708 | "has-flag": "^3.0.0"
1709 | }
1710 | },
1711 | "table": {
1712 | "version": "4.0.2",
1713 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
1714 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
1715 | "dev": true,
1716 | "requires": {
1717 | "ajv": "^5.2.3",
1718 | "ajv-keywords": "^2.1.0",
1719 | "chalk": "^2.1.0",
1720 | "lodash": "^4.17.4",
1721 | "slice-ansi": "1.0.0",
1722 | "string-width": "^2.1.1"
1723 | }
1724 | },
1725 | "text-table": {
1726 | "version": "0.2.0",
1727 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1728 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1729 | "dev": true
1730 | },
1731 | "through": {
1732 | "version": "2.3.8",
1733 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
1734 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1735 | "dev": true
1736 | },
1737 | "tmp": {
1738 | "version": "0.0.33",
1739 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1740 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1741 | "dev": true,
1742 | "requires": {
1743 | "os-tmpdir": "~1.0.2"
1744 | }
1745 | },
1746 | "type-check": {
1747 | "version": "0.3.2",
1748 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1749 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1750 | "dev": true,
1751 | "requires": {
1752 | "prelude-ls": "~1.1.2"
1753 | }
1754 | },
1755 | "typedarray": {
1756 | "version": "0.0.6",
1757 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1758 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1759 | "dev": true
1760 | },
1761 | "util-deprecate": {
1762 | "version": "1.0.2",
1763 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1764 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1765 | "dev": true
1766 | },
1767 | "validate-npm-package-license": {
1768 | "version": "3.0.4",
1769 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
1770 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
1771 | "dev": true,
1772 | "requires": {
1773 | "spdx-correct": "^3.0.0",
1774 | "spdx-expression-parse": "^3.0.0"
1775 | }
1776 | },
1777 | "which": {
1778 | "version": "1.3.1",
1779 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1780 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1781 | "dev": true,
1782 | "requires": {
1783 | "isexe": "^2.0.0"
1784 | }
1785 | },
1786 | "wordwrap": {
1787 | "version": "1.0.0",
1788 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1789 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
1790 | "dev": true
1791 | },
1792 | "wrappy": {
1793 | "version": "1.0.2",
1794 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1795 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1796 | "dev": true
1797 | },
1798 | "write": {
1799 | "version": "0.2.1",
1800 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
1801 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
1802 | "dev": true,
1803 | "requires": {
1804 | "mkdirp": "^0.5.1"
1805 | }
1806 | },
1807 | "ws": {
1808 | "version": "6.2.1",
1809 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
1810 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
1811 | "requires": {
1812 | "async-limiter": "~1.0.0"
1813 | }
1814 | },
1815 | "yallist": {
1816 | "version": "2.1.2",
1817 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1818 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1819 | "dev": true
1820 | }
1821 | }
1822 | }
1823 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "web-monetization-receiver",
3 | "version": "1.1.3",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "lint": "eslint ."
9 | },
10 | "author": "",
11 | "license": "Apache-2.0",
12 | "dependencies": {
13 | "axios": "^0.18.0",
14 | "ilp-plugin": "^3.3.1",
15 | "ilp-protocol-stream": "^1.8.1"
16 | },
17 | "devDependencies": {
18 | "eslint": "^4.16.0",
19 | "eslint-config-standard": "^11.0.0-beta.0",
20 | "eslint-plugin-import": "^2.8.0",
21 | "eslint-plugin-node": "^5.2.1",
22 | "eslint-plugin-promise": "^3.6.0",
23 | "eslint-plugin-standard": "^3.0.1"
24 | },
25 | "eslintIgnore": [
26 | "node_modules"
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/src/bucket.js:
--------------------------------------------------------------------------------
1 | const stream = require('stream')
2 | const debug = require('debug')('web-monetization-receiver:bucket')
3 | const EventEmitter = require('events')
4 | const DEFAULT_THROUGHPUT = 100000
5 | const DEFAULT_WINDOW = 5000
6 | const DEFAULT_FREE_BYTES = 0
7 | const DEFAULT_COST_PER_BYTE = 1 / 5000
8 |
9 | class Bucket {
10 | constructor (opts = {}) {
11 | // default bucket capacity is infinite
12 | this.capacity = opts.capacity || Infinity
13 | this.balance = 0
14 | this.events = new EventEmitter()
15 |
16 | // sliding window of payment events
17 | this.window = []
18 | this.lastPulse = 0
19 | this._pulse = 0
20 | }
21 |
22 | _recalculatePulse () {
23 | let total = 0
24 | const now = Date.now()
25 | for (let i = 0; i < this.window.length; ++i) {
26 | if (this.window[i].date + DEFAULT_WINDOW < now) {
27 | this.window.splice(i, 1)
28 | --i
29 | continue
30 | }
31 | total += this.window[i].amount
32 | }
33 | return total / (DEFAULT_THROUGHPUT * (DEFAULT_WINDOW / 1000))
34 | }
35 |
36 | fund (amount) {
37 | const n = Number(amount)
38 | if (isNaN(n)) {
39 | throw new Error('invalid amount. amount=' + amount)
40 | }
41 |
42 | const now = Date.now()
43 | this.window.push({ amount: n, date: now })
44 |
45 | this.lastPulse = this._pulse
46 | this._pulse = this._recalculatePulse()
47 | this.balance = Math.min(
48 | this.balance + n,
49 | this.capacity)
50 | this.events.emit('fund', this.balance)
51 | }
52 |
53 | get pulse () {
54 | return this._recalculatePulse()
55 | }
56 |
57 | spend (amount) {
58 | const n = Number(amount)
59 | if (isNaN(n)) {
60 | throw new Error('invalid amount. amount=' + amount)
61 | }
62 |
63 | if (n > this.balance) {
64 | return false
65 | } else {
66 | this.balance -= n
67 | return true
68 | }
69 | }
70 |
71 | awaitBalance (balance) {
72 | const b = Number(balance)
73 | if (isNaN(b)) {
74 | throw new Error('invalid balance. balance=' + balance)
75 | }
76 |
77 | return new Promise(resolve => {
78 | const onFund = newBalance => {
79 | if (newBalance >= balance) {
80 | setImmediate(() =>
81 | this.events.removeListener('fund', onFund))
82 | resolve()
83 | }
84 | }
85 |
86 | this.events.on('fund', onFund)
87 | })
88 | }
89 |
90 | async awaitAndSpend (amount) {
91 | while (true) {
92 | await this.awaitBalance(amount)
93 | if (this.spend(amount)) {
94 | return
95 | }
96 | }
97 | }
98 |
99 | monetizeStream (readStream, {
100 | freeBytes = DEFAULT_FREE_BYTES,
101 | costPerByte = DEFAULT_COST_PER_BYTE
102 | } = {}) {
103 | const bucket = this
104 | const transform = new stream.Transform({
105 | writableObjectMode: true,
106 | transform: function (chunk, encoding, cb) {
107 | if (readStream.bytesRead < freeBytes) {
108 | cb(null, chunk)
109 | return
110 | }
111 |
112 | const cost = Math.ceil(chunk.length * costPerByte)
113 | if (!bucket.spend(cost)) {
114 | readStream.pause()
115 |
116 | bucket.awaitBalance(cost)
117 | .then(() => {
118 | this.emit('money', cost)
119 | cb(null, chunk)
120 | readStream.resume()
121 | })
122 | .catch(e => {
123 | debug('failed to resume stream. error=' + e.stack)
124 | })
125 | } else {
126 | this.emit('money', cost)
127 | cb(null, chunk)
128 | }
129 | }
130 | })
131 |
132 | return readStream.pipe(transform)
133 | }
134 | }
135 |
136 | module.exports = Bucket
137 |
--------------------------------------------------------------------------------
/src/monetizer.js:
--------------------------------------------------------------------------------
1 | const IlpStream = require('ilp-protocol-stream')
2 | const makePlugin = require('ilp-plugin')
3 | const EventEmitter = require('events')
4 | const crypto = require('crypto')
5 | const Bucket = require('./bucket')
6 |
7 | const InitStates = {
8 | NOT_CONNECTED: 0,
9 | CONNECTING: 1,
10 | CONNECTED: 2
11 | }
12 |
13 | class Monetizer {
14 | constructor (opts = {}) {
15 | this.plugin = opts.plugin || makePlugin()
16 |
17 | this.buckets = new Map()
18 | this.bucketOpts = opts.buckets || {}
19 | this.bucketTimers = new Map()
20 | this.bucketTimeout = (opts.buckets && opts.buckets.timeout) ||
21 | 60 * 1000
22 |
23 | this.events = new EventEmitter()
24 | this.initState = InitStates.NOT_CONNECTED
25 | }
26 |
27 | async listen () {
28 | if (this.initState === InitStates.CONNECTED) {
29 | return
30 | } else if (this.initState === InitStates.CONNECTING) {
31 | return new Promise(resolve => {
32 | this.events.once('connected', resolve)
33 | })
34 | }
35 |
36 | this.initState = InitStates.CONNECTING
37 |
38 | this.server = new IlpStream.Server({
39 | plugin: this.plugin,
40 | serverSecret: crypto.randomBytes(32)
41 | })
42 |
43 | this.server.on('connection', connection => {
44 | const tag = connection.connectionTag
45 | connection.on('stream', stream => {
46 | stream.setReceiveMax('999999999999999')
47 | stream.on('money', amount => {
48 | if (tag) this.getBucket(tag).fund(amount)
49 | })
50 | })
51 | })
52 |
53 | await this.server.listen()
54 |
55 | this.initState = InitStates.CONNECTED
56 | this.events.emit('connected')
57 | }
58 |
59 | async generateSPSPResponse (tag) {
60 | await this.listen()
61 |
62 | if (tag && !this.buckets.has(tag)) {
63 | this.buckets.set(tag, new Bucket(this.bucketOpts))
64 | }
65 |
66 | const details = this.server.generateAddressAndSecret(tag)
67 | return {
68 | destination_account: details.destinationAccount,
69 | shared_secret: details.sharedSecret.toString('base64')
70 | }
71 | }
72 |
73 | removeBucket (tag) {
74 | this.buckets.delete(tag)
75 | this.bucketTimers.delete(tag)
76 | }
77 |
78 | touchBucket (tag) {
79 | if (!this.buckets.has(tag)) {
80 | this.buckets.set(tag, new Bucket(this.bucketOpts))
81 | }
82 |
83 | if (this.bucketTimers.has(tag)) {
84 | clearTimeout(this.bucketTimers.get(tag))
85 | }
86 |
87 | const timer = setTimeout(() => this.removeBucket(tag),
88 | this.bucketTimeout)
89 | this.bucketTimers.set(tag, timer)
90 | }
91 |
92 | getBucket (tag) {
93 | this.touchBucket(tag)
94 | return this.buckets.get(tag)
95 | }
96 |
97 | koa ({ spsp = true } = {}) {
98 | return async (ctx, next) => {
99 | if (!ctx.cookies.get('webMonetization')) {
100 | ctx.cookies.set('webMonetization', crypto.randomBytes(16).toString('hex'))
101 | }
102 |
103 | const tag = ctx.cookies.get('webMonetization')
104 | ctx.webMonetization = this.getBucket(tag)
105 |
106 | if (spsp && ctx.get('accept').includes('application/spsp4+json')) {
107 | ctx.body = await this.generateSPSPResponse(tag)
108 | ctx.set('Content-Type', 'application/spsp4+json')
109 | return
110 | }
111 |
112 | return next()
113 | }
114 | }
115 | }
116 |
117 | module.exports = Monetizer
118 |
--------------------------------------------------------------------------------
/src/payer.js:
--------------------------------------------------------------------------------
1 | const StreamWrapper = require('./stream-wrapper')
2 |
3 | class Payer {
4 | constructor ({ streamOpts = {} } = {}) {
5 | this.receivers = new Map()
6 | this.streamOpts = streamOpts
7 | this.closed = false
8 | }
9 |
10 | async createReceiver (pointer) {
11 | const receiver = new StreamWrapper({
12 | streamOpts: this.streamOpts,
13 | pointer
14 | })
15 |
16 | const ready = receiver.connect()
17 | .then(() => receiver)
18 | .catch((err) => {
19 | this.receivers.delete(pointer)
20 | throw err
21 | })
22 | this.receivers.set(pointer, ready)
23 | await ready
24 |
25 | receiver.getStream()
26 | .once('end', () => {
27 | this.receivers.delete(pointer)
28 | })
29 | .once('close', () => {
30 | this.receivers.delete(pointer)
31 | })
32 | .once('error', () => {
33 | this.receivers.delete(pointer)
34 | })
35 |
36 | return receiver
37 | }
38 |
39 | async getReceiver (pointer) {
40 | return this.receivers.get(pointer) || this.createReceiver(pointer)
41 | }
42 |
43 | async pay (pointer, amount) {
44 | if (this.closed) {
45 | throw new Error('paying is closing so payments are stopped')
46 | }
47 |
48 | const receiver = await this.getReceiver(pointer)
49 | const stream = receiver.getStream()
50 | stream.setSendMax(Number(stream.sendMax) + Number(amount))
51 | }
52 | }
53 |
54 | module.exports = Payer
55 |
--------------------------------------------------------------------------------
/src/stream-wrapper.js:
--------------------------------------------------------------------------------
1 | const IlpStream = require('ilp-protocol-stream')
2 | const makePlugin = require('ilp-plugin')
3 | const axios = require('axios')
4 | const EventEmitter = require('events')
5 |
6 | const StreamStates = {
7 | NOT_CONNECTED: 0,
8 | CONNECTING: 1,
9 | CONNECTED: 2
10 | }
11 |
12 | function pointerToUrl (pointer) {
13 | return pointer.startsWith('$')
14 | ? 'https://' + pointer.substring(1)
15 | : pointer
16 | }
17 |
18 | class StreamWrapper extends EventEmitter {
19 | constructor ({ pointer, streamOpts }) {
20 | super()
21 |
22 | this.pointer = pointer
23 | this.state = StreamStates.NOT_CONNECTED
24 | this.connection = null
25 | this.stream = null
26 | this.streamOpts = streamOpts
27 | }
28 |
29 | getConnection () {
30 | return this.connection
31 | }
32 |
33 | getStream () {
34 | return this.stream
35 | }
36 |
37 | isConnected () {
38 | return this.state === StreamStates.CONNECTED
39 | }
40 |
41 | async connect () {
42 | if (this.state === StreamStates.CONNECTED) {
43 | return
44 | }
45 |
46 | if (this.state === StreamStates.CONNECTING) {
47 | return new Promise(resolve => {
48 | this.once('connected', resolve)
49 | })
50 | }
51 |
52 | this.state = StreamStates.CONNECTING
53 |
54 | console.log('requesting pointer', this.pointer, pointerToUrl(this.pointer))
55 | const res = await axios({
56 | method: 'GET',
57 | url: pointerToUrl(this.pointer),
58 | headers: {
59 | accept: 'application/spsp4+json'
60 | }
61 | })
62 |
63 | this.connection = await IlpStream.createConnection({
64 | plugin: makePlugin(),
65 | destinationAccount: res.data.destination_account,
66 | sharedSecret: Buffer.from(res.data.shared_secret, 'base64'),
67 | ...this.streamOpts
68 | })
69 |
70 | this.connection
71 | .once('close', () => {
72 | this.state = StreamStates.NOT_CONNECTED
73 | })
74 | .once('error', (_err) => {
75 | this.state = StreamStates.NOT_CONNECTED
76 | })
77 |
78 | this.stream = this.connection.createStream()
79 | this.state = StreamStates.CONNECTED
80 | this.emit('connected')
81 | }
82 | }
83 |
84 | module.exports = StreamWrapper
85 |
--------------------------------------------------------------------------------