mirror of
https://github.com/actions/setup-python.git
synced 2024-12-29 02:41:15 +01:00
149 lines
5.8 KiB
Markdown
149 lines
5.8 KiB
Markdown
|
# pn
|
||
|
[![NPM][NPM1]][NPM2]
|
||
|
|
||
|
[![Build Status][1]][2]
|
||
|
|
||
|
The `pn` library gives you the Promise-using node standard library
|
||
|
you've always dreamed of. Think "Promised Node" when saying it.
|
||
|
|
||
|
Just about every node standard library method that takes a callback will now
|
||
|
return a `Promise` iff no callback is supplied. But existing code
|
||
|
that passes callbacks will still work fine --- and fast: No unnecessary
|
||
|
`Promise`s are created if you supply a callback.
|
||
|
|
||
|
The wrappers are generated automatically by a script, with a table to
|
||
|
handle exceptions and odd cases. See below for more details.
|
||
|
|
||
|
## Installation
|
||
|
```
|
||
|
npm install pn
|
||
|
```
|
||
|
## Usage
|
||
|
```
|
||
|
var fs = require('pn/fs');
|
||
|
fs.writeFile('foo', 'bar', 'utf-8').then(function() { console.log('done'); });
|
||
|
// But you can use callbacks, too -- existing code won't break.
|
||
|
fs.writeFile('foo', 'bat', 'utf-8', function(err) { console.log('yay'); });
|
||
|
```
|
||
|
|
||
|
This library uses node native promises (ie `global.Promise`) by
|
||
|
default, and thus works with node >= 0.11.
|
||
|
|
||
|
You can use [`core-js`](https://www.npmjs.org/package/core-js) or
|
||
|
[`es6-shim`](https://www.npmjs.org/package/es6-shim)
|
||
|
to add ES6 Promises to earlier versions of node, for example:
|
||
|
```
|
||
|
require('es6-shim');
|
||
|
var fs = require('pn/fs');
|
||
|
```
|
||
|
Just be sure that `es6-shim` is loaded before the `pn` package in that
|
||
|
case.
|
||
|
|
||
|
You might also want to look into packages like
|
||
|
[`prfun`](https://www.npmjs.org/package/prfun)
|
||
|
which add some helpers to make working with native promises much more
|
||
|
fun.
|
||
|
|
||
|
In particular, the `Promise#done` method is very useful when
|
||
|
debugging, at least until v8's native Promise debugging
|
||
|
capabilities are completed.
|
||
|
|
||
|
## Custom Promise types
|
||
|
|
||
|
You can also specify a custom `Promise` type to use, as follows:
|
||
|
```
|
||
|
var MyPromise = require('prfun'); // Use prfun's Promises, for example.
|
||
|
require('pn/_promise')(MyPromise); // This only needs to be done once.
|
||
|
```
|
||
|
|
||
|
## Exceptions and odd cases
|
||
|
|
||
|
The wrappers are automatically generated by `scripts/generate.js`;
|
||
|
there is a table in that file which specifies all the odd cases.
|
||
|
|
||
|
In general: if the node API has a callback which takes multiple
|
||
|
value arguments, the `Promise` returned will be an object with
|
||
|
named fields corresponding to the different values. If the node
|
||
|
API takes a callback *and* returns a value, `pn` will return
|
||
|
the original value with a nonenumerable field named `promise`
|
||
|
corresponding to the callback. Combining these two cases:
|
||
|
```
|
||
|
var child_process = require('pn/child_process');
|
||
|
var cp = child_process.execFile('true');
|
||
|
console.log('pid', cp.pid);
|
||
|
cp.promise.then(function(result) {
|
||
|
console.log('stdout: ', result.stdout);
|
||
|
console.log('stderr: ', result.stderr);
|
||
|
});
|
||
|
```
|
||
|
|
||
|
* `child_process`: The `exec` and `execFile` methods promise a object
|
||
|
with fields named `stdout` and `stderr`. They return a `ChildProcess`
|
||
|
object with a nonenumerable field named `promise` corresponding to the
|
||
|
callback.
|
||
|
* `crypto`: The `randomBytes` and `pseudoRandomBytes` methods are
|
||
|
now always asynchronous, returning a `Promise` if no callback
|
||
|
is supplied. Use the new `randomBytesSync` and `pseudoRandomBytesSync`
|
||
|
methods if you want synchronous computation. *This is backwards
|
||
|
incompatible with existing node code.*
|
||
|
* `dns`: The `lookupService` method promises an object with
|
||
|
fields named `hostname` and `service`.
|
||
|
* `fs`: The `exists` method doesn't pass an error to its callback.
|
||
|
The promisied version will never reject. The `write` method promises
|
||
|
an object with fields named `written` and `data`. The `read` method
|
||
|
promises an object with fields named `read` and `data`.
|
||
|
* `http`, `https`: The `request` and `get` methods return a `ClientRequest`
|
||
|
object with a nonenumerable field named `promise`, which will
|
||
|
resolve to an `IncomingMessage` object.
|
||
|
* `process`: You can defer computation to the next tick with
|
||
|
`require('pn/process').nextTick().then(function(){...})`
|
||
|
* `tls`: The `connect` and `createServer` return objects with a
|
||
|
nonenumerable field named `promise`.
|
||
|
|
||
|
There are a few object methods which are not promisified by this
|
||
|
package:
|
||
|
* `domain`: `Domain#bind`, `Domain#intercept`
|
||
|
* `http`,`https`: `ClientRequest#setTimeout`, `IncomingMessage#setTimeout`,
|
||
|
`Server#setTimeout`, `ServerResponse#setTimeout`, `Server#listen`,
|
||
|
`Server#close`
|
||
|
* `net`: `Server#listen`, `Server#close`, `Server#getConnections`,
|
||
|
`Socket#write`, `Socket#setTimeout`
|
||
|
* `readline`: `Interface#question`
|
||
|
* `stream`: `Writable#write`, `Writable#end`
|
||
|
* `dgram`: `Socket#send`, `Socket#bind`.
|
||
|
|
||
|
## Related packages
|
||
|
|
||
|
Here are some other packages with similar aims:
|
||
|
* [`promised-node`](https://www.npmjs.org/package/promised-node)
|
||
|
* [`then-fs`](https://www.npmjs.org/package/then-fs)
|
||
|
* [`final-fs`](https://www.npmjs.org/package/final-fs)
|
||
|
|
||
|
## License
|
||
|
|
||
|
Copyright (c) 2014-2018 C. Scott Ananian
|
||
|
|
||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
of this software and associated documentation files (the "Software"), to deal
|
||
|
in the Software without restriction, including without limitation the rights
|
||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
copies of the Software, and to permit persons to whom the Software is
|
||
|
furnished to do so, subject to the following conditions:
|
||
|
|
||
|
The above copyright notice and this permission notice shall be included in
|
||
|
all copies or substantial portions of the Software.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
THE SOFTWARE.
|
||
|
|
||
|
[NPM1]: https://nodei.co/npm/pn.png
|
||
|
[NPM2]: https://nodei.co/npm/pn/
|
||
|
|
||
|
[1]: https://travis-ci.org/cscott/node-pn.svg
|
||
|
[2]: https://travis-ci.org/cscott/node-pn
|