UNPKG

learnyounode

Version:

Learn You The Node.js For Much Win! An intro to Node.js via a set of self-guided workshops.

713 lines (643 loc) 304 kB
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>N-API | Node.js v12.10.0 Documentation</title> <link rel="stylesheet" href="data:text/css;base64,LyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnTGF0byBJdGFsaWMnKSwgbG9jYWwoJ0xhdG8tSXRhbGljJyksIHVybChodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tL3MvbGF0by92MTYvUzZ1OHc0Qk1VVFBIanhzQVVpLXFOaVhnN2VVMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzAyNTksIFUrMUUwMC0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KLyogbGF0aW4gKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdMYXRvIEl0YWxpYycpLCBsb2NhbCgnTGF0by1JdGFsaWMnKSwgdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9sYXRvL3YxNi9TNnU4dzRCTVVUUEhqeHNBWEMtcU5pWGc3US53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7Cn0KLyogbGF0aW4tZXh0ICovCkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnTGF0byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnTGF0byBSZWd1bGFyJyksIGxvY2FsKCdMYXRvLVJlZ3VsYXInKSwgdXJsKGh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20vcy9sYXRvL3YxNi9TNnV5dzRCTVVUUEhqeEF3WGlXdEZDZlE3QS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzAyNTksIFUrMUUwMC0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KLyogbGF0aW4gKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdMYXRvIFJlZ3VsYXInKSwgbG9jYWwoJ0xhdG8tUmVndWxhcicpLCB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjE2L1M2dXl3NEJNVVRQSGp4NHdYaVd0RkNjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJCQi0wMkJDLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjEyMiwgVSsyMTkxLCBVKzIxOTMsIFUrMjIxMiwgVSsyMjE1LCBVK0ZFRkYsIFUrRkZGRDsKfQovKiBsYXRpbi1leHQgKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdMYXRvIEJvbGQnKSwgbG9jYWwoJ0xhdG8tQm9sZCcpLCB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjE2L1M2dTl3NEJNVVRQSGg2VVZTd2FQR1EzcTVkME43dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzAyNTksIFUrMUUwMC0xRUZGLCBVKzIwMjAsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyMTEzLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KLyogbGF0aW4gKi8KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdMYXRvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdMYXRvIEJvbGQnKSwgbG9jYWwoJ0xhdG8tQm9sZCcpLCB1cmwoaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbS9zL2xhdG8vdjE2L1M2dTl3NEJNVVRQSGg2VVZTd2lQR1EzcTVkMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQkItMDJCQywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIxMjIsIFUrMjE5MSwgVSsyMTkzLCBVKzIyMTIsIFUrMjIxNSwgVStGRUZGLCBVK0ZGRkQ7Cn0K"> <link rel="stylesheet" href="data:text/css;base64,LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGF5b3V0IGFuZCBUeXBvZ3JhcGh5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpodG1sIHsKICBmb250LXNpemU6IDFyZW07CiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogIC13ZWJraXQtZm9udC12YXJpYW50LWxpZ2F0dXJlczogbm9uZTsKICAgICAgICAgIGZvbnQtdmFyaWFudC1saWdhdHVyZXM6IG5vbmU7Cn0KCiogewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmJvZHkgewogIGZvbnQtZmFtaWx5OiAiTGF0byIsICJMdWNpZGEgR3JhbmRlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCAiTHVjaWRhIFNhbnMiLCBWZXJkYW5hLCBUYWhvbWEsIHNhbnMtc2VyaWY7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7CiAgY29sb3I6ICMzMzM7CiAgYmFja2dyb3VuZDogI2ZmZjsKfQoKaDEgeyBmb250LXNpemU6IDIuNXJlbSB9CmgyIHsgZm9udC1zaXplOiAycmVtIH0KaDMgeyBmb250LXNpemU6IDEuNzVyZW0gfQpoNCB7IGZvbnQtc2l6ZTogMS41cmVtIH0KaDUgeyBmb250LXNpemU6IDEuMjVyZW0gfQpoNiB7IGZvbnQtc2l6ZTogMXJlbSB9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKICBtYXJnaW46IDEuNXJlbSAwIDFyZW07CiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICBmb250LXdlaWdodDogNzAwOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKcHJlLCB0dCwgY29kZSwgLnByZSwgc3Bhbi50eXBlLCBhLnR5cGUgewogIGZvbnQtZmFtaWx5OiBTRk1vbm8tUmVndWxhciwgTWVubG8sIENvbnNvbGFzLCAiTGliZXJhdGlvbiBNb25vIiwgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogLjllbTsKfQoKI2NvbnRlbnQgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKYSwgYTpsaW5rLCBhOmFjdGl2ZSB7CiAgY29sb3I6ICM0Mzg1M2Q7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGJvcmRlci1yYWRpdXM6IDJweDsKICBwYWRkaW5nOiAxcHggM3B4Owp9CgphOmhvdmVyLCBhOmZvY3VzIHsKICBjb2xvcjogI2ZmZjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDM4NTNkOwogIG91dGxpbmU6IG5vbmU7Cn0KCnN0cm9uZyB7CiAgZm9udC13ZWlnaHQ6IDcwMDsKfQoKY29kZSBhOmhvdmVyIHsKICBiYWNrZ3JvdW5kOiBub25lOwp9CgplbSBjb2RlIHsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCiNjaGFuZ2Vsb2cgI2d0b2MgewogIGRpc3BsYXk6IG5vbmU7Cn0KCiNndG9jIHsKICBtYXJnaW4tdG9wOiAuNXJlbTsKICBtYXJnaW4tYm90dG9tOiAxcmVtOwp9CgojZ3RvYyB1bCB7CiAgbGlzdC1zdHlsZTogbm9uZTsKICBtYXJnaW4tbGVmdDogMDsKICBsaW5lLWhlaWdodDogMS41cmVtOwp9CgojZ3RvYyA+IHVsID4gbGkgewogIGRpc3BsYXk6IGlubGluZTsKICBib3JkZXItcmlnaHQ6IDFweCAjMDAwIHNvbGlkOwogIG1hcmdpbi1yaWdodDogMC40cmVtOwogIHBhZGRpbmctcmlnaHQ6IDAuNHJlbTsKfQoKI2d0b2MgPiB1bCA+IGxpOmxhc3QtY2hpbGQgewogIGJvcmRlci1yaWdodDogbm9uZTsKICBtYXJnaW4tcmlnaHQ6IDA7CiAgcGFkZGluZy1yaWdodDogMDsKfQoKbGkudmVyc2lvbi1waWNrZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKbGkudmVyc2lvbi1waWNrZXI6aG92ZXIgPiBhIHsKICBib3JkZXItcmFkaXVzOiAycHggMnB4IDAgMDsKfQoKbGkudmVyc2lvbi1waWNrZXI6aG92ZXIgPiBvbCB7CiAgZGlzcGxheTogYmxvY2s7CiAgei1pbmRleDogMTsKfQoKbGkudmVyc2lvbi1waWNrZXIgYSBzcGFuIHsKICBmb250LXNpemU6IC43cmVtOwp9CgpvbC52ZXJzaW9uLXBpY2tlciB7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBib3JkZXI6IDFweCAjNDM4NTNkIHNvbGlkOwogIGJvcmRlci1yYWRpdXM6IDAgMCAycHggMnB4OwogIGRpc3BsYXk6IG5vbmU7CiAgbGlzdC1zdHlsZTogbm9uZTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdG9wOiAxLjI1cmVtOwogIHdpZHRoOiAxMDAlOwp9CgojZ3RvYyBvbC52ZXJzaW9uLXBpY2tlciBsaSB7CiAgZGlzcGxheTogYmxvY2s7CiAgYm9yZGVyLXJpZ2h0OiAwOwogIG1hcmdpbi1yaWdodDogMDsKfQoKb2wudmVyc2lvbi1waWNrZXIgbGkgYSB7CiAgYm9yZGVyLXJhZGl1czogMDsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogLjFyZW07CiAgcGFkZGluZy1sZWZ0OiAxcmVtOwp9CgpvbC52ZXJzaW9uLXBpY2tlciBsaTpsYXN0LWNoaWxkIGEgewogIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxcHg7CiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMXB4Owp9CgoubGluZSB7CiAgd2lkdGg6IGNhbGMoMTAwJSAtIDFyZW0pOwogIGRpc3BsYXk6IGJsb2NrOwogIHBhZGRpbmctYm90dG9tOiAxcHg7Cn0KCi5hcGlfc3RhYmlsaXR5IHsKICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICBtYXJnaW46IDAgMCAxcmVtIDA7CiAgZm9udC1mYW1pbHk6ICJMYXRvIiwgIkx1Y2lkYSBHcmFuZGUiLCAiTHVjaWRhIFNhbnMgVW5pY29kZSIsICJMdWNpZGEgU2FucyIsIFZlcmRhbmEsIFRhaG9tYSwgc2Fucy1zZXJpZjsKICBwYWRkaW5nOiAxcmVtOwogIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi5hcGlfc3RhYmlsaXR5ICogewogIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Owp9CgouYXBpX3N0YWJpbGl0eSBhIHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLmFwaV9zdGFiaWxpdHkgYTpob3ZlciwgLmFwaV9zdGFiaWxpdHkgYTphY3RpdmUsIC5hcGlfc3RhYmlsaXR5IGE6Zm9jdXMgewogIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgLjQpOwp9CgouYXBpX3N0YWJpbGl0eSBhIGNvZGUgewogIGJhY2tncm91bmQ6IG5vbmU7Cn0KCi5hcGlfc3RhYmlsaXR5XzAgewogIGJhY2tncm91bmQtY29sb3I6ICNENjAwMjc7Cn0KCi5hcGlfc3RhYmlsaXR5XzEgewogIGJhY2tncm91bmQtY29sb3I6ICNFQzUzMTU7Cn0KCi5hcGlfc3RhYmlsaXR5XzIgewogIGJhY2tncm91bmQtY29sb3I6ICM0RUJBMEY7Cn0KCi5hcGlfbWV0YWRhdGEgewogIGZvbnQtc2l6ZTogLjg1cmVtOwogIG1hcmdpbi1ib3R0b206IDFyZW07Cn0KCi5hcGlfbWV0YWRhdGEgc3BhbiB7CiAgbWFyZ2luLXJpZ2h0OiAxcmVtOwp9CgouYXBpX21ldGFkYXRhIHNwYW46bGFzdC1jaGlsZCB7CiAgbWFyZ2luLXJpZ2h0OiAwcHg7Cn0KCnVsLnBsYWluIHsKICBsaXN0LXN0eWxlOiBub25lOwp9CgphYmJyIHsKICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICM0NTQ1NDU7Cn0KCnAgewogIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgbWFyZ2luOiAwIDAgMS4xMjVyZW0gMDsKICBsaW5lLWhlaWdodDogMS41Owp9CgojYXBpY29udGVudCA+ICo6bGFzdC1jaGlsZCB7CiAgbWFyZ2luLWJvdHRvbTogMDsKICBwYWRkaW5nLWJvdHRvbTogMnJlbTsKfQoKdGFibGUgewogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgbWFyZ2luOiAwIDAgMS41cmVtIDA7Cn0KCnRoLCB0ZCB7CiAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKICBwYWRkaW5nOiAuNzVyZW0gMXJlbSAuNzVyZW0gMXJlbTsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Cgp0aCB7CiAgdGV4dC1hbGlnbjpsZWZ0Owp9CgpvbCwgdWwsIGRsIHsKICBtYXJnaW46IDAgMCAuNnJlbSAwOwogIHBhZGRpbmc6IDA7Cn0KCm9sIHVsLCBvbCBvbCwgb2wgZGwsIHVsIHVsLCB1bCBvbCwgdWwgZGwsIGRsIHVsLCBkbCBvbCwgZGwgZGwgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KCnVsLCBvbCB7CiAgbWFyZ2luLWxlZnQ6IDJyZW07Cn0KCmRsIGR0IHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWFyZ2luOiAxLjVyZW0gMCAwOwp9CgpkbCBkZCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG1hcmdpbjogMCAxcmVtIDA7Cn0KCmRkICsgZHQucHJlIHsKICBtYXJnaW4tdG9wOiAxLjZyZW07Cn0KCiNhcGljb250ZW50IHsKICBwYWRkaW5nLXRvcDogMXJlbTsKfQoKI2FwaWNvbnRlbnQgLmxpbmUgewogIHdpZHRoOiBjYWxjKDUwJSAtIDFyZW0pOwogIG1hcmdpbjogMXJlbSAxcmVtIC45NXJlbTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9CgpoMiArIGgyIHsKICBtYXJnaW46IDAgMCAuNXJlbTsKfQoKaDMgKyBoMyB7CiAgbWFyZ2luOiAwIDAgLjVyZW07Cn0KCmgyLCBoMywgaDQsIGg1IHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcGFkZGluZy1yaWdodDogNDBweDsKfQoKLnNyY2xpbmsgewogIGZsb2F0OiByaWdodDsKICBmb250LXNpemU6IHNtYWxsZXI7Cn0KCmgxIHNwYW4sIGgyIHNwYW4sIGgzIHNwYW4sIGg0IHNwYW4gewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBkaXNwbGF5OiBibG9jazsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7Cn0KCmgxIHNwYW46aG92ZXIsIGgyIHNwYW46aG92ZXIsIGgzIHNwYW46aG92ZXIsIGg0IHNwYW46aG92ZXIgewogIG9wYWNpdHk6IDE7Cn0KCmgxIHNwYW4gYSwgaDIgc3BhbiBhLCBoMyBzcGFuIGEsIGg0IHNwYW4gYSB7CiAgY29sb3I6ICMwMDA7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgpwcmUsIHR0LCBjb2RlIHsKICBsaW5lLWhlaWdodDogMS41cmVtOwogIG1hcmdpbjogMDsgcGFkZGluZzogMDsKfQoKLnByZSB7CiAgbGluZS1oZWlnaHQ6IDEuNXJlbTsKfQoKcHJlIHsKICBwYWRkaW5nOiAxcmVtOwogIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgYmFja2dyb3VuZDogI2YyZjJmMjsKICBtYXJnaW46IDFyZW07CiAgb3ZlcmZsb3cteDogYXV0bzsKfQoKcHJlID4gY29kZSB7CiAgcGFkZGluZzogMDsKfQoKcHJlICsgaDMgewogIG1hcmdpbi10b3A6IDIuMjI1cmVtOwp9Cgpjb2RlLnByZSB7CiAgd2hpdGUtc3BhY2U6IHByZTsKfQoKI2ludHJvIHsKICBtYXJnaW4tdG9wOiAxLjI1cmVtOwogIG1hcmdpbi1sZWZ0OiAxcmVtOwp9CgojaW50cm8gYSB7CiAgY29sb3I6ICNkZGQ7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCmhyIHsKICBiYWNrZ3JvdW5kOiBub25lOwogIGJvcmRlcjogbWVkaXVtIG5vbmU7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3YTdhN2E7CiAgbWFyZ2luOiAwIDAgMXJlbSAwOwp9CgojdG9jIGgyIHsKICBtYXJnaW4tdG9wOiAwOwogIG1hcmdpbjogMS41cmVtIDA7Cn0KCiN0b2MgcCB7CiAgbWFyZ2luOiAwOwp9CgojdG9jIHVsIGEgewogIHRleHQtZGVjb3JhdGlvbjpub25lOwp9CgojdG9jIHVsIGxpIHsKICBtYXJnaW4tYm90dG9tOiAuNjY2cmVtOwogIGxpc3Qtc3R5bGU6IHNxdWFyZSBvdXRzaWRlOwp9CgojdG9jIGxpID4gdWwgewogIG1hcmdpbi10b3A6IC42NjZyZW07Cn0KCiN0b2MgLnN0YWJpbGl0eV8wOjphZnRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q1MDAyNzsKICBjb2xvcjogI2ZmZjsKICBjb250ZW50OiAiZGVwcmVjYXRlZCI7CiAgbWFyZ2luLWxlZnQ6IC4yNXJlbTsKICBwYWRkaW5nOiAxcHggM3B4OwogIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKI2FwaWNvbnRlbnQgbGkgewogIG1hcmdpbi1ib3R0b206IC41cmVtOwp9CgojYXBpY29udGVudCBsaTpsYXN0LWNoaWxkIHsKICBtYXJnaW4tYm90dG9tOiAwOwp9Cgp0dCwgY29kZSB7CiAgY29sb3I6ICMwNDA0MDQ7CiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgcGFkZGluZzogMXB4IDNweDsKfQoKLmFwaV9zdGFiaWxpdHkgY29kZSB7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMSk7Cn0KCmEgY29kZSB7CiAgY29sb3I6IGluaGVyaXQ7CiAgYmFja2dyb3VuZDogaW5oZXJpdDsKICBwYWRkaW5nOiAwOwp9CgoudHlwZSB7CiAgbGluZS1oZWlnaHQ6IDEuNXJlbTsKfQoKI2NvbHVtbjEuaW50ZXJpb3IgewogIG1hcmdpbi1sZWZ0OiAyMzRweDsKICBwYWRkaW5nOiAwIDJyZW07CiAgLXdlYmtpdC1wYWRkaW5nLXN0YXJ0OiAxLjVyZW07Cn0KCiNjb2x1bW4yLmludGVyaW9yIHsKICB3aWR0aDogMjM0cHg7CiAgYmFja2dyb3VuZDogIzMzMzsKICBwb3NpdGlvbjogZml4ZWQ7CiAgbGVmdDogMDsKICB0b3A6IDA7CiAgYm90dG9tOiAwOwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBzY3JvbGw7Cn0KCiNjb2x1bW4yIHVsIHsKICBsaXN0LXN0eWxlOiBub25lOwogIG1hcmdpbjogLjlyZW0gMCAuNXJlbTsKICBiYWNrZ3JvdW5kOiAjMzMzOwp9CgojY29sdW1uMiA+IDpmaXJzdC1jaGlsZCB7CiAgbWFyZ2luOiAxLjI1cmVtOwogIGZvbnQtc2l6ZTogMS41cmVtOwp9CgojY29sdW1uMiA+IHVsOm50aC1jaGlsZCgyKSB7CiAgbWFyZ2luOiAxLjI1cmVtIDAgLjVyZW07Cn0KCiNjb2x1bW4yID4gdWw6bGFzdC1jaGlsZCB7CiAgbWFyZ2luOiAuOXJlbSAwIDEuMjVyZW07Cn0KCiNjb2x1bW4yIHVsIGxpIHsKICBwYWRkaW5nLWxlZnQ6IDEuMjVyZW07CiAgbWFyZ2luLWJvdHRvbTogLjVyZW07CiAgcGFkZGluZy1ib3R0b206IC41cmVtOwp9CgojY29sdW1uMiAubGluZSB7CiAgbWFyZ2luOiAwIC41cmVtOwogIGJhY2tncm91bmQtY29sb3I6ICM3MDcwNzA7Cn0KCiNjb2x1bW4yIHVsIGxpOmxhc3QtY2hpbGQgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KCiNjb2x1bW4yIHVsIGxpIGEgewogIGNvbG9yOiAjY2NjOwogIGJvcmRlci1yYWRpdXM6IDA7Cn0KCiNjb2x1bW4yIHVsIGxpIGEuYWN0aXZlLCAjY29sdW1uMiB1bCBsaSBhLmFjdGl2ZTpob3ZlciwKI2NvbHVtbjIgdWwgbGkgYS5hY3RpdmU6Zm9jdXMgewogIGNvbG9yOiAjNDM4NTNkOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM0Mzg1M2Q7CiAgYmFja2dyb3VuZDogbm9uZTsKfQoKI2ludHJvIGE6aG92ZXIsICNpbnRybyBhOmZvY3VzLAojY29sdW1uMiB1bCBsaSBhOmhvdmVyLCAjY29sdW1uMiB1bCBsaSBhOmZvY3VzIHsKICBjb2xvcjogI2ZmZjsKICBiYWNrZ3JvdW5kOiBub25lOwp9CgpzcGFuID4gLm1hcmssIHNwYW4gPiAubWFyazp2aXNpdGVkIHsKICBjb2xvcjogIzcwNzA3MDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwcHg7CiAgcmlnaHQ6IDBweDsKfQoKc3BhbiA+IC5tYXJrOmhvdmVyLCBzcGFuID4gLm1hcms6Zm9jdXMsIHNwYW4gPiAubWFyazphY3RpdmUgewogIGNvbG9yOiAjNDM4NTNkOwogIGJhY2tncm91bmQ6IG5vbmU7Cn0KCnRoID4gKjpsYXN0LWNoaWxkLCB0ZCA+ICo6bGFzdC1jaGlsZCB7CiAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLmNoYW5nZWxvZyA+IHN1bW1hcnkgewogIG1hcmdpbjogLjVyZW0gMDsKICBwYWRkaW5nOiAuNXJlbSAwOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKLyogc2ltcGxlciBjbGVhcmZpeCAqLwouY2xlYXJmaXg6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKICBkaXNwbGF5OiBibG9jazsKICBoZWlnaHQ6IDA7CiAgY2xlYXI6IGJvdGg7CiAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgouZ2l0aHViX2ljb24gewogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgbWFyZ2luOiAtMnB4IDNweCAwIDA7Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSB7CiAgI2NvbnRlbnQgewogICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgfQogICNjb2x1bW4xLmludGVyaW9yIHsKICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgcGFkZGluZy1sZWZ0OiAuNXJlbTsKICAgIHBhZGRpbmctcmlnaHQ6IC41cmVtOwogICAgd2lkdGg6IGF1dG87CiAgICBvdmVyZmxvdy15OiB2aXNpYmxlOwogIH0KICAjY29sdW1uMiB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQoKQG1lZGlhIHByaW50IHsKICBodG1sIHsKICAgIGhlaWdodDogYXV0bzsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogIH0KICAjY29sdW1uMi5pbnRlcmlvciB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KICAjY29sdW1uMS5pbnRlcmlvciB7CiAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgcGFkZGluZzogMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICB9CiAgLmFwaV9tZXRhZGF0YSwKICAjdG9jLAogIC5zcmNsaW5rLAogICNndG9jLAogIC5tYXJrIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogIGgxIHsKICAgIGZvbnQtc2l6ZTogMnJlbTsKICB9CiAgaDIgewogICAgZm9udC1zaXplOiAxLjc1cmVtOwogIH0KICBoMyB7CiAgICBmb250LXNpemU6IDEuNXJlbTsKICB9CiAgaDQgewogICAgZm9udC1zaXplOiAxLjNyZW07CiAgfQogIGg1IHsKICAgIGZvbnQtc2l6ZTogMS4ycmVtOwogIH0KICBoNiB7CiAgICBmb250LXNpemU6IDEuMXJlbTsKICB9CiAgLmFwaV9zdGFiaWxpdHkgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIH0KICAuYXBpX3N0YWJpbGl0eSBhIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB9CiAgYSB7CiAgICBjb2xvcjogaW5oZXJpdDsKICB9CiAgI2FwaWNvbnRlbnQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICB9Cn0K"> <link rel="stylesheet" href="data:text/css;base64,LnNoX3NvdXJjZUNvZGUgewogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgouc2hfc291cmNlQ29kZSAuc2hfc3ltYm9sLAouc2hfc291cmNlQ29kZSAuc2hfY2JyYWNrZXQgewogIGNvbG9yOiAjMzMzOwp9Cgouc2hfc291cmNlQ29kZSAuc2hfa2V5d29yZCB7CiAgY29sb3I6ICMzMzg7Cn0KCi5zaF9zb3VyY2VDb2RlIC5zaF9zdHJpbmcsCi5zaF9zb3VyY2VDb2RlIC5zaF9yZWdleHAsCi5zaF9zb3VyY2VDb2RlIC5zaF9udW1iZXIsCi5zaF9zb3VyY2VDb2RlIC5zaF9zcGVjaWFsY2hhciB7CiAgY29sb3I6ICNFNTQzMDU7Cn0KCi5zaF9zb3VyY2VDb2RlIC5zaF9jb21tZW50IHsKICBjb2xvcjogIzY2NjsKICBmb250LXdlaWdodDogbGlnaHRlcjsKfQo="> <link rel="canonical" href="https://nodejs.org/api/n-api.html"> </head> <body class="alt apidoc" id="api-section-n-api"> <div id="content" class="clearfix"> <div id="column2" class="interior"> <div id="intro" class="interior"> <a href="https://nodejs.org/" title="Go back to the home page"> Node.js </a> </div> <ul> <li><a href="https://nodejs.org/api/documentation.html" class="nav-documentation">About these Docs</a></li> <li><a href="https://nodejs.org/api/synopsis.html" class="nav-synopsis">Usage &amp; Example</a></li> </ul> <div class="line"></div> <ul> <li><a href="https://nodejs.org/api/assert.html" class="nav-assert">Assertion Testing</a></li> <li><a href="https://nodejs.org/api/async_hooks.html" class="nav-async_hooks">Async Hooks</a></li> <li><a href="https://nodejs.org/api/buffer.html" class="nav-buffer">Buffer</a></li> <li><a href="https://nodejs.org/api/addons.html" class="nav-addons">C++ Addons</a></li> <li><a href="https://nodejs.org/api/n-api.html" class="nav-n-api active">C/C++ Addons - N-API</a></li> <li><a href="https://nodejs.org/api/child_process.html" class="nav-child_process">Child Processes</a></li> <li><a href="https://nodejs.org/api/cluster.html" class="nav-cluster">Cluster</a></li> <li><a href="https://nodejs.org/api/cli.html" class="nav-cli">Command Line Options</a></li> <li><a href="https://nodejs.org/api/console.html" class="nav-console">Console</a></li> <li><a href="https://nodejs.org/api/crypto.html" class="nav-crypto">Crypto</a></li> <li><a href="https://nodejs.org/api/debugger.html" class="nav-debugger">Debugger</a></li> <li><a href="https://nodejs.org/api/deprecations.html" class="nav-deprecations">Deprecated APIs</a></li> <li><a href="https://nodejs.org/api/dns.html" class="nav-dns">DNS</a></li> <li><a href="https://nodejs.org/api/domain.html" class="nav-domain">Domain</a></li> <li><a href="https://nodejs.org/api/esm.html" class="nav-esm">ECMAScript Modules</a></li> <li><a href="https://nodejs.org/api/errors.html" class="nav-errors">Errors</a></li> <li><a href="https://nodejs.org/api/events.html" class="nav-events">Events</a></li> <li><a href="https://nodejs.org/api/fs.html" class="nav-fs">File System</a></li> <li><a href="https://nodejs.org/api/globals.html" class="nav-globals">Globals</a></li> <li><a href="https://nodejs.org/api/http.html" class="nav-http">HTTP</a></li> <li><a href="https://nodejs.org/api/http2.html" class="nav-http2">HTTP/2</a></li> <li><a href="https://nodejs.org/api/https.html" class="nav-https">HTTPS</a></li> <li><a href="https://nodejs.org/api/inspector.html" class="nav-inspector">Inspector</a></li> <li><a href="https://nodejs.org/api/intl.html" class="nav-intl">Internationalization</a></li> <li><a href="https://nodejs.org/api/modules.html" class="nav-modules">Modules</a></li> <li><a href="https://nodejs.org/api/net.html" class="nav-net">Net</a></li> <li><a href="https://nodejs.org/api/os.html" class="nav-os">OS</a></li> <li><a href="https://nodejs.org/api/path.html" class="nav-path">Path</a></li> <li><a href="https://nodejs.org/api/perf_hooks.html" class="nav-perf_hooks">Performance Hooks</a></li> <li><a href="https://nodejs.org/api/policy.html" class="nav-policy">Policies</a></li> <li><a href="https://nodejs.org/api/process.html" class="nav-process">Process</a></li> <li><a href="https://nodejs.org/api/punycode.html" class="nav-punycode">Punycode</a></li> <li><a href="https://nodejs.org/api/querystring.html" class="nav-querystring">Query Strings</a></li> <li><a href="https://nodejs.org/api/readline.html" class="nav-readline">Readline</a></li> <li><a href="https://nodejs.org/api/repl.html" class="nav-repl">REPL</a></li> <li><a href="https://nodejs.org/api/report.html" class="nav-report">Report</a></li> <li><a href="https://nodejs.org/api/stream.html" class="nav-stream">Stream</a></li> <li><a href="https://nodejs.org/api/string_decoder.html" class="nav-string_decoder">String Decoder</a></li> <li><a href="https://nodejs.org/api/timers.html" class="nav-timers">Timers</a></li> <li><a href="https://nodejs.org/api/tls.html" class="nav-tls">TLS/SSL</a></li> <li><a href="https://nodejs.org/api/tracing.html" class="nav-tracing">Trace Events</a></li> <li><a href="https://nodejs.org/api/tty.html" class="nav-tty">TTY</a></li> <li><a href="https://nodejs.org/api/dgram.html" class="nav-dgram">UDP/Datagram</a></li> <li><a href="https://nodejs.org/api/url.html" class="nav-url">URL</a></li> <li><a href="https://nodejs.org/api/util.html" class="nav-util">Utilities</a></li> <li><a href="https://nodejs.org/api/v8.html" class="nav-v8">V8</a></li> <li><a href="https://nodejs.org/api/vm.html" class="nav-vm">VM</a></li> <li><a href="https://nodejs.org/api/worker_threads.html" class="nav-worker_threads">Worker Threads</a></li> <li><a href="https://nodejs.org/api/zlib.html" class="nav-zlib">Zlib</a></li> </ul> <div class="line"></div> <ul> <li><a href="https://github.com/nodejs/node" class="nav-https-github-com-nodejs-node">GitHub Repo &amp; Issue Tracker</a></li> </ul> </div> <div id="column1" data-id="n-api" class="interior"> <header> <h1>Node.js v12.10.0 Documentation</h1> <div id="gtoc"> <ul> <li> <a href="https://nodejs.org/api/index.html" name="toc">Index</a> </li> <li> <a href="https://nodejs.org/api/all.html">View on single page</a> </li> <li> <a href="https://nodejs.org/api/n-api.json">View as JSON</a> </li> <li class="version-picker"> <a href="#">View another version <span>▼</span></a> <ol class="version-picker"><li><a href="https://nodejs.org/docs/latest-v12.x/api/n-api.html">12.x</a></li> <li><a href="https://nodejs.org/docs/latest-v11.x/api/n-api.html">11.x</a></li> <li><a href="https://nodejs.org/docs/latest-v10.x/api/n-api.html">10.x <b>LTS</b></a></li> <li><a href="https://nodejs.org/docs/latest-v9.x/api/n-api.html">9.x</a></li> <li><a href="https://nodejs.org/docs/latest-v8.x/api/n-api.html">8.x <b>LTS</b></a></li></ol> </li> <li class="edit_on_github"><a href="https://github.com/nodejs/node/edit/master/doc/api/n-api.md"><span class="github_icon"><svg height="16" width="16" viewBox="0 0 16.1 16.1" fill="currentColor"><path d="M8 0a8 8 0 0 0-2.5 15.6c.4 0 .5-.2.5-.4v-1.5c-2 .4-2.5-.5-2.7-1 0-.1-.5-.9-.8-1-.3-.2-.7-.6 0-.6.6 0 1 .6 1.2.8.7 1.2 1.9 1 2.4.7 0-.5.2-.9.5-1-1.8-.3-3.7-1-3.7-4 0-.9.3-1.6.8-2.2 0-.2-.3-1 .1-2 0 0 .7-.3 2.2.7a7.4 7.4 0 0 1 4 0c1.5-1 2.2-.8 2.2-.8.5 1.1.2 2 .1 2.1.5.6.8 1.3.8 2.2 0 3-1.9 3.7-3.6 4 .3.2.5.7.5 1.4v2.2c0 .2.1.5.5.4A8 8 0 0 0 16 8a8 8 0 0 0-8-8z"></path></svg></span>Edit on GitHub</a></li> </ul> </div> <hr> </header> <div id="toc"> <h2>Table of Contents</h2> <ul> <li> <p><span class="stability_2"><a href="#n_api_n_api">N-API</a></span></p> <ul> <li><a href="#n_api_implications_of_abi_stability">Implications of ABI Stability</a></li> <li><a href="#n_api_usage">Usage</a></li> <li><a href="#n_api_n_api_version_matrix">N-API Version Matrix</a></li> <li> <p><a href="#n_api_environment_life_cycle_apis">Environment Life Cycle APIs</a></p> <ul> <li><a href="#n_api_napi_set_instance_data">napi_set_instance_data</a></li> <li><a href="#n_api_napi_get_instance_data">napi_get_instance_data</a></li> </ul> </li> <li> <p><a href="#n_api_basic_n_api_data_types">Basic N-API Data Types</a></p> <ul> <li><a href="#n_api_napi_status">napi_status</a></li> <li><a href="#n_api_napi_extended_error_info">napi_extended_error_info</a></li> <li><a href="#n_api_napi_env">napi_env</a></li> <li><a href="#n_api_napi_value">napi_value</a></li> <li><a href="#n_api_napi_threadsafe_function">napi_threadsafe_function</a></li> <li><a href="#n_api_napi_threadsafe_function_release_mode">napi_threadsafe_function_release_mode</a></li> <li><a href="#n_api_napi_threadsafe_function_call_mode">napi_threadsafe_function_call_mode</a></li> <li> <p><a href="#n_api_n_api_memory_management_types">N-API Memory Management types</a></p> <ul> <li><a href="#n_api_napi_handle_scope">napi_handle_scope</a></li> <li><a href="#n_api_napi_escapable_handle_scope">napi_escapable_handle_scope</a></li> <li><a href="#n_api_napi_ref">napi_ref</a></li> </ul> </li> <li> <p><a href="#n_api_n_api_callback_types">N-API Callback types</a></p> <ul> <li><a href="#n_api_napi_callback_info">napi_callback_info</a></li> <li><a href="#n_api_napi_callback">napi_callback</a></li> <li><a href="#n_api_napi_finalize">napi_finalize</a></li> <li><a href="#n_api_napi_async_execute_callback">napi_async_execute_callback</a></li> <li><a href="#n_api_napi_async_complete_callback">napi_async_complete_callback</a></li> <li><a href="#n_api_napi_threadsafe_function_call_js">napi_threadsafe_function_call_js</a></li> </ul> </li> </ul> </li> <li> <p><a href="#n_api_error_handling">Error Handling</a></p> <ul> <li> <p><a href="#n_api_return_values">Return values</a></p> <ul> <li><a href="#n_api_napi_get_last_error_info">napi_get_last_error_info</a></li> </ul> </li> <li> <p><a href="#n_api_exceptions">Exceptions</a></p> <ul> <li><a href="#n_api_napi_throw">napi_throw</a></li> <li><a href="#n_api_napi_throw_error">napi_throw_error</a></li> <li><a href="#n_api_napi_throw_type_error">napi_throw_type_error</a></li> <li><a href="#n_api_napi_throw_range_error">napi_throw_range_error</a></li> <li><a href="#n_api_napi_is_error">napi_is_error</a></li> <li><a href="#n_api_napi_create_error">napi_create_error</a></li> <li><a href="#n_api_napi_create_type_error">napi_create_type_error</a></li> <li><a href="#n_api_napi_create_range_error">napi_create_range_error</a></li> <li><a href="#n_api_napi_get_and_clear_last_exception">napi_get_and_clear_last_exception</a></li> <li><a href="#n_api_napi_is_exception_pending">napi_is_exception_pending</a></li> <li><a href="#n_api_napi_fatal_exception">napi_fatal_exception</a></li> </ul> </li> <li> <p><a href="#n_api_fatal_errors">Fatal Errors</a></p> <ul> <li><a href="#n_api_napi_fatal_error">napi_fatal_error</a></li> </ul> </li> </ul> </li> <li> <p><a href="#n_api_object_lifetime_management">Object Lifetime management</a></p> <ul> <li> <p><a href="#n_api_making_handle_lifespan_shorter_than_that_of_the_native_method">Making handle lifespan shorter than that of the native method</a></p> <ul> <li><a href="#n_api_napi_open_handle_scope">napi_open_handle_scope</a></li> <li><a href="#n_api_napi_close_handle_scope">napi_close_handle_scope</a></li> <li><a href="#n_api_napi_open_escapable_handle_scope">napi_open_escapable_handle_scope</a></li> <li><a href="#n_api_napi_close_escapable_handle_scope">napi_close_escapable_handle_scope</a></li> <li><a href="#n_api_napi_escape_handle">napi_escape_handle</a></li> </ul> </li> <li> <p><a href="#n_api_references_to_objects_with_a_lifespan_longer_than_that_of_the_native_method">References to objects with a lifespan longer than that of the native method</a></p> <ul> <li><a href="#n_api_napi_create_reference">napi_create_reference</a></li> <li><a href="#n_api_napi_delete_reference">napi_delete_reference</a></li> <li><a href="#n_api_napi_reference_ref">napi_reference_ref</a></li> <li><a href="#n_api_napi_reference_unref">napi_reference_unref</a></li> <li><a href="#n_api_napi_get_reference_value">napi_get_reference_value</a></li> </ul> </li> <li> <p><a href="#n_api_cleanup_on_exit_of_the_current_node_js_instance">Cleanup on exit of the current Node.js instance</a></p> <ul> <li><a href="#n_api_napi_add_env_cleanup_hook">napi_add_env_cleanup_hook</a></li> <li><a href="#n_api_napi_remove_env_cleanup_hook">napi_remove_env_cleanup_hook</a></li> </ul> </li> </ul> </li> <li><a href="#n_api_module_registration">Module registration</a></li> <li> <p><a href="#n_api_working_with_javascript_values">Working with JavaScript Values</a></p> <ul> <li> <p><a href="#n_api_enum_types">Enum types</a></p> <ul> <li><a href="#n_api_napi_valuetype">napi_valuetype</a></li> <li><a href="#n_api_napi_typedarray_type">napi_typedarray_type</a></li> </ul> </li> <li> <p><a href="#n_api_object_creation_functions">Object Creation Functions</a></p> <ul> <li><a href="#n_api_napi_create_array">napi_create_array</a></li> <li><a href="#n_api_napi_create_array_with_length">napi_create_array_with_length</a></li> <li><a href="#n_api_napi_create_arraybuffer">napi_create_arraybuffer</a></li> <li><a href="#n_api_napi_create_buffer">napi_create_buffer</a></li> <li><a href="#n_api_napi_create_buffer_copy">napi_create_buffer_copy</a></li> <li><span class="stability_1"><a href="#n_api_napi_create_date">napi_create_date</a></span></li> <li><a href="#n_api_napi_create_external">napi_create_external</a></li> <li><a href="#n_api_napi_create_external_arraybuffer">napi_create_external_arraybuffer</a></li> <li><a href="#n_api_napi_create_external_buffer">napi_create_external_buffer</a></li> <li><a href="#n_api_napi_create_object">napi_create_object</a></li> <li><a href="#n_api_napi_create_symbol">napi_create_symbol</a></li> <li><a href="#n_api_napi_create_typedarray">napi_create_typedarray</a></li> <li><a href="#n_api_napi_create_dataview">napi_create_dataview</a></li> </ul> </li> <li> <p><a href="#n_api_functions_to_convert_from_c_types_to_n_api">Functions to convert from C types to N-API</a></p> <ul> <li><a href="#n_api_napi_create_int32">napi_create_int32</a></li> <li><a href="#n_api_napi_create_uint32">napi_create_uint32</a></li> <li><a href="#n_api_napi_create_int64">napi_create_int64</a></li> <li><a href="#n_api_napi_create_double">napi_create_double</a></li> <li><span class="stability_1"><a href="#n_api_napi_create_bigint_int64">napi_create_bigint_int64</a></span></li> <li><span class="stability_1"><a href="#n_api_napi_create_bigint_uint64">napi_create_bigint_uint64</a></span></li> <li><span class="stability_1"><a href="#n_api_napi_create_bigint_words">napi_create_bigint_words</a></span></li> <li><a href="#n_api_napi_create_string_latin1">napi_create_string_latin1</a></li> <li><a href="#n_api_napi_create_string_utf16">napi_create_string_utf16</a></li> <li><a href="#n_api_napi_create_string_utf8">napi_create_string_utf8</a></li> </ul> </li> <li> <p><a href="#n_api_functions_to_convert_from_n_api_to_c_types">Functions to convert from N-API to C types</a></p> <ul> <li><a href="#n_api_napi_get_array_length">napi_get_array_length</a></li> <li><a href="#n_api_napi_get_arraybuffer_info">napi_get_arraybuffer_info</a></li> <li><a href="#n_api_napi_get_buffer_info">napi_get_buffer_info</a></li> <li><a href="#n_api_napi_get_prototype">napi_get_prototype</a></li> <li><a href="#n_api_napi_get_typedarray_info">napi_get_typedarray_info</a></li> <li><a href="#n_api_napi_get_dataview_info">napi_get_dataview_info</a></li> <li><span class="stability_1"><a href="#n_api_napi_get_date_value">napi_get_date_value</a></span></li> <li><a href="#n_api_napi_get_value_bool">napi_get_value_bool</a></li> <li><a href="#n_api_napi_get_value_double">napi_get_value_double</a></li> <li><span class="stability_1"><a href="#n_api_napi_get_value_bigint_int64">napi_get_value_bigint_int64</a></span></li> <li><span class="stability_1"><a href="#n_api_napi_get_value_bigint_uint64">napi_get_value_bigint_uint64</a></span></li> <li><span class="stability_1"><a href="#n_api_napi_get_value_bigint_words">napi_get_value_bigint_words</a></span></li> <li><a href="#n_api_napi_get_value_external">napi_get_value_external</a></li> <li><a href="#n_api_napi_get_value_int32">napi_get_value_int32</a></li> <li><a href="#n_api_napi_get_value_int64">napi_get_value_int64</a></li> <li><a href="#n_api_napi_get_value_string_latin1">napi_get_value_string_latin1</a></li> <li><a href="#n_api_napi_get_value_string_utf8">napi_get_value_string_utf8</a></li> <li><a href="#n_api_napi_get_value_string_utf16">napi_get_value_string_utf16</a></li> <li><a href="#n_api_napi_get_value_uint32">napi_get_value_uint32</a></li> </ul> </li> <li> <p><a href="#n_api_functions_to_get_global_instances">Functions to get global instances</a></p> <ul> <li><a href="#n_api_napi_get_boolean">napi_get_boolean</a></li> <li><a href="#n_api_napi_get_global">napi_get_global</a></li> <li><a href="#n_api_napi_get_null">napi_get_null</a></li> <li><a href="#n_api_napi_get_undefined">napi_get_undefined</a></li> </ul> </li> </ul> </li> <li> <p><a href="#n_api_working_with_javascript_values_abstract_operations">Working with JavaScript Values - Abstract Operations</a></p> <ul> <li><a href="#n_api_napi_coerce_to_bool">napi_coerce_to_bool</a></li> <li><a href="#n_api_napi_coerce_to_number">napi_coerce_to_number</a></li> <li><a href="#n_api_napi_coerce_to_object">napi_coerce_to_object</a></li> <li><a href="#n_api_napi_coerce_to_string">napi_coerce_to_string</a></li> <li><a href="#n_api_napi_typeof">napi_typeof</a></li> <li><a href="#n_api_napi_instanceof">napi_instanceof</a></li> <li><a href="#n_api_napi_is_array">napi_is_array</a></li> <li><a href="#n_api_napi_is_arraybuffer">napi_is_arraybuffer</a></li> <li><a href="#n_api_napi_is_buffer">napi_is_buffer</a></li> <li><span class="stability_1"><a href="#n_api_napi_is_date">napi_is_date</a></span></li> <li><a href="#n_api_napi_is_error_1">napi_is_error</a></li> <li><a href="#n_api_napi_is_typedarray">napi_is_typedarray</a></li> <li><a href="#n_api_napi_is_dataview">napi_is_dataview</a></li> <li><a href="#n_api_napi_strict_equals">napi_strict_equals</a></li> </ul> </li> <li> <p><a href="#n_api_working_with_javascript_properties">Working with JavaScript Properties</a></p> <ul> <li> <p><a href="#n_api_structures">Structures</a></p> <ul> <li><a href="#n_api_napi_property_attributes">napi_property_attributes</a></li> <li><a href="#n_api_napi_property_descriptor">napi_property_descriptor</a></li> </ul> </li> <li> <p><a href="#n_api_functions">Functions</a></p> <ul> <li><a href="#n_api_napi_get_property_names">napi_get_property_names</a></li> <li><a href="#n_api_napi_set_property">napi_set_property</a></li> <li><a href="#n_api_napi_get_property">napi_get_property</a></li> <li><a href="#n_api_napi_has_property">napi_has_property</a></li> <li><a href="#n_api_napi_delete_property">napi_delete_property</a></li> <li><a href="#n_api_napi_has_own_property">napi_has_own_property</a></li> <li><a href="#n_api_napi_set_named_property">napi_set_named_property</a></li> <li><a href="#n_api_napi_get_named_property">napi_get_named_property</a></li> <li><a href="#n_api_napi_has_named_property">napi_has_named_property</a></li> <li><a href="#n_api_napi_set_element">napi_set_element</a></li> <li><a href="#n_api_napi_get_element">napi_get_element</a></li> <li><a href="#n_api_napi_has_element">napi_has_element</a></li> <li><a href="#n_api_napi_delete_element">napi_delete_element</a></li> <li><a href="#n_api_napi_define_properties">napi_define_properties</a></li> </ul> </li> </ul> </li> <li> <p><a href="#n_api_working_with_javascript_functions">Working with JavaScript Functions</a></p> <ul> <li><a href="#n_api_napi_call_function">napi_call_function</a></li> <li><a href="#n_api_napi_create_function">napi_create_function</a></li> <li><a href="#n_api_napi_get_cb_info">napi_get_cb_info</a></li> <li><a href="#n_api_napi_get_new_target">napi_get_new_target</a></li> <li><a href="#n_api_napi_new_instance">napi_new_instance</a></li> </ul> </li> <li> <p><a href="#n_api_object_wrap">Object Wrap</a></p> <ul> <li><a href="#n_api_napi_define_class">napi_define_class</a></li> <li><a href="#n_api_napi_wrap">napi_wrap</a></li> <li><a href="#n_api_napi_unwrap">napi_unwrap</a></li> <li><a href="#n_api_napi_remove_wrap">napi_remove_wrap</a></li> <li><a href="#n_api_napi_add_finalizer">napi_add_finalizer</a></li> </ul> </li> <li> <p><a href="#n_api_simple_asynchronous_operations">Simple Asynchronous Operations</a></p> <ul> <li><a href="#n_api_napi_create_async_work">napi_create_async_work</a></li> <li><a href="#n_api_napi_delete_async_work">napi_delete_async_work</a></li> <li><a href="#n_api_napi_queue_async_work">napi_queue_async_work</a></li> <li><a href="#n_api_napi_cancel_async_work">napi_cancel_async_work</a></li> </ul> </li> <li> <p><a href="#n_api_custom_asynchronous_operations">Custom Asynchronous Operations</a></p> <ul> <li><a href="#n_api_napi_async_init">napi_async_init</a></li> <li><a href="#n_api_napi_async_destroy">napi_async_destroy</a></li> <li><a href="#n_api_napi_make_callback">napi_make_callback</a></li> <li><a href="#n_api_napi_open_callback_scope">napi_open_callback_scope</a></li> <li><a href="#n_api_napi_close_callback_scope">napi_close_callback_scope</a></li> </ul> </li> <li> <p><a href="#n_api_version_management">Version Management</a></p> <ul> <li><a href="#n_api_napi_get_node_version">napi_get_node_version</a></li> <li><a href="#n_api_napi_get_version">napi_get_version</a></li> </ul> </li> <li> <p><a href="#n_api_memory_management">Memory Management</a></p> <ul> <li><a href="#n_api_napi_adjust_external_memory">napi_adjust_external_memory</a></li> </ul> </li> <li> <p><a href="#n_api_promises">Promises</a></p> <ul> <li><a href="#n_api_napi_create_promise">napi_create_promise</a></li> <li><a href="#n_api_napi_resolve_deferred">napi_resolve_deferred</a></li> <li><a href="#n_api_napi_reject_deferred">napi_reject_deferred</a></li> <li><a href="#n_api_napi_is_promise">napi_is_promise</a></li> </ul> </li> <li> <p><a href="#n_api_script_execution">Script execution</a></p> <ul> <li><a href="#n_api_napi_run_script">napi_run_script</a></li> </ul> </li> <li> <p><a href="#n_api_libuv_event_loop">libuv event loop</a></p> <ul> <li><a href="#n_api_napi_get_uv_event_loop">napi_get_uv_event_loop</a></li> </ul> </li> <li> <p><a href="#n_api_asynchronous_thread_safe_function_calls">Asynchronous Thread-safe Function Calls</a></p> <ul> <li><a href="#n_api_napi_create_threadsafe_function">napi_create_threadsafe_function</a></li> <li><a href="#n_api_napi_get_threadsafe_function_context">napi_get_threadsafe_function_context</a></li> <li><a href="#n_api_napi_call_threadsafe_function">napi_call_threadsafe_function</a></li> <li><a href="#n_api_napi_acquire_threadsafe_function">napi_acquire_threadsafe_function</a></li> <li><a href="#n_api_napi_release_threadsafe_function">napi_release_threadsafe_function</a></li> <li><a href="#n_api_napi_ref_threadsafe_function">napi_ref_threadsafe_function</a></li> <li><a href="#n_api_napi_unref_threadsafe_function">napi_unref_threadsafe_function</a></li> </ul> </li> </ul> </li> </ul> </div> <div id="apicontent"> <h1>N-API<span><a class="mark" href="#n_api_n_api" id="n_api_n_api">#</a></span></h1> <p></p><div class="api_stability api_stability_2"><a href="https://nodejs.org/api/documentation.html#documentation_stability_index">Stability: 2</a> - Stable</div><p></p> <p>N-API (pronounced N as in the letter, followed by API) is an API for building native Addons. It is independent from the underlying JavaScript runtime (for example, V8) and is maintained as part of Node.js itself. This API will be Application Binary Interface (ABI) stable across versions of Node.js. It is intended to insulate Addons from changes in the underlying JavaScript engine and allow modules compiled for one major version to run on later major versions of Node.js without recompilation. The <a href="https://nodejs.org/en/docs/guides/abi-stability/">ABI Stability</a> guide provides a more in-depth explanation.</p> <p>Addons are built/packaged with the same approach/tools outlined in the section titled <a href="https://nodejs.org/api/addons.html">C++ Addons</a>. The only difference is the set of APIs that are used by the native code. Instead of using the V8 or <a href="https://github.com/nodejs/nan">Native Abstractions for Node.js</a> APIs, the functions available in the N-API are used.</p> <p>APIs exposed by N-API are generally used to create and manipulate JavaScript values. Concepts and operations generally map to ideas specified in the ECMA-262 Language Specification. The APIs have the following properties:</p> <ul> <li>All N-API calls return a status code of type <code>napi_status</code>. This status indicates whether the API call succeeded or failed.</li> <li>The API's return value is passed via an out parameter.</li> <li>All JavaScript values are abstracted behind an opaque type named <code>napi_value</code>.</li> <li>In case of an error status code, additional information can be obtained using <code>napi_get_last_error_info</code>. More information can be found in the error handling section <a href="#n_api_error_handling">Error Handling</a>.</li> </ul> <p>The N-API is a C API that ensures ABI stability across Node.js versions and different compiler levels. A C++ API can be easier to use. To support using C++, the project maintains a C++ wrapper module called <a href="https://github.com/nodejs/node-addon-api">node-addon-api</a>. This wrapper provides an inlineable C++ API. Binaries built with <code>node-addon-api</code> will depend on the symbols for the N-API C-based functions exported by Node.js. <code>node-addon-api</code> is a more efficient way to write code that calls N-API. Take, for example, the following <code>node-addon-api</code> code. The first section shows the <code>node-addon-api</code> code and the second section shows what actually gets used in the addon.</p> <pre><code class="language-C++">Object obj = Object::New(env); obj["foo"] = String::New(env, "bar"); </code></pre> <pre><code class="language-C++">napi_status status; napi_value object, string; status = napi_create_object(env, &amp;object); if (status != napi_ok) { napi_throw_error(env, ...); return; } status = napi_create_string_utf8(env, "bar", NAPI_AUTO_LENGTH, &amp;string); if (status != napi_ok) { napi_throw_error(env, ...); return; } status = napi_set_named_property(env, object, "foo", string); if (status != napi_ok) { napi_throw_error(env, ...); return; } </code></pre> <p>The end result is that the addon only uses the exported C APIs. As a result, it still gets the benefits of the ABI stability provided by the C API.</p> <p>When using <code>node-addon-api</code> instead of the C APIs, start with the API <a href="https://github.com/nodejs/node-addon-api#api-documentation">docs</a> for <code>node-addon-api</code>.</p> <h2>Implications of ABI Stability<span><a class="mark" href="#n_api_implications_of_abi_stability" id="n_api_implications_of_abi_stability">#</a></span></h2> <p>Although N-API provides an ABI stability guarantee, other parts of Node.js do not, and any external libraries used from the addon may not. In particular, none of the following APIs provide an ABI stability guarantee across major versions:</p> <ul> <li> <p>the Node.js C++ APIs available via any of</p> <pre><code class="language-C++">#include &lt;node.h&gt; #include &lt;node_buffer.h&gt; #include &lt;node_version.h&gt; #include &lt;node_object_wrap.h&gt; </code></pre> </li> <li> <p>the libuv APIs which are also included with Node.js and available via</p> <pre><code class="language-C++">#include &lt;uv.h&gt; </code></pre> </li> <li> <p>the V8 API available via</p> <pre><code class="language-C++">#include &lt;v8.h&gt; </code></pre> </li> </ul> <p>Thus, for an addon to remain ABI-compatible across Node.js major versions, it must make use exclusively of N-API by restricting itself to using</p> <pre><code class="language-C">#include &lt;node_api.h&gt; </code></pre> <p>and by checking, for all external libraries that it uses, that the external library makes ABI stability guarantees similar to N-API.</p> <h2>Usage<span><a class="mark" href="#n_api_usage" id="n_api_usage">#</a></span></h2> <p>In order to use the N-API functions, include the file <a href="https://github.com/nodejs/node/blob/master/src/node_api.h"><code>node_api.h</code></a> which is located in the src directory in the node development tree:</p> <pre><code class="language-C">#include &lt;node_api.h&gt; </code></pre> <p>This will opt into the default <code>NAPI_VERSION</code> for the given release of Node.js. In order to ensure compatibility with specific versions of N-API, the version can be specified explicitly when including the header:</p> <pre><code class="language-C">#define NAPI_VERSION 3 #include &lt;node_api.h&gt; </code></pre> <p>This restricts the N-API surface to just the functionality that was available in the specified (and earlier) versions.</p> <p>Some of the N-API surface is considered experimental and requires explicit opt-in to access those APIs:</p> <pre><code class="language-C">#define NAPI_EXPERIMENTAL #include &lt;node_api.h&gt; </code></pre> <p>In this case the entire API surface, including any experimental APIs, will be available to the module code.</p> <h2>N-API Version Matrix<span><a class="mark" href="#n_api_n_api_version_matrix" id="n_api_n_api_version_matrix">#</a></span></h2> <p>N-API versions are additive and versioned independently from Node.js. Version 4 is an extension to version 3 in that it has all of the APIs from version 3 with some additions. This means that it is not necessary to recompile for new versions of Node.js which are listed as supporting a later version.</p> <table><thead><tr><th align="center"></th><th align="center">1</th><th align="center">2</th><th align="center">3</th><th align="center">4</th></tr></thead><tbody><tr><td align="center">v6.x</td><td align="center"></td><td align="center"></td><td align="center">v6.14.2*</td><td align="center"></td></tr><tr><td align="center">v8.x</td><td align="center">v8.0.0*</td><td align="center">v8.10.0*</td><td align="center">v8.11.2</td><td align="center">v8.16.0</td></tr><tr><td align="center">v9.x</td><td align="center">v9.0.0*</td><td align="center">v9.3.0*</td><td align="center">v9.11.0*</td><td align="center"></td></tr><tr><td align="center">v10.x</td><td align="center"></td><td align="center"></td><td align="center">v10.0.0</td><td align="center"></td></tr><tr><td align="center">v11.x</td><td align="center"></td><td align="center"></td><td align="center">v11.0.0</td><td align="center">v11.8.0</td></tr><tr><td align="center">v12.x</td><td align="center"></td><td align="center"></td><td align="center"></td><td align="center">v12.0.0</td></tr></tbody></table> <p>* Indicates that the N-API version was released as experimental</p> <p>The N-APIs associated strictly with accessing ECMAScript features from native code can be found separately in <code>js_native_api.h</code> and <code>js_native_api_types.h</code>. The APIs defined in these headers are included in <code>node_api.h</code> and <code>node_api_types.h</code>. The headers are structured in this way in order to allow implementations of N-API outside of Node.js. For those implementations the Node.js specific APIs may not be applicable.</p> <p>The Node.js-specific parts of an addon can be separated from the code that exposes the actual functionality to the JavaScript environment so that the latter may be used with multiple implementations of N-API. In the example below, <code>addon.c</code> and <code>addon.h</code> refer only to <code>js_native_api.h</code>. This ensures that <code>addon.c</code> can be reused to compile against either the Node.js implementation of N-API or any implementation of N-API outside of Node.js.</p> <p><code>addon_node.c</code> is a separate file that contains the Node.js specific entry point to the addon and which instantiates the addon by calling into <code>addon.c</code> when the addon is loaded into a Node.js environment.</p> <pre><code class="language-C">// addon.h #ifndef _ADDON_H_ #define _ADDON_H_ #include &lt;js_native_api.h&gt; napi_value create_addon(napi_env env); #endif // _ADDON_H_ </code></pre> <pre><code class="language-C">// addon.c #include "addon.h" #define NAPI_CALL(env, call) \ do { \ napi_status status = (call); \ if (status != napi_ok) { \ const napi_extended_error_info* error_info = NULL; \ napi_get_last_error_info((env), &amp;error_info); \ bool is_pending; \ napi_is_exception_pending((env), &amp;is_pending); \ if (!is_pending) { \ const char* message = (error_info-&gt;error_message == NULL) \ ? "empty error message" \ : error_info-&gt;error_message; \ napi_throw_error((env), NULL, message); \ return NULL; \ } \ } \ } while(0) static napi_value DoSomethingUseful(napi_env env, napi_callback_info info) { // Do something useful. return NULL; } napi_value create_addon(napi_env env) { napi_value result; NAPI_CALL(env, napi_create_object(env, &amp;result)); napi_value exported_function; NAPI_CALL(env, napi_create_function(env, "doSomethingUseful", NAPI_AUTO_LENGTH, DoSomethingUseful, NULL, &amp;exported_function)); NAPI_CALL(env, napi_set_named_property(env, result, "doSomethingUseful", exported_function)); return result; } </code></pre> <pre><code class="language-C">// addon_node.c #include &lt;node_api.h&gt; #include "addon.h" NAPI_MODULE_INIT() { // This function body is expected to return a `napi_value`. // The variables `napi_env env` and `napi_value exports` may be used within // the body, as they are provided by the definition of `NAPI_MODULE_INIT()`. return create_addon(env); } </code></pre> <h2>Environment Life Cycle APIs<span><a class="mark" href="#n_api_environment_life_cycle_apis" id="n_api_environment_life_cycle_apis">#</a></span></h2> <p></p><div class="api_stability api_stability_1"><a href="https://nodejs.org/api/documentation.html#documentation_stability_index">Stability: 1</a> - Experimental</div><p></p> <p><a href="https://tc39.es/ecma262/#sec-agents">Section 8.7</a> of the <a href="https://tc39.github.io/ecma262/">ECMAScript Language Specification</a> defines the concept of an "Agent" as a self-contained environment in which JavaScript code runs. Multiple such Agents may be started and terminated either concurrently or in sequence by the process.</p> <p>