From e269ac60efd845db7f096558013f86098aaf2543 Mon Sep 17 00:00:00 2001 From: Boaz Sender Date: Sat, 29 Mar 2025 15:23:19 -0700 Subject: [PATCH] add listener program --- index.js | 11 + listener-software.md | 18 + node_modules/.package-lock.json | 52 + node_modules/adafruit-i2c-lcd/LICENSE | 27 + node_modules/adafruit-i2c-lcd/README.md | 169 + .../adafruit-i2c-lcd-2.0.0.tgz | Bin 0 -> 6891 bytes node_modules/adafruit-i2c-lcd/example/demo.js | 80 + node_modules/adafruit-i2c-lcd/lib/.gitkeep | 0 .../adafruit-i2c-lcd/lib/I2CBusWireAdapter.js | 42 + .../adafruit-i2c-lcd/lib/adafruit_i2c_lcd.js | 300 ++ node_modules/adafruit-i2c-lcd/lib/index.js | 5 + node_modules/adafruit-i2c-lcd/package.json | 30 + node_modules/bindings/LICENSE.md | 22 + node_modules/bindings/README.md | 98 + node_modules/bindings/bindings.js | 221 ++ node_modules/bindings/package.json | 28 + node_modules/file-uri-to-path/.npmignore | 1 + node_modules/file-uri-to-path/.travis.yml | 30 + node_modules/file-uri-to-path/History.md | 21 + node_modules/file-uri-to-path/LICENSE | 20 + node_modules/file-uri-to-path/README.md | 74 + node_modules/file-uri-to-path/index.d.ts | 2 + node_modules/file-uri-to-path/index.js | 66 + node_modules/file-uri-to-path/package.json | 32 + node_modules/file-uri-to-path/test/test.js | 24 + node_modules/file-uri-to-path/test/tests.json | 13 + node_modules/i2c-bus/History.md | 308 ++ node_modules/i2c-bus/LICENSE | 20 + node_modules/i2c-bus/README.md | 796 +++++ node_modules/i2c-bus/binding.gyp | 24 + node_modules/i2c-bus/build/Makefile | 354 ++ .../build/Release/.deps/Release/i2c.node.d | 1 + .../.deps/Release/obj.target/i2c.node.d | 1 + .../.deps/Release/obj.target/i2c/src/i2c.o.d | 221 ++ node_modules/i2c-bus/build/Release/i2c.node | Bin 0 -> 113888 bytes .../i2c-bus/build/Release/obj.target/i2c.node | Bin 0 -> 113888 bytes .../build/Release/obj.target/i2c/src/i2c.o | Bin 0 -> 184904 bytes node_modules/i2c-bus/build/binding.Makefile | 6 + node_modules/i2c-bus/build/config.gypi | 466 +++ node_modules/i2c-bus/build/i2c.target.mk | 162 + .../doc/edison-adruino-base-board-i2c.md | 20 + node_modules/i2c-bus/doc/raspberry-pi-i2c.md | 80 + .../i2c-bus/doc/raspberry-pi-software-i2c.md | 31 + .../i2c-bus/example/ds1621-async-callback.js | 87 + node_modules/i2c-bus/example/ds1621-bb.png | Bin 0 -> 227449 bytes node_modules/i2c-bus/example/ds1621-pi.png | Bin 0 -> 287814 bytes node_modules/i2c-bus/example/ds1621-sync.js | 45 + .../i2c-bus/example/i2c-list-busses.js | 16 + .../i2c-bus/example/i2cdetect-quick.js | 48 + node_modules/i2c-bus/example/i2cdetect.js | 40 + node_modules/i2c-bus/example/i2cfuncs.js | 37 + .../i2c-bus/example/mcp9808-async-callback.js | 36 + node_modules/i2c-bus/example/mcp9808-pi.png | Bin 0 -> 111555 bytes .../mcp9808-promise-plain-i2c-buffer.js | 25 + .../i2c-bus/example/mcp9808-promise.js | 22 + node_modules/i2c-bus/example/mcp9808-sync.js | 21 + node_modules/i2c-bus/example/two-devices.js | 40 + node_modules/i2c-bus/i2c-bus.js | 821 +++++ .../async-brute-force-leak-check.js | 33 + .../integration-test/async-performance.js | 30 + .../async-promise-performance.js | 31 + .../i2c-bus/integration-test/async-promise.js | 138 + .../i2c-bus/integration-test/async.js | 138 + .../i2c-bus/integration-test/busses.js | 45 + .../i2c-bus/integration-test/deviceid.js | 17 + .../i2c-bus/integration-test/errors.js | 338 ++ .../i2c-functionality-available.js | 11 + .../i2c-bus/integration-test/run-tests | 14 + .../integration-test/scan-leak-check.js | 27 + node_modules/i2c-bus/integration-test/scan.js | 82 + .../sync-brute-force-leak-check.js | 21 + .../i2c-bus/integration-test/sync-deviceid.js | 26 + .../integration-test/sync-many-instances.js | 51 + .../integration-test/sync-performance.js | 24 + .../sync-plain-i2c-performance.js | 28 + node_modules/i2c-bus/integration-test/sync.js | 103 + node_modules/i2c-bus/package.json | 55 + node_modules/i2c-bus/src/deviceid.cc | 72 + node_modules/i2c-bus/src/deviceid.h | 6 + node_modules/i2c-bus/src/i2c-dev.h | 364 ++ node_modules/i2c-bus/src/i2c.cc | 113 + node_modules/i2c-bus/src/i2cfuncs.cc | 70 + node_modules/i2c-bus/src/i2cfuncs.h | 6 + node_modules/i2c-bus/src/readblock.cc | 117 + node_modules/i2c-bus/src/readblock.h | 6 + node_modules/i2c-bus/src/readbyte.cc | 72 + node_modules/i2c-bus/src/readbyte.h | 6 + node_modules/i2c-bus/src/readi2cblock.cc | 134 + node_modules/i2c-bus/src/readi2cblock.h | 6 + node_modules/i2c-bus/src/readword.cc | 72 + node_modules/i2c-bus/src/readword.h | 6 + node_modules/i2c-bus/src/receivebyte.cc | 69 + node_modules/i2c-bus/src/receivebyte.h | 6 + node_modules/i2c-bus/src/sendbyte.cc | 68 + node_modules/i2c-bus/src/sendbyte.h | 6 + node_modules/i2c-bus/src/setaddr.cc | 69 + node_modules/i2c-bus/src/setaddr.h | 6 + node_modules/i2c-bus/src/util.h | 67 + node_modules/i2c-bus/src/writeblock.cc | 133 + node_modules/i2c-bus/src/writeblock.h | 6 + node_modules/i2c-bus/src/writebyte.cc | 72 + node_modules/i2c-bus/src/writebyte.h | 6 + node_modules/i2c-bus/src/writei2cblock.cc | 131 + node_modules/i2c-bus/src/writei2cblock.h | 6 + node_modules/i2c-bus/src/writequick.cc | 68 + node_modules/i2c-bus/src/writequick.h | 6 + node_modules/i2c-bus/src/writeword.cc | 73 + node_modules/i2c-bus/src/writeword.h | 6 + node_modules/nan/.github/workflows/ci.yml | 52 + node_modules/nan/CHANGELOG.md | 577 ++++ node_modules/nan/CMakeLists.txt | 138 + node_modules/nan/LICENSE.md | 9 + node_modules/nan/README.md | 455 +++ node_modules/nan/doc/asyncworker.md | 146 + node_modules/nan/doc/buffers.md | 54 + node_modules/nan/doc/callback.md | 76 + node_modules/nan/doc/converters.md | 41 + node_modules/nan/doc/errors.md | 226 ++ node_modules/nan/doc/json.md | 62 + node_modules/nan/doc/maybe_types.md | 583 ++++ node_modules/nan/doc/methods.md | 672 ++++ node_modules/nan/doc/new.md | 147 + node_modules/nan/doc/node_misc.md | 123 + node_modules/nan/doc/object_wrappers.md | 263 ++ node_modules/nan/doc/persistent.md | 296 ++ node_modules/nan/doc/scopes.md | 73 + node_modules/nan/doc/script.md | 58 + node_modules/nan/doc/string_bytes.md | 62 + node_modules/nan/doc/v8_internals.md | 199 ++ node_modules/nan/doc/v8_misc.md | 85 + node_modules/nan/include_dirs.js | 1 + node_modules/nan/nan.h | 3049 +++++++++++++++++ node_modules/nan/nan_callbacks.h | 128 + node_modules/nan/nan_callbacks_12_inl.h | 676 ++++ node_modules/nan/nan_callbacks_pre_12_inl.h | 520 +++ node_modules/nan/nan_converters.h | 72 + node_modules/nan/nan_converters_43_inl.h | 68 + node_modules/nan/nan_converters_pre_43_inl.h | 42 + .../nan/nan_define_own_property_helper.h | 29 + node_modules/nan/nan_implementation_12_inl.h | 430 +++ .../nan/nan_implementation_pre_12_inl.h | 263 ++ node_modules/nan/nan_json.h | 166 + node_modules/nan/nan_maybe_43_inl.h | 356 ++ node_modules/nan/nan_maybe_pre_43_inl.h | 268 ++ node_modules/nan/nan_new.h | 340 ++ node_modules/nan/nan_object_wrap.h | 156 + node_modules/nan/nan_persistent_12_inl.h | 132 + node_modules/nan/nan_persistent_pre_12_inl.h | 242 ++ node_modules/nan/nan_private.h | 73 + node_modules/nan/nan_scriptorigin.h | 95 + node_modules/nan/nan_string_bytes.h | 305 ++ node_modules/nan/nan_typedarray_contents.h | 96 + node_modules/nan/nan_weak.h | 437 +++ node_modules/nan/package.json | 38 + node_modules/nan/tools/1to2.js | 412 +++ node_modules/nan/tools/README.md | 14 + node_modules/nan/tools/package.json | 19 + package-lock.json | 60 + package.json | 18 + 159 files changed, 21076 insertions(+) create mode 100644 index.js create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/adafruit-i2c-lcd/LICENSE create mode 100644 node_modules/adafruit-i2c-lcd/README.md create mode 100644 node_modules/adafruit-i2c-lcd/adafruit-i2c-lcd-2.0.0.tgz create mode 100644 node_modules/adafruit-i2c-lcd/example/demo.js create mode 100644 node_modules/adafruit-i2c-lcd/lib/.gitkeep create mode 100644 node_modules/adafruit-i2c-lcd/lib/I2CBusWireAdapter.js create mode 100644 node_modules/adafruit-i2c-lcd/lib/adafruit_i2c_lcd.js create mode 100644 node_modules/adafruit-i2c-lcd/lib/index.js create mode 100644 node_modules/adafruit-i2c-lcd/package.json create mode 100644 node_modules/bindings/LICENSE.md create mode 100644 node_modules/bindings/README.md create mode 100644 node_modules/bindings/bindings.js create mode 100644 node_modules/bindings/package.json create mode 100644 node_modules/file-uri-to-path/.npmignore create mode 100644 node_modules/file-uri-to-path/.travis.yml create mode 100644 node_modules/file-uri-to-path/History.md create mode 100644 node_modules/file-uri-to-path/LICENSE create mode 100644 node_modules/file-uri-to-path/README.md create mode 100644 node_modules/file-uri-to-path/index.d.ts create mode 100644 node_modules/file-uri-to-path/index.js create mode 100644 node_modules/file-uri-to-path/package.json create mode 100644 node_modules/file-uri-to-path/test/test.js create mode 100644 node_modules/file-uri-to-path/test/tests.json create mode 100644 node_modules/i2c-bus/History.md create mode 100644 node_modules/i2c-bus/LICENSE create mode 100644 node_modules/i2c-bus/README.md create mode 100644 node_modules/i2c-bus/binding.gyp create mode 100644 node_modules/i2c-bus/build/Makefile create mode 100644 node_modules/i2c-bus/build/Release/.deps/Release/i2c.node.d create mode 100644 node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c.node.d create mode 100644 node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c/src/i2c.o.d create mode 100755 node_modules/i2c-bus/build/Release/i2c.node create mode 100755 node_modules/i2c-bus/build/Release/obj.target/i2c.node create mode 100644 node_modules/i2c-bus/build/Release/obj.target/i2c/src/i2c.o create mode 100644 node_modules/i2c-bus/build/binding.Makefile create mode 100644 node_modules/i2c-bus/build/config.gypi create mode 100644 node_modules/i2c-bus/build/i2c.target.mk create mode 100644 node_modules/i2c-bus/doc/edison-adruino-base-board-i2c.md create mode 100644 node_modules/i2c-bus/doc/raspberry-pi-i2c.md create mode 100644 node_modules/i2c-bus/doc/raspberry-pi-software-i2c.md create mode 100644 node_modules/i2c-bus/example/ds1621-async-callback.js create mode 100644 node_modules/i2c-bus/example/ds1621-bb.png create mode 100644 node_modules/i2c-bus/example/ds1621-pi.png create mode 100644 node_modules/i2c-bus/example/ds1621-sync.js create mode 100644 node_modules/i2c-bus/example/i2c-list-busses.js create mode 100644 node_modules/i2c-bus/example/i2cdetect-quick.js create mode 100644 node_modules/i2c-bus/example/i2cdetect.js create mode 100644 node_modules/i2c-bus/example/i2cfuncs.js create mode 100644 node_modules/i2c-bus/example/mcp9808-async-callback.js create mode 100644 node_modules/i2c-bus/example/mcp9808-pi.png create mode 100644 node_modules/i2c-bus/example/mcp9808-promise-plain-i2c-buffer.js create mode 100644 node_modules/i2c-bus/example/mcp9808-promise.js create mode 100644 node_modules/i2c-bus/example/mcp9808-sync.js create mode 100644 node_modules/i2c-bus/example/two-devices.js create mode 100644 node_modules/i2c-bus/i2c-bus.js create mode 100644 node_modules/i2c-bus/integration-test/async-brute-force-leak-check.js create mode 100644 node_modules/i2c-bus/integration-test/async-performance.js create mode 100644 node_modules/i2c-bus/integration-test/async-promise-performance.js create mode 100644 node_modules/i2c-bus/integration-test/async-promise.js create mode 100644 node_modules/i2c-bus/integration-test/async.js create mode 100644 node_modules/i2c-bus/integration-test/busses.js create mode 100644 node_modules/i2c-bus/integration-test/deviceid.js create mode 100644 node_modules/i2c-bus/integration-test/errors.js create mode 100644 node_modules/i2c-bus/integration-test/i2c-functionality-available.js create mode 100755 node_modules/i2c-bus/integration-test/run-tests create mode 100644 node_modules/i2c-bus/integration-test/scan-leak-check.js create mode 100644 node_modules/i2c-bus/integration-test/scan.js create mode 100644 node_modules/i2c-bus/integration-test/sync-brute-force-leak-check.js create mode 100644 node_modules/i2c-bus/integration-test/sync-deviceid.js create mode 100644 node_modules/i2c-bus/integration-test/sync-many-instances.js create mode 100644 node_modules/i2c-bus/integration-test/sync-performance.js create mode 100644 node_modules/i2c-bus/integration-test/sync-plain-i2c-performance.js create mode 100644 node_modules/i2c-bus/integration-test/sync.js create mode 100644 node_modules/i2c-bus/package.json create mode 100644 node_modules/i2c-bus/src/deviceid.cc create mode 100644 node_modules/i2c-bus/src/deviceid.h create mode 100644 node_modules/i2c-bus/src/i2c-dev.h create mode 100644 node_modules/i2c-bus/src/i2c.cc create mode 100644 node_modules/i2c-bus/src/i2cfuncs.cc create mode 100644 node_modules/i2c-bus/src/i2cfuncs.h create mode 100644 node_modules/i2c-bus/src/readblock.cc create mode 100644 node_modules/i2c-bus/src/readblock.h create mode 100644 node_modules/i2c-bus/src/readbyte.cc create mode 100644 node_modules/i2c-bus/src/readbyte.h create mode 100644 node_modules/i2c-bus/src/readi2cblock.cc create mode 100644 node_modules/i2c-bus/src/readi2cblock.h create mode 100644 node_modules/i2c-bus/src/readword.cc create mode 100644 node_modules/i2c-bus/src/readword.h create mode 100644 node_modules/i2c-bus/src/receivebyte.cc create mode 100644 node_modules/i2c-bus/src/receivebyte.h create mode 100644 node_modules/i2c-bus/src/sendbyte.cc create mode 100644 node_modules/i2c-bus/src/sendbyte.h create mode 100644 node_modules/i2c-bus/src/setaddr.cc create mode 100644 node_modules/i2c-bus/src/setaddr.h create mode 100644 node_modules/i2c-bus/src/util.h create mode 100644 node_modules/i2c-bus/src/writeblock.cc create mode 100644 node_modules/i2c-bus/src/writeblock.h create mode 100644 node_modules/i2c-bus/src/writebyte.cc create mode 100644 node_modules/i2c-bus/src/writebyte.h create mode 100644 node_modules/i2c-bus/src/writei2cblock.cc create mode 100644 node_modules/i2c-bus/src/writei2cblock.h create mode 100644 node_modules/i2c-bus/src/writequick.cc create mode 100644 node_modules/i2c-bus/src/writequick.h create mode 100644 node_modules/i2c-bus/src/writeword.cc create mode 100644 node_modules/i2c-bus/src/writeword.h create mode 100644 node_modules/nan/.github/workflows/ci.yml create mode 100644 node_modules/nan/CHANGELOG.md create mode 100644 node_modules/nan/CMakeLists.txt create mode 100644 node_modules/nan/LICENSE.md create mode 100644 node_modules/nan/README.md create mode 100644 node_modules/nan/doc/asyncworker.md create mode 100644 node_modules/nan/doc/buffers.md create mode 100644 node_modules/nan/doc/callback.md create mode 100644 node_modules/nan/doc/converters.md create mode 100644 node_modules/nan/doc/errors.md create mode 100644 node_modules/nan/doc/json.md create mode 100644 node_modules/nan/doc/maybe_types.md create mode 100644 node_modules/nan/doc/methods.md create mode 100644 node_modules/nan/doc/new.md create mode 100644 node_modules/nan/doc/node_misc.md create mode 100644 node_modules/nan/doc/object_wrappers.md create mode 100644 node_modules/nan/doc/persistent.md create mode 100644 node_modules/nan/doc/scopes.md create mode 100644 node_modules/nan/doc/script.md create mode 100644 node_modules/nan/doc/string_bytes.md create mode 100644 node_modules/nan/doc/v8_internals.md create mode 100644 node_modules/nan/doc/v8_misc.md create mode 100644 node_modules/nan/include_dirs.js create mode 100644 node_modules/nan/nan.h create mode 100644 node_modules/nan/nan_callbacks.h create mode 100644 node_modules/nan/nan_callbacks_12_inl.h create mode 100644 node_modules/nan/nan_callbacks_pre_12_inl.h create mode 100644 node_modules/nan/nan_converters.h create mode 100644 node_modules/nan/nan_converters_43_inl.h create mode 100644 node_modules/nan/nan_converters_pre_43_inl.h create mode 100644 node_modules/nan/nan_define_own_property_helper.h create mode 100644 node_modules/nan/nan_implementation_12_inl.h create mode 100644 node_modules/nan/nan_implementation_pre_12_inl.h create mode 100644 node_modules/nan/nan_json.h create mode 100644 node_modules/nan/nan_maybe_43_inl.h create mode 100644 node_modules/nan/nan_maybe_pre_43_inl.h create mode 100644 node_modules/nan/nan_new.h create mode 100644 node_modules/nan/nan_object_wrap.h create mode 100644 node_modules/nan/nan_persistent_12_inl.h create mode 100644 node_modules/nan/nan_persistent_pre_12_inl.h create mode 100644 node_modules/nan/nan_private.h create mode 100644 node_modules/nan/nan_scriptorigin.h create mode 100644 node_modules/nan/nan_string_bytes.h create mode 100644 node_modules/nan/nan_typedarray_contents.h create mode 100644 node_modules/nan/nan_weak.h create mode 100644 node_modules/nan/package.json create mode 100755 node_modules/nan/tools/1to2.js create mode 100644 node_modules/nan/tools/README.md create mode 100644 node_modules/nan/tools/package.json create mode 100644 package-lock.json create mode 100644 package.json diff --git a/index.js b/index.js new file mode 100644 index 0000000..b74f584 --- /dev/null +++ b/index.js @@ -0,0 +1,11 @@ +var LCDPLATE, lcd; +LCDPLATE = require('adafruit-i2c-lcd').plate; +lcd = new LCDPLATE(1, 0x43); + +lcd.backlight(lcd.colors.RED); +lcd.message('Hello World!'); + +lcd.on('button_change', function(button) { + lcd.clear(); + lcd.message('Button changed:\n' + lcd.buttonName(button)); +}); \ No newline at end of file diff --git a/listener-software.md b/listener-software.md index 956e757..9ce8aaa 100644 --- a/listener-software.md +++ b/listener-software.md @@ -81,3 +81,21 @@ sudo alsactl store ### LCD Screen Follow https://peppe8o.com/1602-lcd-raspberry-pi-display/ +sudo apt install python3-pip python3-smbus i2c-tools -y +sudo raspi-config + +enable i2c in interface options + + + + +python3 -m venv screen --system-site-packages +source ./screen/bin/activate + +pip3 install adafruit-circuitpython-charlcd + +wget https://peppe8o.com/download/python/lcd/i2c-lcd-test-01-hello-world.py + +i2cdetect -y 1 + +python3 i2c-lcd-test-01-hello-world.py \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..09c5c41 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,52 @@ +{ + "name": "portal", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/adafruit-i2c-lcd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adafruit-i2c-lcd/-/adafruit-i2c-lcd-2.0.0.tgz", + "integrity": "sha512-L23HBVbNyr1yGXwO0RsT6modQgqOe98EDA4OR8oo74Rhwy5xaqPjSSBFvvBc7IX7hgjjBS12udSzguCehSzrxw==", + "license": "BSD-2-Clause", + "dependencies": { + "i2c-bus": "^5.1.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/i2c-bus": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/i2c-bus/-/i2c-bus-5.2.3.tgz", + "integrity": "sha512-kzFgU0OSIZlaeUUa+VK7L+kkxnj4feimCVQDOPrzj0cTaB+hNweTsO8/j7QvW2gRgWQ7ds5IpfFjpBrX+fMNng==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.17.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "license": "MIT" + } + } +} diff --git a/node_modules/adafruit-i2c-lcd/LICENSE b/node_modules/adafruit-i2c-lcd/LICENSE new file mode 100644 index 0000000..74671d2 --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013, fehmer +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/adafruit-i2c-lcd/README.md b/node_modules/adafruit-i2c-lcd/README.md new file mode 100644 index 0000000..473335f --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/README.md @@ -0,0 +1,169 @@ +# Adafruit I2C LCD Plate + +Node.js implementation for the Adafruit RGB 16x2 LCD+Keypad Kit for Raspberry Pi +http://www.adafruit.com/products/1110 + +**Note:** This readme is for the current version 1.x.x/2.x.x. If you are using older versions please read the [version 0.0.x readme](https://github.com/fehmer/adafruit-i2c-lcd/tree/0.0.x) or [version 0.1.x readme](https://github.com/fehmer/adafruit-i2c-lcd/tree/0.1.x). + +**Note:** Since version 1.0.0 this module is based on [i2c-bus](https://www.npmjs.com/package/i2c-bus). For compatibility with your node.js version read the i2c-bus documentation. Older versions of this module were based on [i2c](https://www.npmjs.com/package/i2c). adafruit-i2c-lcd version 0.1.x only works with node.js 0.12.x and adafruit-i2c-lcd version 0.0.x only works with node.js 0.10.x. + +**Note:** Version 2.0.0 and greater drops support for node v4, v5, and v7 as well as npm < v4 (update npm by running the command ```npm i npm -g```) + +**Note:** This module is compatible with Sainsmart 1602 I2C, see [Compatibility](#compatibility) + +## Usage + +1. read the [i2c-bus documentation](https://github.com/fivdi/i2c-bus/blob/master/doc/raspberry-pi-i2c.md) how to setup your raspberry pi. +2. add dependency using ```npm install adafruit-i2c-lcd --save``` +3. Copy and run one of the examples from the examples directory. Maybe you have to run them as root. + +### simple example + +```javascript +var LCDPLATE, lcd; +LCDPLATE = require('adafruit-i2c-lcd').plate; +lcd = new LCDPLATE(1, 0x20); + +lcd.backlight(lcd.colors.RED); +lcd.message('Hello World!'); + +lcd.on('button_change', function(button) { + lcd.clear(); + lcd.message('Button changed:\n' + lcd.buttonName(button)); +}); +``` + + +## API + + - [LCDPLATE(device:String,address:Number,[pollInterval:Number])](#lcdplatedevicestringaddressnumberpollintervalnumber) + - [LCDPLATE.clear()](#lcdplateclear) + - [LCDPLATE.close()](#lcdplateclose) + - [LCDPLATE.backlight(color:Number)](#lcdplatebacklightcolornumber) + - [LCDPLATE.message(text:String,[clear:boolean])](#lcdplatemessagetextstring-booleanclear) + - [LCDPLATE.createChar(index:Number, pattern:byte[])](#lcdplatecreatecharindexnumber-patternbyte) + - [LCDPLATE.buttonState():Number](#lcdplatebuttonstatenumber) + - [LCDPLATE.buttonName(val:Number):String](#lcdplatebuttonnamevalnumberstring) + +### LCDPLATE(device:String,address:Number,[pollInterval:Number]) + +Setting up a new LCDPLATE. + +- device: Device name, e.g. '/dev/i2c-1' +- address: Address of the i2c panel, e.g. 0x20 +- pollInterval: optional. Set the poll interval for the buttons to x ms. Use pollInterval=-1 to disable polling. (Buttons will not work) + +### LCDPLATE.clear() + +Clear the LCD, remove all text. + +### LCDPLATE.close() + +Close the LCD plate. Use this to stop the polling. + +### LCDPLATE.backlight(color:Number) + +Set the backlight of the LCD to the given color. You can use predefined colors from the LCDPLATE class: + +LCDPLATE.colors = [OFF, RED, GREEN, BLUE, YELLOW, TEAL, VIOLET, WHITE, ON] + + +### LCDPLATE.message(text:String, [boolean:clear]) + +Add the text on the LCD. Use \n as line feed. Only the first two lines will be sent to the display. +If parameter clear is given and true only the text is shown, previous content on the lcd will be cleared. + +### LCDPLATE.createChar(index:Number, pattern:byte[]) + +Defines custom characters. Index must be between 0 and 7. Pattern is the pattern of your character, must contain exactly 8 bytes. +E.g. you can easyly design your custom character at http://www.quinapalus.com/hd44780udg.html to show your custom character use eg. lcd.message('\x01'). + +Example: +```javascript +lcd.createChar(1, [0,0,10,31,31,14,4,0]); +lcd.createChar(2, [0,4,10,17,17,10,4,0]); + +lcd.clear(); +lcd.backlight(lcd.colors.RED); +lcd.message('I\x01 n\x02de.js', true); +``` + + +### LCDPLATE.buttonState():Number + +Returns the pressed buttons as a number. Use bitmasks to mask out the state of the desired button. See LCDPLATE.buttons for button values. + +### LCDPLATE.buttonName(val:Number):String + +Returns the name, e.g. 'SELECT' to a button number. See LCDPLATE.buttons for button values. + +## Events + +### button_change + +Fires if a button is pressed or released. + +Parameters: + +* button: the button, See LCDPLATE.buttons for button values. + +### Example +```javascript +lcd.on('button_change', function(button) { + lcd.clear(); + lcd.message('Button changed:\n' + lcd.buttonName(button)); +}); +``` + +### button_up + +Fires if a button is released. + +Parameters: + +* button: the button, See LCDPLATE.buttons for button values. + + +### button_down + +Fires if a button is pressed. + +Parameters: + +* button: the button, See LCDPLATE.buttons for button values. + +## Compatibility + +This library is compatible with the Sainsmart 1602 I2C (SKU: 20-011-221) +with some notable exceptions. This clone has a blue backlight and an +RGB LED on-board. + +* The [LCDPLATE.backlight()](#lcdplatebacklightcolornumber) function +changes the RGB LED rather than the backlight. +* The backlight on the LCD is connected to GPA5, which is the sixth (6th) +bit of port A. It can be set on or off directly in your client code. + +```javascript + lcd.sendBytes(0, 0x1F); // Sainsmart 1602 I2C backlight on + lcd.sendBytes(0, 0x3F); // Sainsmart 1602 I2C backlight off +``` + + +## Licence + +Based on the [Adafruit's Raspberry-Pi Python Code Library](https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git) + +> Here is a growing collection of libraries and example python scripts +> for controlling a variety of Adafruit electronics with a Raspberry Pi + +> In progress! +> +> Adafruit invests time and resources providing this open source code, +> please support Adafruit and open-source hardware by purchasing +> products from Adafruit! +> +> Written by Limor Fried, Kevin Townsend and Mikey Sklar for Adafruit Industries. +> BSD license, all text above must be included in any redistribution +> +> To download, we suggest logging into your Pi with Internet accessibility and typing: +> git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git diff --git a/node_modules/adafruit-i2c-lcd/adafruit-i2c-lcd-2.0.0.tgz b/node_modules/adafruit-i2c-lcd/adafruit-i2c-lcd-2.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e742748fd848faf404d9d89cbe2521deab3bdc99 GIT binary patch literal 6891 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 literal 0 HcmV?d00001 diff --git a/node_modules/adafruit-i2c-lcd/example/demo.js b/node_modules/adafruit-i2c-lcd/example/demo.js new file mode 100644 index 0000000..78aff5e --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/example/demo.js @@ -0,0 +1,80 @@ +var LCDPLATE, lcd; +LCDPLATE = require('adafruit-i2c-lcd').plate; +lcd = new LCDPLATE(1, 0x20); +var index = 0; + +// create some custom characters +lcd.createChar(1, [2, 3, 2, 2, 14, 30, 12, 0]) +lcd.createChar(2, [0, 1, 3, 22, 28, 8, 0, 0]) +lcd.createChar(3, [0, 14, 21, 23, 17, 14, 0, 0]) +lcd.createChar(4, [31, 17, 10, 4, 10, 17, 31, 0]) +lcd.createChar(5, [8, 12, 10, 9, 10, 12, 8, 0]) +lcd.createChar(6, [2, 6, 10, 18, 10, 6, 2, 0]) +lcd.createChar(7, [31, 17, 21, 21, 21, 21, 17, 31]) + +//demo content +var demo = [{ + color: lcd.colors.RED, + message: 'test backlight\n color: RED \x01' + }, { + color: lcd.colors.GREEN, + message: 'test backlight\n color: GREEN \x02' + }, { + color: lcd.colors.BLUE, + message: 'test backlight\n color: BLUE \x03' + }, { + color: lcd.colors.YELLOW, + message: 'test backlight\n color: YELLOW \x04' + }, { + color: lcd.colors.TEAL, + message: 'test backlight\n color: TEAL \x05' + }, { + color: lcd.colors.VIOLET, + message: 'test backlight\n color: VIOLET \x06' + }, { + color: lcd.colors.WHITE, + message: 'test backlight\n color: WHITE \x07' + }, { + color: lcd.colors.WHITE, + message: 'now try pressing\n some buttons!' + } + +] + +// show button state on lcd and console +function displayButton(state, button) { + lcd.clear(); + lcd.message('Button: ' + lcd.buttonName(button) + '\nState: ' + state); + console.log(state, lcd.buttonName(button)); +} + +//show hello world in red +lcd.backlight(lcd.colors.RED); +lcd.message('Hello World!\nLoading demo...'); + +//start demo, loop over the demo content. +var demoInterval = setInterval(function() { + if (index < 8) { + //show demo content + lcd.clear(); + lcd.backlight(demo[index].color); + lcd.message(demo[index].message); + } else { + //end of demo + clearInterval(demoInterval); + + //register events to show button press/release + lcd.on('button_change', function(button) { + console.log('button_change', lcd.buttonName(button)); + }); + + lcd.on('button_down', function(button) { + displayButton('pressed', button); + }); + + lcd.on('button_up', function(button) { + displayButton('released', button); + }); + } + index++; +}, 1000); diff --git a/node_modules/adafruit-i2c-lcd/lib/.gitkeep b/node_modules/adafruit-i2c-lcd/lib/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/adafruit-i2c-lcd/lib/I2CBusWireAdapter.js b/node_modules/adafruit-i2c-lcd/lib/I2CBusWireAdapter.js new file mode 100644 index 0000000..053387d --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/lib/I2CBusWireAdapter.js @@ -0,0 +1,42 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var I2C, I2CBusWireAdapter; + + I2C = require('i2c-bus'); + + I2CBusWireAdapter = (function() { + function I2CBusWireAdapter(device, address) { + if (!(typeof device === 'number')) { + throw new Error('parameter device has to be the number of the device, not a path or device name. e.g. 1 instead of /dev/i2c-1 or i2c-1'); + } + this._DEVICE = device; + this._ADDRESS = address; + this._WIRE = I2C.openSync(device); + } + + I2CBusWireAdapter.prototype.writeByte = function(value) { + return this._WIRE.sendByteSync(this._ADDRESS, value); + }; + + I2CBusWireAdapter.prototype.writeBytes = function(cmd, values) { + if (!Buffer.isBuffer(values)) { + values = new Buffer(values); + } + return this._WIRE.writeI2cBlockSync(this._ADDRESS, cmd, values.length, values); + }; + + I2CBusWireAdapter.prototype.readByte = function(cmd) { + if (cmd != null) { + return this._WIRE.readByteSync(this._ADDRESS, cmd); + } else { + return this._WIRE.receiveByteSync(this._ADDRESS); + } + }; + + return I2CBusWireAdapter; + + })(); + + module.exports = I2CBusWireAdapter; + +}).call(this); diff --git a/node_modules/adafruit-i2c-lcd/lib/adafruit_i2c_lcd.js b/node_modules/adafruit-i2c-lcd/lib/adafruit_i2c_lcd.js new file mode 100644 index 0000000..1a3b010 --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/lib/adafruit_i2c_lcd.js @@ -0,0 +1,300 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + var EventEmitter, LCD_BLINKOFF, LCD_BLINKON, LCD_CLEARDISPLAY, LCD_CURSORMOVE, LCD_CURSOROFF, LCD_CURSORON, LCD_CURSORSHIFT, LCD_DISPLAYCONTROL, LCD_DISPLAYMOVE, LCD_DISPLAYOFF, LCD_DISPLAYON, LCD_ENTRYLEFT, LCD_ENTRYMODESET, LCD_ENTRYRIGHT, LCD_ENTRYSHIFTDECREMENT, LCD_ENTRYSHIFTINCREMENT, LCD_FUNCTIONSET, LCD_MOVELEFT, LCD_MOVERIGHT, LCD_RETURNHOME, LCD_SETCGRAMADDR, LCD_SETDDRAMADDR, MCP23017_GPIOA, MCP23017_GPIOB, MCP23017_IOCON_BANK0, MCP23017_IOCON_BANK1, MCP23017_IODIRB, Plate, WireAdapter, flip, pollables, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + MCP23017_IOCON_BANK0 = 0x0A; + + MCP23017_IOCON_BANK1 = 0x15; + + MCP23017_GPIOA = 0x09; + + MCP23017_IODIRB = 0x10; + + MCP23017_GPIOB = 0x19; + + LCD_CLEARDISPLAY = 0x01; + + LCD_RETURNHOME = 0x02; + + LCD_ENTRYMODESET = 0x04; + + LCD_DISPLAYCONTROL = 0x08; + + LCD_CURSORSHIFT = 0x10; + + LCD_FUNCTIONSET = 0x20; + + LCD_SETCGRAMADDR = 0x40; + + LCD_SETDDRAMADDR = 0x80; + + LCD_DISPLAYON = 0x04; + + LCD_DISPLAYOFF = 0x00; + + LCD_CURSORON = 0x02; + + LCD_CURSOROFF = 0x00; + + LCD_BLINKON = 0x01; + + LCD_BLINKOFF = 0x00; + + LCD_ENTRYRIGHT = 0x00; + + LCD_ENTRYLEFT = 0x02; + + LCD_ENTRYSHIFTINCREMENT = 0x01; + + LCD_ENTRYSHIFTDECREMENT = 0x00; + + LCD_DISPLAYMOVE = 0x08; + + LCD_CURSORMOVE = 0x00; + + LCD_MOVERIGHT = 0x04; + + LCD_MOVELEFT = 0x00; + + flip = [0x00, 0x10, 0x08, 0x18, 0x04, 0x14, 0x0C, 0x1C, 0x02, 0x12, 0x0A, 0x1A, 0x06, 0x16, 0x0E, 0x1E]; + + pollables = [LCD_CLEARDISPLAY, LCD_RETURNHOME]; + + EventEmitter = require('events').EventEmitter; + + WireAdapter = require('./I2CBusWireAdapter'); + + Plate = (function(superClass) { + extend(Plate, superClass); + + function Plate(device, address, pollInterval) { + this.ADDRESS = address; + this.PORTA = 0; + this.PORTB = 0; + this.DDRB = 0x10; + this.WIRE = new WireAdapter(device, address); + if (pollInterval == null) { + pollInterval = 200; + } + this.init(); + this.BSTATE = 0; + if (pollInterval > 0) { + this.poll = setInterval((function(_this) { + return function() { + var cur, key; + cur = _this.buttonState(); + if (cur !== _this.BSTATE) { + key = _this.BSTATE ^ cur; + _this.emit('button_change', key); + if (cur < _this.BSTATE) { + _this.emit('button_up', key); + } else { + _this.emit('button_down', key); + } + return _this.BSTATE = cur; + } + }; + })(this), pollInterval); + } + } + + Plate.prototype.colors = { + OFF: 0x00, + RED: 0x01, + GREEN: 0x02, + BLUE: 0x04, + YELLOW: 0x03, + TEAL: 0x06, + VIOLET: 0x05, + WHITE: 0x07, + ON: 0x07 + }; + + Plate.prototype.buttons = { + SELECT: 0x01, + RIGHT: 0x02, + DOWN: 0x04, + UP: 0x08, + LEFT: 0x10 + }; + + Plate.prototype.clear = function() { + return this.writeByte(LCD_CLEARDISPLAY); + }; + + Plate.prototype.home = function() { + return this.writeByte(LCD_RETURNHOME); + }; + + Plate.prototype.close = function() { + if (this.poll != null) { + return clearInterval(this.poll); + } + }; + + Plate.prototype.backlight = function(color) { + var c; + c = ~color; + this.PORTA = (this.PORTA & 0x3F) | ((c & 0x3) << 6); + this.PORTB = (this.PORTB & 0xFE) | ((c & 0x4) >> 2); + this.sendBytes(MCP23017_GPIOA, this.PORTA); + return this.sendBytes(MCP23017_GPIOB, this.PORTB); + }; + + Plate.prototype.message = function(text, clear) { + var i, j, len, line, lines, results; + if (clear) { + this.clear(); + } + lines = text.split('\n'); + results = []; + for (i = j = 0, len = lines.length; j < len; i = ++j) { + line = lines[i]; + if (i === 1) { + this.writeByte(0xC0); + } + if (i < 2) { + results.push(this.writeByte(line, true)); + } else { + results.push(void 0); + } + } + return results; + }; + + Plate.prototype.buttonState = function() { + var ret; + ret = this.WIRE.readByte(MCP23017_GPIOA); + return ret & 0x1F; + }; + + Plate.prototype.buttonName = function(val) { + switch (val) { + case this.buttons.SELECT: + return "SELECT"; + case this.buttons.RIGHT: + return "RIGHT"; + case this.buttons.UP: + return "UP"; + case this.buttons.DOWN: + return "DOWN"; + case this.buttons.LEFT: + return "LEFT"; + default: + return void 0; + } + }; + + Plate.prototype.createChar = function(location, pattern) { + var data, j, len; + location = location & 0x7; + this.writeByte(LCD_SETCGRAMADDR | (location << 3)); + for (j = 0, len = pattern.length; j < len; j++) { + data = pattern[j]; + this.writeByte(data, true); + } + return this.clear(); + }; + + Plate.prototype.init = function() { + var displaycontrol, displaymode, displayshift; + this.sendBytes(MCP23017_IOCON_BANK1, 0); + this.sendBytes(0, [0x3F, this.DDRB, 0x3F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3F, 0x0, 0x0, 0x0, 0x0, 0x0, this.PORTA, this.PORTB, this.PORTA, this.PORTB]); + this.sendBytes(MCP23017_IOCON_BANK0, 0xA0); + displayshift = LCD_CURSORMOVE | LCD_MOVERIGHT; + displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; + displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; + this.writeByte(0x33); + this.writeByte(0x32); + this.writeByte(0x28); + this.writeByte(LCD_CLEARDISPLAY); + this.writeByte(LCD_CURSORSHIFT | displayshift); + this.writeByte(LCD_ENTRYMODESET | displaymode); + this.writeByte(LCD_DISPLAYCONTROL | displaycontrol); + this.writeByte(LCD_RETURNHOME); + this.clear; + return this.backlight(0x0); + }; + + Plate.prototype.sendBytes = function(cmd, values) { + var data, reg; + reg = cmd; + if (typeof values === 'number') { + data = []; + data.push(values); + values = data; + } + return this.WIRE.writeBytes(cmd, values); + }; + + Plate.prototype.sendByte = function(value) { + return this.WIRE.writeByte(value); + }; + + Plate.prototype.maskOut = function(bitmask, value) { + var hi, lo; + hi = bitmask | flip[value >> 4]; + lo = bitmask | flip[value & 0x0F]; + return [hi | 0x20, hi, lo | 0x20, lo]; + }; + + Plate.prototype.writeByte = function(value, char_mode) { + var bitmask, bits, data, hi, j, k, last, lo, ref; + char_mode = char_mode || false; + if (this.DDRB & 0x10) { + lo = (this.PORTB & 0x01) | 0x40; + hi = lo | 0x20; + this.sendBytes(MCP23017_GPIOB, lo); + while (true) { + this.sendByte(hi); + bits = this.readByte(); + this.sendBytes(MCP23017_GPIOB, [lo, hi, lo]); + if ((bits & 0x2) === 0) { + break; + } + } + this.PORTB = lo; + this.DDRB &= 0xEF; + this.sendBytes(MCP23017_IODIRB, this.DDRB); + } + bitmask = this.PORTB & 0x01; + if (char_mode) { + bitmask |= 0x80; + } + if (typeof value === "string") { + last = value.length - 1; + data = []; + for (k = j = 0, ref = last; 0 <= ref ? j <= ref : j >= ref; k = 0 <= ref ? ++j : --j) { + if (value[k] != null) { + data = data.concat(this.maskOut(bitmask, value[k].charCodeAt(0))); + if (data.length >= 32 || k === last) { + this.sendBytes(MCP23017_GPIOB, data); + this.PORTB = data[data.length - 1]; + data = []; + } + } + } + } else { + data = this.maskOut(bitmask, value); + this.sendBytes(MCP23017_GPIOB, data); + this.PORTB = data[data.length - 1]; + } + if (!char_mode && pollables.indexOf(value) !== -1) { + this.DDRB |= 0x10; + return this.sendBytes(MCP23017_IODIRB, this.DDRB); + } + }; + + Plate.prototype.readByte = function() { + return this.WIRE.readByte(); + }; + + return Plate; + + })(EventEmitter); + + module.exports = Plate; + +}).call(this); diff --git a/node_modules/adafruit-i2c-lcd/lib/index.js b/node_modules/adafruit-i2c-lcd/lib/index.js new file mode 100644 index 0000000..f71c67d --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/lib/index.js @@ -0,0 +1,5 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + module.exports.plate = require('./adafruit_i2c_lcd'); + +}).call(this); diff --git a/node_modules/adafruit-i2c-lcd/package.json b/node_modules/adafruit-i2c-lcd/package.json new file mode 100644 index 0000000..dc113e4 --- /dev/null +++ b/node_modules/adafruit-i2c-lcd/package.json @@ -0,0 +1,30 @@ +{ + "name": "adafruit-i2c-lcd", + "version": "2.0.0", + "description": "Node Library for using adafruit i2c rgb lcd pi plate", + "main": "./lib/index.js", + "dependencies": { + "i2c-bus": "^5.1.0" + }, + "devDependencies": { + "coffee-script": "" + }, + "scripts": { + "prepare": "node_modules/coffee-script/bin/coffee -o lib -c src" + }, + "repository": { + "type": "git", + "url": "https://github.com/fehmer/adafruit-i2c-lcd.git" + }, + "keywords": [ + "raspberry", + "pi", + "adafruit", + "i2c", + "lcd", + "rgb", + "plate" + ], + "author": "Christian Fehmer", + "license": "BSD-2-Clause" +} diff --git a/node_modules/bindings/LICENSE.md b/node_modules/bindings/LICENSE.md new file mode 100644 index 0000000..5a92289 --- /dev/null +++ b/node_modules/bindings/LICENSE.md @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +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. diff --git a/node_modules/bindings/README.md b/node_modules/bindings/README.md new file mode 100644 index 0000000..5b3e7a8 --- /dev/null +++ b/node_modules/bindings/README.md @@ -0,0 +1,98 @@ +node-bindings +============= +### Helper module for loading your native module's `.node` file + +This is a helper module for authors of Node.js native addon modules. +It is basically the "swiss army knife" of `require()`ing your native module's +`.node` file. + +Throughout the course of Node's native addon history, addons have ended up being +compiled in a variety of different places, depending on which build tool and which +version of node was used. To make matters worse, now the `gyp` build tool can +produce either a __Release__ or __Debug__ build, each being built into different +locations. + +This module checks _all_ the possible locations that a native addon would be built +at, and returns the first one that loads successfully. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install --save bindings +``` + +Or add it to the `"dependencies"` section of your `package.json` file. + + +Example +------- + +`require()`ing the proper bindings file for the current node version, platform +and architecture is as simple as: + +``` js +var bindings = require('bindings')('binding.node') + +// Use your bindings defined in your C files +bindings.your_c_function() +``` + + +Nice Error Output +----------------- + +When the `.node` file could not be loaded, `node-bindings` throws an Error with +a nice error message telling you exactly what was tried. You can also check the +`err.tries` Array property. + +``` +Error: Could not load the bindings file. Tried: + → /Users/nrajlich/ref/build/binding.node + → /Users/nrajlich/ref/build/Debug/binding.node + → /Users/nrajlich/ref/build/Release/binding.node + → /Users/nrajlich/ref/out/Debug/binding.node + → /Users/nrajlich/ref/Debug/binding.node + → /Users/nrajlich/ref/out/Release/binding.node + → /Users/nrajlich/ref/Release/binding.node + → /Users/nrajlich/ref/build/default/binding.node + → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node + at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13) + at Object. (/Users/nrajlich/ref/lib/ref.js:5:47) + at Module._compile (module.js:449:26) + at Object.Module._extensions..js (module.js:467:10) + at Module.load (module.js:356:32) + at Function.Module._load (module.js:312:12) + ... +``` + +The searching for the `.node` file will originate from the first directory in which has a `package.json` file is found. + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +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. diff --git a/node_modules/bindings/bindings.js b/node_modules/bindings/bindings.js new file mode 100644 index 0000000..727413a --- /dev/null +++ b/node_modules/bindings/bindings.js @@ -0,0 +1,221 @@ +/** + * Module dependencies. + */ + +var fs = require('fs'), + path = require('path'), + fileURLToPath = require('file-uri-to-path'), + join = path.join, + dirname = path.dirname, + exists = + (fs.accessSync && + function(path) { + try { + fs.accessSync(path); + } catch (e) { + return false; + } + return true; + }) || + fs.existsSync || + path.existsSync, + defaults = { + arrow: process.env.NODE_BINDINGS_ARROW || ' → ', + compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled', + platform: process.platform, + arch: process.arch, + nodePreGyp: + 'node-v' + + process.versions.modules + + '-' + + process.platform + + '-' + + process.arch, + version: process.versions.node, + bindings: 'bindings.node', + try: [ + // node-gyp's linked version in the "build" dir + ['module_root', 'build', 'bindings'], + // node-waf and gyp_addon (a.k.a node-gyp) + ['module_root', 'build', 'Debug', 'bindings'], + ['module_root', 'build', 'Release', 'bindings'], + // Debug files, for development (legacy behavior, remove for node v0.9) + ['module_root', 'out', 'Debug', 'bindings'], + ['module_root', 'Debug', 'bindings'], + // Release files, but manually compiled (legacy behavior, remove for node v0.9) + ['module_root', 'out', 'Release', 'bindings'], + ['module_root', 'Release', 'bindings'], + // Legacy from node-waf, node <= 0.4.x + ['module_root', 'build', 'default', 'bindings'], + // Production "Release" buildtype binary (meh...) + ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'], + // node-qbs builds + ['module_root', 'addon-build', 'release', 'install-root', 'bindings'], + ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'], + ['module_root', 'addon-build', 'default', 'install-root', 'bindings'], + // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch} + ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings'] + ] + }; + +/** + * The main `bindings()` function loads the compiled bindings for a given module. + * It uses V8's Error API to determine the parent filename that this function is + * being invoked from, which is then used to find the root directory. + */ + +function bindings(opts) { + // Argument surgery + if (typeof opts == 'string') { + opts = { bindings: opts }; + } else if (!opts) { + opts = {}; + } + + // maps `defaults` onto `opts` object + Object.keys(defaults).map(function(i) { + if (!(i in opts)) opts[i] = defaults[i]; + }); + + // Get the module root + if (!opts.module_root) { + opts.module_root = exports.getRoot(exports.getFileName()); + } + + // Ensure the given bindings name ends with .node + if (path.extname(opts.bindings) != '.node') { + opts.bindings += '.node'; + } + + // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035 + var requireFunc = + typeof __webpack_require__ === 'function' + ? __non_webpack_require__ + : require; + + var tries = [], + i = 0, + l = opts.try.length, + n, + b, + err; + + for (; i < l; i++) { + n = join.apply( + null, + opts.try[i].map(function(p) { + return opts[p] || p; + }) + ); + tries.push(n); + try { + b = opts.path ? requireFunc.resolve(n) : requireFunc(n); + if (!opts.path) { + b.path = n; + } + return b; + } catch (e) { + if (e.code !== 'MODULE_NOT_FOUND' && + e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' && + !/not find/i.test(e.message)) { + throw e; + } + } + } + + err = new Error( + 'Could not locate the bindings file. Tried:\n' + + tries + .map(function(a) { + return opts.arrow + a; + }) + .join('\n') + ); + err.tries = tries; + throw err; +} +module.exports = exports = bindings; + +/** + * Gets the filename of the JavaScript file that invokes this function. + * Used to help find the root directory of a module. + * Optionally accepts an filename argument to skip when searching for the invoking filename + */ + +exports.getFileName = function getFileName(calling_file) { + var origPST = Error.prepareStackTrace, + origSTL = Error.stackTraceLimit, + dummy = {}, + fileName; + + Error.stackTraceLimit = 10; + + Error.prepareStackTrace = function(e, st) { + for (var i = 0, l = st.length; i < l; i++) { + fileName = st[i].getFileName(); + if (fileName !== __filename) { + if (calling_file) { + if (fileName !== calling_file) { + return; + } + } else { + return; + } + } + } + }; + + // run the 'prepareStackTrace' function above + Error.captureStackTrace(dummy); + dummy.stack; + + // cleanup + Error.prepareStackTrace = origPST; + Error.stackTraceLimit = origSTL; + + // handle filename that starts with "file://" + var fileSchema = 'file://'; + if (fileName.indexOf(fileSchema) === 0) { + fileName = fileURLToPath(fileName); + } + + return fileName; +}; + +/** + * Gets the root directory of a module, given an arbitrary filename + * somewhere in the module tree. The "root directory" is the directory + * containing the `package.json` file. + * + * In: /home/nate/node-native-module/lib/index.js + * Out: /home/nate/node-native-module + */ + +exports.getRoot = function getRoot(file) { + var dir = dirname(file), + prev; + while (true) { + if (dir === '.') { + // Avoids an infinite loop in rare cases, like the REPL + dir = process.cwd(); + } + if ( + exists(join(dir, 'package.json')) || + exists(join(dir, 'node_modules')) + ) { + // Found the 'package.json' file or 'node_modules' dir; we're done + return dir; + } + if (prev === dir) { + // Got to the top + throw new Error( + 'Could not find module root given file: "' + + file + + '". Do you have a `package.json` file? ' + ); + } + // Try the parent dir next + prev = dir; + dir = join(dir, '..'); + } +}; diff --git a/node_modules/bindings/package.json b/node_modules/bindings/package.json new file mode 100644 index 0000000..d027ee7 --- /dev/null +++ b/node_modules/bindings/package.json @@ -0,0 +1,28 @@ +{ + "name": "bindings", + "description": "Helper module for loading your native module's .node file", + "keywords": [ + "native", + "addon", + "bindings", + "gyp", + "waf", + "c", + "c++" + ], + "version": "1.5.0", + "author": "Nathan Rajlich (http://tootallnate.net)", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-bindings.git" + }, + "main": "./bindings.js", + "bugs": { + "url": "https://github.com/TooTallNate/node-bindings/issues" + }, + "homepage": "https://github.com/TooTallNate/node-bindings", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } +} diff --git a/node_modules/file-uri-to-path/.npmignore b/node_modules/file-uri-to-path/.npmignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/node_modules/file-uri-to-path/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/file-uri-to-path/.travis.yml b/node_modules/file-uri-to-path/.travis.yml new file mode 100644 index 0000000..016bb6e --- /dev/null +++ b/node_modules/file-uri-to-path/.travis.yml @@ -0,0 +1,30 @@ +sudo: false + +language: node_js + +node_js: + - "0.8" + - "0.10" + - "0.12" + - "1" + - "2" + - "3" + - "4" + - "5" + - "6" + - "7" + - "8" + +install: + - PATH="`npm bin`:`npm bin -g`:$PATH" + # Node 0.8 comes with a too obsolete npm + - if [[ "`node --version`" =~ ^v0\.8\. ]]; then npm install -g npm@1.4.28 ; fi + # Install dependencies and build + - npm install + +script: + # Output useful info for debugging + - node --version + - npm --version + # Run tests + - npm test diff --git a/node_modules/file-uri-to-path/History.md b/node_modules/file-uri-to-path/History.md new file mode 100644 index 0000000..c8682be --- /dev/null +++ b/node_modules/file-uri-to-path/History.md @@ -0,0 +1,21 @@ + +1.0.0 / 2017-07-06 +================== + + * update "mocha" to v3 + * fixed unicode URI decoding (#6) + * add typings for Typescript + * README: use SVG Travis-CI badge + * add LICENSE file (MIT) + * add .travis.yml file (testing Node.js 0.8 through 8 currently) + * add README.md file + +0.0.2 / 2014-01-27 +================== + + * index: invert the path separators on Windows + +0.0.1 / 2014-01-27 +================== + + * initial commit diff --git a/node_modules/file-uri-to-path/LICENSE b/node_modules/file-uri-to-path/LICENSE new file mode 100644 index 0000000..e1af783 --- /dev/null +++ b/node_modules/file-uri-to-path/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2014 Nathan Rajlich + +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. diff --git a/node_modules/file-uri-to-path/README.md b/node_modules/file-uri-to-path/README.md new file mode 100644 index 0000000..ab30be8 --- /dev/null +++ b/node_modules/file-uri-to-path/README.md @@ -0,0 +1,74 @@ +file-uri-to-path +================ +### Convert a `file:` URI to a file path +[![Build Status](https://travis-ci.org/TooTallNate/file-uri-to-path.svg?branch=master)](https://travis-ci.org/TooTallNate/file-uri-to-path) + +Accepts a `file:` URI and returns a regular file path suitable for use with the +`fs` module functions. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install file-uri-to-path +``` + + +Example +------- + +``` js +var uri2path = require('file-uri-to-path'); + +uri2path('file://localhost/c|/WINDOWS/clock.avi'); +// "c:\\WINDOWS\\clock.avi" + +uri2path('file:///c|/WINDOWS/clock.avi'); +// "c:\\WINDOWS\\clock.avi" + +uri2path('file://localhost/c:/WINDOWS/clock.avi'); +// "c:\\WINDOWS\\clock.avi" + +uri2path('file://hostname/path/to/the%20file.txt'); +// "\\\\hostname\\path\\to\\the file.txt" + +uri2path('file:///c:/path/to/the%20file.txt'); +// "c:\\path\\to\\the file.txt" +``` + + +API +--- + +### fileUriToPath(String uri) → String + + + +License +------- + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net> + +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. diff --git a/node_modules/file-uri-to-path/index.d.ts b/node_modules/file-uri-to-path/index.d.ts new file mode 100644 index 0000000..99dc3f9 --- /dev/null +++ b/node_modules/file-uri-to-path/index.d.ts @@ -0,0 +1,2 @@ +declare function fileUriToPath(uri: string): string; +export = fileUriToPath; diff --git a/node_modules/file-uri-to-path/index.js b/node_modules/file-uri-to-path/index.js new file mode 100644 index 0000000..48cb280 --- /dev/null +++ b/node_modules/file-uri-to-path/index.js @@ -0,0 +1,66 @@ + +/** + * Module dependencies. + */ + +var sep = require('path').sep || '/'; + +/** + * Module exports. + */ + +module.exports = fileUriToPath; + +/** + * File URI to Path function. + * + * @param {String} uri + * @return {String} path + * @api public + */ + +function fileUriToPath (uri) { + if ('string' != typeof uri || + uri.length <= 7 || + 'file://' != uri.substring(0, 7)) { + throw new TypeError('must pass in a file:// URI to convert to a file path'); + } + + var rest = decodeURI(uri.substring(7)); + var firstSlash = rest.indexOf('/'); + var host = rest.substring(0, firstSlash); + var path = rest.substring(firstSlash + 1); + + // 2. Scheme Definition + // As a special case, can be the string "localhost" or the empty + // string; this is interpreted as "the machine from which the URL is + // being interpreted". + if ('localhost' == host) host = ''; + + if (host) { + host = sep + sep + host; + } + + // 3.2 Drives, drive letters, mount points, file system root + // Drive letters are mapped into the top of a file URI in various ways, + // depending on the implementation; some applications substitute + // vertical bar ("|") for the colon after the drive letter, yielding + // "file:///c|/tmp/test.txt". In some cases, the colon is left + // unchanged, as in "file:///c:/tmp/test.txt". In other cases, the + // colon is simply omitted, as in "file:///c/tmp/test.txt". + path = path.replace(/^(.+)\|/, '$1:'); + + // for Windows, we need to invert the path separators from what a URI uses + if (sep == '\\') { + path = path.replace(/\//g, '\\'); + } + + if (/^.+\:/.test(path)) { + // has Windows drive at beginning of path + } else { + // unix path… + path = sep + path; + } + + return host + path; +} diff --git a/node_modules/file-uri-to-path/package.json b/node_modules/file-uri-to-path/package.json new file mode 100644 index 0000000..b6a4a07 --- /dev/null +++ b/node_modules/file-uri-to-path/package.json @@ -0,0 +1,32 @@ +{ + "name": "file-uri-to-path", + "version": "1.0.0", + "description": "Convert a file: URI to a file path", + "main": "index.js", + "types": "index.d.ts", + "directories": { + "test": "test" + }, + "scripts": { + "test": "mocha --reporter spec" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/file-uri-to-path.git" + }, + "keywords": [ + "file", + "uri", + "convert", + "path" + ], + "author": "Nathan Rajlich (http://n8.io/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/TooTallNate/file-uri-to-path/issues" + }, + "homepage": "https://github.com/TooTallNate/file-uri-to-path", + "devDependencies": { + "mocha": "3" + } +} diff --git a/node_modules/file-uri-to-path/test/test.js b/node_modules/file-uri-to-path/test/test.js new file mode 100644 index 0000000..79305dc --- /dev/null +++ b/node_modules/file-uri-to-path/test/test.js @@ -0,0 +1,24 @@ + +var sep = require('path').sep || '/'; +var assert = require('assert'); +var uri2path = require('../'); +var tests = require('./tests.json'); + +describe('file-uri-to-path', function () { + + Object.keys(tests).forEach(function (uri) { + + // the test cases were generated from Windows' PathCreateFromUrlA() function. + // On Unix, we have to replace the path separator with the Unix one instead of + // the Windows one. + var expected = tests[uri].replace(/\\/g, sep); + + it('should convert ' + JSON.stringify(uri) + ' to ' + JSON.stringify(expected), + function () { + var actual = uri2path(uri); + assert.equal(actual, expected); + }); + + }); + +}); diff --git a/node_modules/file-uri-to-path/test/tests.json b/node_modules/file-uri-to-path/test/tests.json new file mode 100644 index 0000000..b935a63 --- /dev/null +++ b/node_modules/file-uri-to-path/test/tests.json @@ -0,0 +1,13 @@ +{ + "file://host/path": "\\\\host\\path", + "file://localhost/etc/fstab": "\\etc\\fstab", + "file:///etc/fstab": "\\etc\\fstab", + "file:///c:/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file://localhost/c|/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file:///c|/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file://localhost/c:/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi", + "file://hostname/path/to/the%20file.txt": "\\\\hostname\\path\\to\\the file.txt", + "file:///c:/path/to/the%20file.txt": "c:\\path\\to\\the file.txt", + "file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc": "C:\\Documents and Settings\\davris\\FileSchemeURIs.doc", + "file:///C:/caf%C3%A9/%C3%A5r/d%C3%BCnn/%E7%89%9B%E9%93%83/Ph%E1%BB%9F/%F0%9F%98%B5.exe": "C:\\café\\år\\dünn\\牛铃\\Phở\\😵.exe" +} diff --git a/node_modules/i2c-bus/History.md b/node_modules/i2c-bus/History.md new file mode 100644 index 0000000..d82f0e5 --- /dev/null +++ b/node_modules/i2c-bus/History.md @@ -0,0 +1,308 @@ +5.2.3 / Aug 06 2023 +=================== + + * update dependencies + * update information related to supported versions + +5.2.2 / Apr 29 2021 +=================== + + * remove news and updates section of readme + * drop support for node.js 8 and 13, add support for node.js 15 & 16 + * update dependencies + +5.2.1 / Oct 11 2020 +=================== + + * add directories section to package.json + +5.2.0 / Apr 24 2020 +=================== + + * add unit tests for PromisifiedBus + * update dependencies + * drop support for node.js 6, add support for node.js 14 + +5.1.0 / Oct 03 2019 +=================== + + * add bus.promisifiedBus and promisifiedBus.bus + +5.0.0 / Sep 17 2019 +=================== + + * drop support for node.js v4 + * add promise support + * ensure that the properties of i2cFuncs objects are booleans rather than numbers + +4.0.11 / Sep 07 2019 +==================== + + * update dependencies (async v3.1.0, coveralls v3.0.6, lodash v4.17.15, mocha v6.2.0, sinon v7.4.2) + +4.0.10 / Jun 16 2019 +==================== + + * update dependencies + * update npm keywords + +4.0.9 / Mar 14 2019 +=================== + + * add unit tests + * update dependencies (nan v2.13.0, jshint v2.10.2) + +4.0.8 / Mar 01 2019 +=================== + + * add travis build + * lint with jshint + * update dependencies (bindings v1.5.0, async v2.6.2) + * document node 11 support + * add .npmignore and .npmrc + +4.0.7 / Dec 19 2018 +=================== + + * update dependencies (nan v2.12.1, bindings v1.3.1) + +4.0.6 / Nov 18 2018 +=================== + + * fix macOS installation + +4.0.5 / Oct 14 2018 +=================== + + * suppress warnings complaining about casting between incompatible function types (see https://github.com/nodejs/nan/issues/807) + +4.0.4 / Oct 13 2018 +=================== + + * always compile c++ code + +4.0.3 / Oct 13 2018 +=================== + + * fix deprecation warnings on node.js v10.12 (see https://github.com/nodejs/nan/pull/811) + +4.0.2 / Sep 30 2018 +=================== + + * update dependencies (nan v2.11.1, async v2.6.1, lodash v4.17.11) + * adapt to V8 7.0: replace v8Value->Int32Value() with Nan::To(v8Value).FromJust() + * adapt to V8 7.0: replace v8Value->Uint32Value() with Nan::To(v8Value).FromJust() + * adapt to V8 7.0: replace v8Value->BooleanValue() with Nan::To(v8Value).FromJust() + +4.0.1 / Jul 28 2018 +=================== + + * code style + +4.0.0 / Jul 25 2018 +=================== + + * modernize codebase + * drop initial windows support as i can't extend and maintain it + +3.2.0 / Apr 21 2018 +=================== + + * add deviceId and deviceIdSync methods + +3.1.0 / Mar 24 2018 +=================== + + * allow scan address range to be specified + * update dependencies (nan v2.10.0) + +3.0.0 / Feb 25 2018 +=================== + + * update dependencies (nan v2.9.2) + * fix deprecations + * drop support for node.js v0.10, v0.12, v5 and v7 + +2.0.0 / Feb 11 2018 +=================== + + * check parameters passed to api at api surface [#42](https://github.com/fivdi/i2c-bus/issues/42) + * update dependencies (async v2.6.0, lodash 4.17.5) + +1.2.5 / Dec 24 2017 +=================== + + * don't suppress deprecated-declaration warnings + * update dependencies + +1.2.4 / Nov 04 2017 +=================== + + * suppress deprecated-declaration warnings + * document node 9 support + +1.2.3 / Oct 15 2017 +=================== + + * update dependencies (bindings v1.3.0, nan v2.7.0) + +1.2.2 / May 01 2017 +=================== + + * update dependencies + * document supported node versions + * fix writeQuick argument check + +1.2.1 / Feb 12 2017 +=================== + + * documentation for forceAccess option improved + * upgrade to nan v2.5.1 + +1.2.0 / Jan 06 2017 +=================== + + * added forceAccess option which allows access to devices even if they are already in use by a driver + * upgrade to nan v2.5.0, lodash v4.17.4 and async v2.1.4 + +1.1.2 / Oct 05 2016 +=================== + + * allow scan and scanSync to continue scanning on all errors + * upgrade to lodash v4.16.3 and async v2.0.1 + +1.1.1 / Jul 22 2016 +=================== + + * examples SI1145-sync.js and two-devices-win.js added + * nan 2.4.0, lodash 4.13.1, async 2.0.0 + +1.1.0 / May 23 2016 +=================== + + * initial windows support + +1.0.3 / Apr 27 2016 +=================== + + * nan v2.3.2, lodash 4.11.1 + +1.0.2 / Jan 29 2016 +=================== + + * nan 2.2.0, async 1.5.2, lodash 4.1.0 + +1.0.1 / Dec 05 2015 +=================== + + * prevent Nan::ErrnoException related segmentation faults in v0.10.29 + +1.0.0 / Oct 10 2015 +=================== + + * prevent leaking of fds for busy devices [#13](https://github.com/fivdi/i2c-bus/issues/13) + * refactored error objects [#12](https://github.com/fivdi/i2c-bus/issues/12) + * nan 2.1.0 + +0.12.0 / Oct 06 2015 +==================== + + * added scan and scanSync [#11](https://github.com/fivdi/i2c-bus/issues/11) + * nan 2.0.9 + +0.11.3 / Sep 02 2015 +==================== + * nan1 to nan2 migration for iojs v3 + * documented configuration on edison arduino base board + * documented configuration on the pi + +0.11.2 / May 07 2015 +==================== + * io.js v2.0.0+ compatibility [#7](https://github.com/fivdi/i2c-bus/issues/7) + +0.11.1 / Mar 28 2015 +==================== + + * Simplify concurrent asynchronous access to multiple devices [#4](https://github.com/fivdi/i2c-bus/issues/4) + * nan 1.7.0 + +0.11.0 / Feb 01 2015 +==================== + + * added writeBlock and writeBlockSync - UNTESTED and undocumented due to lack of supporting hardware + * added readBlock and readBlockSync - UNTESTED and undocumented due to lack of supporting hardware + +0.10.0 / Jan 24 2015 +==================== + + * added async example + * strerror replaced with strerror_r + * nan 1.5.3 + * added async access to multiple devices concurrently example + +0.9.0 / Dec 22 2014 +=================== + + * callback for writeI2cBlock now gets 3 arguments (err, bytesWritten, buffer) + * added writeQuick and writeQuickSync + * added example i2cquickscan to scan a bus for devices like 'i2cdetect -y -q 1' + * fixed i2cscan example on the pi + +0.8.0 / Dec 19 2014 +=================== + + * added a plain i2c performance test + * added i2cFuncs and i2cFuncsSync + * added an example that does the same as command 'i2cdetect -F 1' + * renamed readBytes to readI2cBlock + * renamed readBytesSync to readI2cBlockSync + * renamed writeBytes to writeI2cBlock + * renamed writeBytesSync to writeI2cBlockSync + * added an example that scans a bus for devices like 'i2cdetect -y -r 1' + +0.7.0 / Dec 16 2014 +=================== + + * faster compile + * added plain i2cRead, i2cReadSync, i2cWrite, and i2cWriteSync methods + +0.6.0 / Dec 15 2014 +=================== + + * use __u8, __u16, and __s32 where appropriate + * added brute force memory leak tests + * added performance tests + * added an example using two devices on the same bus + * renamed all public api methods + +0.5.0 / Dec 14 2014 +=================== + + * added block operations + +0.4.0 / Dec 13 2014 +=================== + + * check for valid arguments in addon methods + * added sync and async tests + +0.3.0 / Dec 13 2014 +=================== + + * improved example + +0.2.0 / Dec 13 2014 +=================== + + * corrected initial release date + * use callbacks rather than events for asychronous open method + * documentation + * return this in synchronous write methods + * added close and closeSync methods + * added example + +0.1.0 / Dec 09 2014 +=================== + + * initial release + diff --git a/node_modules/i2c-bus/LICENSE b/node_modules/i2c-bus/LICENSE new file mode 100644 index 0000000..56b4c7a --- /dev/null +++ b/node_modules/i2c-bus/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 fivdi + +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. diff --git a/node_modules/i2c-bus/README.md b/node_modules/i2c-bus/README.md new file mode 100644 index 0000000..b2dd282 --- /dev/null +++ b/node_modules/i2c-bus/README.md @@ -0,0 +1,796 @@ +[![Build Status](https://app.travis-ci.com/fivdi/i2c-bus.svg?branch=master)](https://app.travis-ci.com/github/fivdi/i2c-bus) +[![Coverage Status](https://coveralls.io/repos/github/fivdi/i2c-bus/badge.svg)](https://coveralls.io/github/fivdi/i2c-bus) +[![npm Version](http://img.shields.io/npm/v/i2c-bus.svg)](https://www.npmjs.com/package/i2c-bus) +[![Downloads Per Month](http://img.shields.io/npm/dm/i2c-bus.svg)](https://www.npmjs.com/package/i2c-bus) +[![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs#hardware) + +# i2c-bus + +I2C serial bus access with **Node.js** on Linux boards like the Raspberry Pi +or BeagleBone. The i2c-bus API supports promises and async/await, asynchronous +callbacks and synchronous execution. + +i2c-bus supports Node.js versions 10, 12, 14, 16, 18 and 20. + +## Contents + + * [Installation](#installation) + * [Usage](#usage) + * [API](#api) + * [TypeScript Type Definitions](#typescript-type-definitions) + + +## Installation + +``` +npm install i2c-bus +``` + +The way in which I2C is configured varies from board to board. Sometimes no +configuraton is required, but sometimes it is: + +* [Configuring I2C on the Raspberry Pi](doc/raspberry-pi-i2c.md) +* [Configuring Software I2C on the Raspberry Pi](doc/raspberry-pi-software-i2c.md) + * Consider software I2C when there are issues communicating with a device on a Raspberry Pi + +## Usage + +The example programs below show how to use a +[MCP9808 I2C temperature sensor](https://www.adafruit.com/product/1782) +to determine the temperature. + +**MCP9808 I2C temperature sensor connected to a Raspberry Pi** +![](example/mcp9808-pi.png) + +### Example 1 - Promises + +Determine the temperature with a MCP9808 I2C temperature sensor using +promises. + +```js +const i2c = require('i2c-bus'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + rawData = (rawData >> 8) + ((rawData & 0xff) << 8); + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +i2c.openPromisified(1). +then(i2c1 => i2c1.readWord(MCP9808_ADDR, TEMP_REG). + then(rawData => console.log(toCelsius(rawData))). + then(_ => i2c1.close()) +).catch(console.log); +``` + +### Example 2 - Promises, Plain I2C and Buffers + +Determine the temperature with a MCP9808 I2C temperature sensor using +promises, plain I2C and Buffer objects. + +```js +const i2c = require('i2c-bus'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +const wbuf = Buffer.from([TEMP_REG]); +const rbuf = Buffer.alloc(2); + +i2c.openPromisified(1). +then(i2c1 => i2c1.i2cWrite(MCP9808_ADDR, wbuf.length, wbuf). + then(_ => i2c1.i2cRead(MCP9808_ADDR, rbuf.length, rbuf)). + then(data => console.log(toCelsius(data.buffer.readUInt16BE()))). + then(_ => i2c1.close()) +).catch(console.log); +``` + +### Example 3 - Asynchronous Callbacks + +Determine the temperature with a MCP9808 I2C temperature sensor using +asynchronous callbacks. + +```js +const i2c = require('i2c-bus'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + rawData = (rawData >> 8) + ((rawData & 0xff) << 8); + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +const i2c1 = i2c.open(1, err => { + if (err) throw err; + + i2c1.readWord(MCP9808_ADDR, TEMP_REG, (err, rawData) => { + if (err) throw err; + + console.log(toCelsius(rawData)); + + i2c1.close(err => { + if (err) throw err; + }); + }); +}); +``` + +### Example 4 - Synchronous Methods + +Determine the temperature with a MCP9808 I2C temperature sensor using +synchronous methods. + +```js +const i2c = require('i2c-bus'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + rawData = (rawData >> 8) + ((rawData & 0xff) << 8); + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +const i2c1 = i2c.openSync(1); +const rawData = i2c1.readWordSync(MCP9808_ADDR, TEMP_REG); +console.log(toCelsius(rawData)); +i2c1.closeSync(); +``` + +## API + + * [Functions](#functions) + * [Class Bus](#class-bus) + * [Class PromisifiedBus](#class-promisifiedbus) + * [Class I2cFuncs](#class-i2cfuncs) + +### Functions + +- [open(busNumber [, options], cb)](#openbusnumber--options-cb) +- [openSync(busNumber [, options])](#opensyncbusnumber--options) +- [openPromisified(busNumber [, options])](#openpromisifiedbusnumber--options) + +### Class Bus + +All methods in class Bus have asynchronous callback and synchronous forms. For +promise support see [class PromisifiedBus](#class-promisifiedbus). + +The asynchronous callback form always take a completion callback as its last +argument. The arguments passed to the completion callback depend on the +method, but the first argument is always reserved for an exception. If the +operation was completed successfully, then the first argument will be null or +undefined. + +When using the synchronous form any exceptions are immediately thrown. You can +use try/catch to handle exceptions or allow them to bubble up. + +- Free resources + - [bus.close(cb)](#busclosecb) + - [bus.closeSync()](#busclosesync) + +- Information + - [bus.i2cFuncs(cb)](#busi2cfuncscb) + - [bus.i2cFuncsSync()](#busi2cfuncssync) + - [bus.scan([startAddr,] [endAddr,] cb)](#busscanstartaddr-endaddr-cb) + - [bus.scanSync([startAddr,] [endAddr])](#busscansyncstartaddr-endaddr) + - [bus.deviceId(addr, cb)](#busdeviceidaddr-cb) + - [bus.deviceIdSync(addr)](#busdeviceidsyncaddr) + +- Plain I2C + - [bus.i2cRead(addr, length, buffer, cb)](#busi2creadaddr-length-buffer-cb) + - [bus.i2cReadSync(addr, length, buffer)](#busi2creadsyncaddr-length-buffer) + - [bus.i2cWrite(addr, length, buffer, cb)](#busi2cwriteaddr-length-buffer-cb) + - [bus.i2cWriteSync(addr, length, buffer)](#busi2cwritesyncaddr-length-buffer) + +- SMBus + - [bus.readByte(addr, cmd, cb)](#busreadbyteaddr-cmd-cb) + - [bus.readByteSync(addr, cmd)](#busreadbytesyncaddr-cmd) + - [bus.readWord(addr, cmd, cb)](#busreadwordaddr-cmd-cb) + - [bus.readWordSync(addr, cmd)](#busreadwordsyncaddr-cmd) + - [bus.readI2cBlock(addr, cmd, length, buffer, cb)](#busreadi2cblockaddr-cmd-length-buffer-cb) + - [bus.readI2cBlockSync(addr, cmd, length, buffer)](#busreadi2cblocksyncaddr-cmd-length-buffer) + - [bus.receiveByte(addr, cb)](#busreceivebyteaddr-cb) + - [bus.receiveByteSync(addr)](#busreceivebytesyncaddr) + - [bus.sendByte(addr, byte, cb)](#bussendbyteaddr-byte-cb) + - [bus.sendByteSync(addr, byte)](#bussendbytesyncaddr-byte) + - [bus.writeByte(addr, cmd, byte, cb)](#buswritebyteaddr-cmd-byte-cb) + - [bus.writeByteSync(addr, cmd, byte)](#buswritebytesyncaddr-cmd-byte) + - [bus.writeWord(addr, cmd, word, cb)](#buswritewordaddr-cmd-word-cb) + - [bus.writeWordSync(addr, cmd, word)](#buswritewordsyncaddr-cmd-word) + - [bus.writeQuick(addr, bit, cb)](#buswritequickaddr-bit-cb) + - [bus.writeQuickSync(addr, bit)](#buswritequicksyncaddr-bit) + - [bus.writeI2cBlock(addr, cmd, length, buffer, cb)](#buswritei2cblockaddr-cmd-length-buffer-cb) + - [bus.writeI2cBlockSync(addr, cmd, length, buffer)](#buswritei2cblocksyncaddr-cmd-length-buffer) + +- Promises + - [bus.promisifiedBus()](#buspromisifiedbus) + +### Class PromisifiedBus + +All methods in class PromisifiedBus have the asynchronous promise form. For +asynchronous callback and synchronous forms see [class Bus](#class-bus). + +- Free resources + - [promisifiedBus.close()](#promisifiedbusclose) + +- Information + - [promisifiedBus.i2cFuncs()](#promisifiedbusi2cfuncs) + - [promisifiedBus.scan([startAddr,] [endAddr])](#promisifiedbusscanstartaddr-endaddr) + - [promisifiedBus.deviceId(addr)](#promisifiedbusdeviceidaddr) + +- Plain I2C + - [promisifiedBus.i2cRead(addr, length, buffer)](#promisifiedbusi2creadaddr-length-buffer) + - [promisifiedBus.i2cWrite(addr, length, buffer)](#promisifiedbusi2cwriteaddr-length-buffer) + +- SMBus + - [promisifiedBus.readByte(addr, cmd)](#promisifiedbusreadbyteaddr-cmd) + - [promisifiedBus.readWord(addr, cmd)](#promisifiedbusreadwordaddr-cmd) + - [promisifiedBus.readI2cBlock(addr, cmd, length, buffer)](#promisifiedbusreadi2cblockaddr-cmd-length-buffer) + - [promisifiedBus.receiveByte(addr)](#promisifiedbusreceivebyteaddr) + - [promisifiedBus.sendByte(addr, byte)](#promisifiedbussendbyteaddr-byte) + - [promisifiedBus.writeByte(addr, cmd, byte)](#promisifiedbuswritebyteaddr-cmd-byte) + - [promisifiedBus.writeWord(addr, cmd, word)](#promisifiedbuswritewordaddr-cmd-word) + - [promisifiedBus.writeQuick(addr, bit)](#promisifiedbuswritequickaddr-bit) + - [promisifiedBus.writeI2cBlock(addr, cmd, length, buffer)](#promisifiedbuswritei2cblockaddr-cmd-length-buffer) + +- Asynchronous callbacks and synchronous execution + - [promisifiedBus.bus()](#promisifiedbusbus) + +### Class I2cFuncs + +- [funcs.i2c](#funcsi2c---boolean) +- [funcs.tenBitAddr](#funcstenbitaddr---boolean) +- [funcs.protocolMangling](#funcsprotocolmangling---boolean) +- [funcs.smbusPec](#funcssmbuspec---boolean) +- [funcs.smbusBlockProcCall](#funcssmbusblockproccall---boolean) +- [funcs.smbusQuick](#funcssmbusquick---boolean) +- [funcs.smbusReceiveByte](#funcssmbusreceivebyte---boolean) +- [funcs.smbusSendByte](#funcssmbussendbyte---boolean) +- [funcs.smbusReadByte](#funcssmbusreadbyte---boolean) +- [funcs.smbusWriteByte](#funcssmbuswritebyte---boolean) +- [funcs.smbusReadWord](#funcssmbusreadword---boolean) +- [funcs.smbusWriteWord](#funcssmbuswriteword---boolean) +- [funcs.smbusProcCall](#funcssmbusproccall---boolean) +- [funcs.smbusReadBlock](#funcssmbusreadblock---boolean) +- [funcs.smbusWriteBlock](#funcssmbuswriteblock---boolean) +- [funcs.smbusReadI2cBlock](#funcssmbusreadi2cblock---boolean) +- [funcs.smbusWriteI2cBlock](#funcssmbuswritei2cblock---boolean) + +### open(busNumber [, options], cb) +- busNumber - the number of the I2C bus/adapter to open, 0 for /dev/i2c-0, 1 for /dev/i2c-1, ... +- options - an optional options object +- cb - completion callback + +Asynchronous open. Returns a new Bus object. The callback gets one argument (err). + +The following options are supported: +- forceAccess - A boolean value specifying whether access to devices on the +I2C bus should be allowed even if they are already in use by a kernel +driver/module. Corresponds to I2C_SLAVE_FORCE on Linux. The valid values for +forceAccess are true and false. Optional, the default value is false. + +### openSync(busNumber [, options]) +- busNumber - the number of the I2C bus/adapter to open, 0 for /dev/i2c-0, 1 for /dev/i2c-1, ... +- options - an optional options object + +Synchronous open. Returns a new Bus object. + +The following options are supported: +- forceAccess - A boolean value specifying whether access to devices on the +I2C bus should be allowed even if they are already in use by a kernel +driver/module. Corresponds to I2C_SLAVE_FORCE on Linux. The valid values for +forceAccess are true and false. Optional, the default value is false. + +### openPromisified(busNumber [, options]) +- busNumber - the number of the I2C bus/adapter to open, 0 for /dev/i2c-0, 1 for /dev/i2c-1, ... +- options - an optional options object + +Asynchronous open. Returns a Promise that, when resolved, yields a PromisifiedBus object. + +The following options are supported: +- forceAccess - A boolean value specifying whether access to devices on the +I2C bus should be allowed even if they are already in use by a kernel +driver/module. Corresponds to I2C_SLAVE_FORCE on Linux. The valid values for +forceAccess are true and false. Optional, the default value is false. + +### bus.close(cb) +- cb - completion callback + +Asynchronous close. Frees system resources used by this instance. The callback +gets one argument (err). + +### bus.closeSync() + +Synchronous close. Frees system resources used by this instance. + +### bus.i2cFuncs(cb) +- cb - completion callback + +Determine functionality of the bus/adapter asynchronously. The callback gets +two argument (err, funcs). funcs is a frozen +[I2cFuncs](#class-i2cfuncs) +object describing the functionality available. +See also [I2C functionality](https://www.kernel.org/doc/Documentation/i2c/functionality). + +### bus.i2cFuncsSync() + +Determine functionality of the bus/adapter Synchronously. Returns a frozen +[I2cFuncs](#class-i2cfuncs) +object describing the functionality available. +See also [I2C functionality](https://www.kernel.org/doc/Documentation/i2c/functionality). + +### bus.scan([startAddr,] [endAddr,] cb) +- startAddr - an integer specifying the start address of the scan range, optional +- endAddr - an integer specifying the end addrerss of the scan range, optional +- cb - completion callback + +bus.scan(cb) - scan for I2C devices in address range 0x03 through 0x77
+bus.scan(addr, cb) - scan for an I2C device at address addr
+bus.scan(startAddr, endAddr, cb) - scan for I2C devices in address range startAddr through endAddr
+ +Scans the I2C bus asynchronously for devices. The default address range 0x03 +through 0x77 is the same as the default address range used by the `i2cdetect` +command line tool. The callback gets two arguments (err, devices). devices is +an array of numbers where each number represents the I2C address of a device +which was detected. + +### bus.scanSync([startAddr,] [endAddr]) +- startAddr - an integer specifying the start address of the scan range, optional +- endAddr - an integer specifying the end addrerss of the scan range, optional + +bus.scan() - scan for I2C devices in address range 0x03 through 0x77
+bus.scan(addr) - scan for an I2C device at address addr
+bus.scan(startAddr, endAddr) - scan for I2C devices in address range startAddr through endAddr
+ +Scans the I2C bus synchronously for devices. The default address range 0x03 +through 0x77 is the same as the default address range used by the `i2cdetect` +command line tool. Returns an array of numbers where each number represents +the I2C address of a device which was detected. + +### bus.deviceId(addr, cb) +- addr - I2C device address +- cb - completion callback + +Asynchronous I2C device Id. The callback gets two arguments (err, id). id is +an object with the properties `manufacturer`, `product` and if known a human +readable `name` for the associated manufacturer. `manufacturer` and `product` +are numbers, `name` is a string. + +### bus.deviceIdSync(addr) +- addr - I2C device address + +Synchronous I2C device Id. Returns an object with the properties +`manufacturer`, `product` and if known a human readable `name` for the +associated manufacturer. `manufacturer` and `product` are numbers, `name` is a +string. + +### bus.i2cRead(addr, length, buffer, cb) +- addr - I2C device address +- length - an integer specifying the number of bytes to read +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance that the data will be written to (must conatin at least length bytes) +- cb - completion callback + +Asynchronous plain I2C read. The callback gets three argument (err, bytesRead, buffer). +bytesRead is the number of bytes read. + +### bus.i2cReadSync(addr, length, buffer) +- addr - I2C device address +- length - an integer specifying the number of bytes to read +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance that the data will be written to (must conatin at least length bytes) + +Synchronous plain I2C read. Returns the number of bytes read. + +### bus.i2cWrite(addr, length, buffer, cb) +- addr - I2C device address +- length - an integer specifying the number of bytes to write +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance containing the data to write (must conatin at least length bytes) +- cb - completion callback + +Asynchronous plain I2C write. The callback gets three argument (err, bytesWritten, buffer). +bytesWritten is the number of bytes written. + +### bus.i2cWriteSync(addr, length, buffer) +- addr - I2C device address +- length - an integer specifying the number of bytes to write +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) instance +containing the data to write (must conatin at least length bytes) + +Synchronous plain I2C write. Returns the number of bytes written. + +### bus.readByte(addr, cmd, cb) +- addr - I2C device address +- cmd - command code +- cb - completion callback + +Asynchronous SMBus read byte. The callback gets two arguments (err, byte). +byte is an unsigned integer in the range 0 to 255. + +### bus.readByteSync(addr, cmd) +- addr - I2C device address +- cmd - command code + +Synchronous SMBus read byte. Returns the byte read. byte is an unsigned +integer in the range 0 to 255. + +### bus.readWord(addr, cmd, cb) +- addr - I2C device address +- cmd - command code +- cb - completion callback + +Asynchronous SMBus read word. The callback gets two arguments (err, word). +word is an unsigned integer in the range 0 to 65535. + +### bus.readWordSync(addr, cmd) +- addr - I2C device address +- cmd - command code + +Synchronous SMBus read word. Returns the word read. word is an unsigned +integer in the range 0 to 65535. + +### bus.readI2cBlock(addr, cmd, length, buffer, cb) +- addr - I2C device address +- cmd - command code +- length - an integer specifying the number of bytes to read (max 32) +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance that the data will be written to (must conatin at least length bytes) +- cb - completion callback + +Asynchronous I2C block read (not defined by the SMBus specification). Reads a +block of bytes from a device, from a designated register that is specified by +cmd. The callback gets three arguments (err, bytesRead, buffer). bytesRead is +the number of bytes read. + +### bus.readI2cBlockSync(addr, cmd, length, buffer) +- addr - I2C device address +- cmd - command code +- length - an integer specifying the number of bytes to read (max 32) +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance that the data will be written to (must conatin at least length bytes) + +Synchronous I2C block read (not defined by the SMBus specification). Reads a +block of bytes from a device, from a designated register that is specified by +cmd. Returns the number of bytes read. + +### bus.receiveByte(addr, cb) +- addr - I2C device address +- cb - completion callback + +Asynchronous SMBus receive byte. The callback gets two arguments (err, byte). +byte is an unsigned integer in the range 0 to 255. + +### bus.receiveByteSync(addr) +- addr - I2C device address + +Synchronous SMBus receive byte. Returns the byte received. byte is an unsigned +integer in the range 0 to 255. + +### bus.sendByte(addr, byte, cb) +- addr - I2C device address +- byte - data byte. byte is an unsigned integer in the range 0 to 255. +- cb - completion callback + +Asynchronous SMBus send byte. The callback gets one argument (err). + +### bus.sendByteSync(addr, byte) +- addr - I2C device address +- byte - data byte. byte is an unsigned integer in the range 0 to 255. + +Synchronous SMBus send byte. + +### bus.writeByte(addr, cmd, byte, cb) +- addr - I2C device address +- cmd - command code +- byte - data byte. byte is an unsigned integer in the range 0 to 255. +- cb - completion callback + +Asynchronous SMBus write byte. The callback gets one argument (err). + +### bus.writeByteSync(addr, cmd, byte) +- addr - I2C device address +- cmd - command code +- byte - data byte. byte is an unsigned integer in the range 0 to 255. + +Synchronous SMBus write byte. + +### bus.writeWord(addr, cmd, word, cb) +- addr - I2C device address +- cmd - command code +- word - data word. word is an unsigned integer in the range 0 to 65535. +- cb - completion callback + +Asynchronous SMBus write word. The callback gets one argument (err). + +### bus.writeWordSync(addr, cmd, word) +- addr - I2C device address +- cmd - command code +- word - data word. word is an unsigned integer in the range 0 to 65535. + +Synchronous SMBus write word. + +### bus.writeQuick(addr, bit, cb) +- addr - I2C device address +- bit - bit to write (0 or 1) +- cb - completion callback + +Asynchronous SMBus quick command. Writes a single bit to the device. +The callback gets one argument (err). + +### bus.writeQuickSync(addr, bit) +- addr - I2C device address +- bit - bit to write (0 or 1) + +Synchronous SMBus quick command. Writes a single bit to the device. + +### bus.writeI2cBlock(addr, cmd, length, buffer, cb) +- addr - I2C device address +- cmd - command code +- length - an integer specifying the number of bytes to write (max 32) +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance containing the data to write (must conatin at least length bytes) +- cb - completion callback + +Asynchronous I2C block write (not defined by the SMBus specification). Writes a +block of bytes to a device, to a designated register that is specified by cmd. +The callback gets three argument (err, bytesWritten, buffer). bytesWritten is +the number of bytes written. + +### bus.writeI2cBlockSync(addr, cmd, length, buffer) +- addr - I2C device address +- cmd - command code +- length - an integer specifying the number of bytes to write (max 32) +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance containing the data to write (must conatin at least length bytes) + +Synchronous I2C block write (not defined by the SMBus specification). Writes a +block of bytes to a device, to a designated register that is specified by cmd. + +### bus.promisifiedBus() +Return the PromisifiedBus instance for this Bus instance. + +### promisifiedBus.close() + +Asynchronous close. Returns a Promise that will be resolved with no arguments +once the underlying resources have been released, or will be rejected if an +error occurs while closing. + +### promisifiedBus.i2cFuncs() + +Determine functionality of the bus/adapter asynchronously. Returns a Promise +that on success will be resolved with a frozen [I2cFuncs](#class-i2cfuncs) +object describing the functionality available. The returned Promise will be +rejected if an error occurs. +See also [I2C functionality](https://www.kernel.org/doc/Documentation/i2c/functionality). + +### promisifiedBus.scan([startAddr,] [endAddr]) +- startAddr - an integer specifying the start address of the scan range, optional +- endAddr - an integer specifying the end addrerss of the scan range, optional + +bus.scan() - scan for I2C devices in address range 0x03 through 0x77
+bus.scan(addr) - scan for an I2C device at address addr
+bus.scan(startAddr, endAddr) - scan for I2C devices in address range startAddr through endAddr
+ +Scans the I2C bus asynchronously for devices. The default address range 0x03 +through 0x77 is the same as the default address range used by the `i2cdetect` +command line tool. Returns a Promise that on success will be resolved with an +array of numbers where each number represents the I2C address of a device +which was detected. The returned Promise will be rejected if an error occurs. + +### promisifiedBus.deviceId(addr) +- addr - I2C device address + +Asynchronous I2C device Id. Returns a Promise that will be resolved with an id +object on success, or will be rejected if an error occurs. id is an object +with the properties `manufacturer`, `product` and if known a human readable +`name` for the associated manufacturer. `manufacturer` and `product` are +numbers, `name` is a string. + +### promisifiedBus.i2cRead(addr, length, buffer) +- addr - I2C device address +- length - an integer specifying the number of bytes to read +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance that the data will be written to (must conatin at least length bytes) + +Asynchronous plain I2C read. Returns a Promise that on success will be +resolved with an object with a bytesRead property identifying the number of +bytes read, and a buffer property that is a reference to the passed in buffer +argument. The returned Promise will be rejected if an error occurs. + +### promisifiedBus.i2cWrite(addr, length, buffer) +- addr - I2C device address +- length - an integer specifying the number of bytes to write +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance containing the data to write (must conatin at least length bytes) + +Asynchronous plain I2C write. Returns a Promise that on success will be +resolved with an object with a bytesWritten property identifying the number of +bytes written, and a buffer property that is a reference to the passed in +buffer argument. The returned promise will be rejected if an error occurs. + +### promisifiedBus.readByte(addr, cmd) +- addr - I2C device address +- cmd - command code + +Asynchronous SMBus read byte. Returns a Promise that will be resolved with a +number representing the byte read on success, or will be rejected if an error +occurs. byte is an unsigned integer in the range 0 to 255. + +### promisifiedBus.readWord(addr, cmd) +- addr - I2C device address +- cmd - command code + +Asynchronous SMBus read word. Returns a Promise that will be resolved with a +number representing the word read on success, or will be rejected if an error +occurs. word is an unsigned integer in the range 0 to 65535. + +### promisifiedBus.readI2cBlock(addr, cmd, length, buffer) +- addr - I2C device address +- cmd - command code +- length - an integer specifying the number of bytes to read (max 32) +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance that the data will be written to (must conatin at least length bytes) + +Asynchronous I2C block read (not defined by the SMBus specification). Reads a +block of bytes from a device, from a designated register that is specified by +cmd. Returns a Promise that on success will be resolved with an object with a +bytesRead property identifying the number of bytes read, and a buffer property +that is a reference to the passed in buffer argument. The returned Promise +will be rejected if an error occurs. + +### promisifiedBus.receiveByte(addr) +- addr - I2C device address + +Asynchronous SMBus receive byte. Returns a Promise that will be resolved with +a number representing the byte received on success, or will be rejected if an +error occurs. byte is an unsigned integer in the range 0 to 255. + +### promisifiedBus.sendByte(addr, byte) +- addr - I2C device address +- byte - data byte. byte is an unsigned integer in the range 0 to 255. + +Asynchronous SMBus send byte. Returns a Promise that will be resolved with no +arguments on success, or will be rejected if an error occurs. + +### promisifiedBus.writeByte(addr, cmd, byte) +- addr - I2C device address +- cmd - command code +- byte - data byte. byte is an unsigned integer in the range 0 to 255. + +Asynchronous SMBus write byte. Returns a Promise that will be resolved with no +arguments on success, or will be rejected if an error occurs. + +### promisifiedBus.writeWord(addr, cmd, word) +- addr - I2C device address +- cmd - command code +- word - data word. word is an unsigned integer in the range 0 to 65535. + +Asynchronous SMBus write word. Returns a Promise that will be resolved with no +arguments on success, or will be rejected if an error occurs. + +### promisifiedBus.writeQuick(addr, bit) +- addr - I2C device address +- bit - bit to write (0 or 1) + +Asynchronous SMBus quick command. Writes a single bit to the device. Returns a +Promise that will be resolved with no arguments on success, or will be +rejected if an error occurs. + +### promisifiedBus.writeI2cBlock(addr, cmd, length, buffer) +- addr - I2C device address +- cmd - command code +- length - an integer specifying the number of bytes to write (max 32) +- buffer - the [Buffer](https://nodejs.org/dist/latest/docs/api/buffer.html) +instance containing the data to write (must conatin at least length bytes) + +Asynchronous I2C block write (not defined by the SMBus specification). Writes a +block of bytes to a device, to a designated register that is specified by cmd. +Returns a Promise that on success will be resolved with an object with a +bytesWritten property identifying the number of bytes written, and a buffer +property that is a reference to the passed in buffer argument. The returned +promise will be rejected if an error occurs. + +### promisifiedBus.bus() +Return the Bus instance for this PromisifiedBus instance. + +### funcs.i2c - boolean +Specifies whether or not the adapter handles plain I2C-level commands (Pure +SMBus adapters typically can not do these, +I2C_FUNC_I2C). + +### funcs.tenBitAddr - boolean +Specifies whether or not the adapter handles the 10-bit address extensions +(I2C_FUNC_10BIT_ADDR). + +### funcs.protocolMangling - boolean +Specifies whether or not the adapter knows about the I2C_M_IGNORE_NAK, +I2C_M_REV_DIR_ADDR and I2C_M_NO_RD_ACK flags (which modify the I2C protocol! +I2C_FUNC_PROTOCOL_MANGLING). + +### funcs.smbusPec - boolean +Specifies whether or not the adapter handles packet error checking +(I2C_FUNC_SMBUS_PEC). + +### funcs.smbusBlockProcCall - boolean +Specifies whether or not the adapter handles the SMBus block process call +command +(I2C_FUNC_SMBUS_BLOCK_PROC_CALL). + +### funcs.smbusQuick - boolean +Specifies whether or not the adapter handles the SMBus quick command +(I2C_FUNC_SMBUS_QUICK). + +### funcs.smbusReceiveByte - boolean +Specifies whether or not the adapter handles the SMBus receive byte command +(I2C_FUNC_SMBUS_READ_BYTE). + +### funcs.smbusSendByte - boolean +Specifies whether or not the adapter handles the SMBus send byte command +(I2C_FUNC_SMBUS_WRITE_BYTE). + +### funcs.smbusReadByte - boolean +Specifies whether or not the adapter handles the SMBus read byte command +(I2C_FUNC_SMBUS_READ_BYTE_DATA). + +### funcs.smbusWriteByte - boolean +Specifies whether or not the adapter handles the SMBus write byte command +(I2C_FUNC_SMBUS_WRITE_BYTE_DATA). + +### funcs.smbusReadWord - boolean +Specifies whether or not the adapter handles the SMBus read word command +(I2C_FUNC_SMBUS_READ_WORD_DATA). + +### funcs.smbusWriteWord - boolean +Specifies whether or not the adapter handles the SMBus write word command +(I2C_FUNC_SMBUS_WRITE_WORD_DATA). + +### funcs.smbusProcCall - boolean +Specifies whether or not the adapter handles the SMBus process call command +(I2C_FUNC_SMBUS_PROC_CALL). + +### funcs.smbusReadBlock - boolean +Specifies whether or not the adapter handles the SMBus read block command +(I2C_FUNC_SMBUS_READ_BLOCK_DATA). + +### funcs.smbusWriteBlock - boolean +Specifies whether or not the adapter handles the SMBus write block command +(I2C_FUNC_SMBUS_WRITE_BLOCK_DATA). + +### funcs.smbusReadI2cBlock - boolean +Specifies whether or not the adapter handles the SMBus read I2C block command +(I2C_FUNC_SMBUS_READ_I2C_BLOCK). + +### funcs.smbusWriteI2cBlock - boolean +Specifies whether or not the adapter handles the SMBus write i2c block command +(I2C_FUNC_SMBUS_WRITE_I2C_BLOCK). + +## TypeScript Type Definitions + +TypeScript type definitions for i2c-bus can be found in the Definitely Typed +repository at +https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/i2c-bus. + diff --git a/node_modules/i2c-bus/binding.gyp b/node_modules/i2c-bus/binding.gyp new file mode 100644 index 0000000..b5c6baf --- /dev/null +++ b/node_modules/i2c-bus/binding.gyp @@ -0,0 +1,24 @@ +{ + "targets": [{ + "target_name": "i2c", + "include_dirs" : [ + "> $(depfile) +# Add extra rules as in (2). +# We remove slashes and replace spaces with new lines; +# remove blank lines; +# delete the first line and append a colon to the remaining lines. +sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\ + grep -v '^$$' |\ + sed -e 1d -e 's|$$|:|' \ + >> $(depfile) +rm $(depfile).raw +endef + +# Command definitions: +# - cmd_foo is the actual command to run; +# - quiet_cmd_foo is the brief-output summary of the command. + +quiet_cmd_cc = CC($(TOOLSET)) $@ +cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c + +quiet_cmd_cxx = CXX($(TOOLSET)) $@ +cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c + +quiet_cmd_touch = TOUCH $@ +cmd_touch = touch $@ + +quiet_cmd_copy = COPY $@ +# send stderr to /dev/null to ignore messages when linking directories. +cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@") + +quiet_cmd_symlink = SYMLINK $@ +cmd_symlink = ln -sf "$<" "$@" + +quiet_cmd_alink = AR($(TOOLSET)) $@ +cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^) + +quiet_cmd_alink_thin = AR($(TOOLSET)) $@ +cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^) + +# Due to circular dependencies between libraries :(, we wrap the +# special "figure out circular dependencies" flags around the entire +# input list during linking. +quiet_cmd_link = LINK($(TOOLSET)) $@ +cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group + +# Note: this does not handle spaces in paths +define xargs + $(1) $(word 1,$(2)) +$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2)))) +endef + +define write-to-file + @: >$(1) +$(call xargs,@printf "%s\n" >>$(1),$(2)) +endef + +OBJ_FILE_LIST := ar-file-list + +define create_archive + rm -f $(1) $(1).$(OBJ_FILE_LIST); mkdir -p `dirname $(1)` + $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) + $(AR.$(TOOLSET)) crs $(1) @$(1).$(OBJ_FILE_LIST) +endef + +define create_thin_archive + rm -f $(1) $(OBJ_FILE_LIST); mkdir -p `dirname $(1)` + $(call write-to-file,$(1).$(OBJ_FILE_LIST),$(filter %.o,$(2))) + $(AR.$(TOOLSET)) crsT $(1) @$(1).$(OBJ_FILE_LIST) +endef + +# We support two kinds of shared objects (.so): +# 1) shared_library, which is just bundling together many dependent libraries +# into a link line. +# 2) loadable_module, which is generating a module intended for dlopen(). +# +# They differ only slightly: +# In the former case, we want to package all dependent code into the .so. +# In the latter case, we want to package just the API exposed by the +# outermost module. +# This means shared_library uses --whole-archive, while loadable_module doesn't. +# (Note that --whole-archive is incompatible with the --start-group used in +# normal linking.) + +# Other shared-object link notes: +# - Set SONAME to the library filename so our binaries don't reference +# the local, absolute paths used on the link command-line. +quiet_cmd_solink = SOLINK($(TOOLSET)) $@ +cmd_solink = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS) + +quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@ +cmd_solink_module = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS) + + +# Define an escape_quotes function to escape single quotes. +# This allows us to handle quotes properly as long as we always use +# use single quotes and escape_quotes. +escape_quotes = $(subst ','\'',$(1)) +# This comment is here just to include a ' to unconfuse syntax highlighting. +# Define an escape_vars function to escape '$' variable syntax. +# This allows us to read/write command lines with shell variables (e.g. +# $LD_LIBRARY_PATH), without triggering make substitution. +escape_vars = $(subst $$,$$$$,$(1)) +# Helper that expands to a shell command to echo a string exactly as it is in +# make. This uses printf instead of echo because printf's behaviour with respect +# to escape sequences is more portable than echo's across different shells +# (e.g., dash, bash). +exact_echo = printf '%s\n' '$(call escape_quotes,$(1))' + +# Helper to compare the command we're about to run against the command +# we logged the last time we ran the command. Produces an empty +# string (false) when the commands match. +# Tricky point: Make has no string-equality test function. +# The kernel uses the following, but it seems like it would have false +# positives, where one string reordered its arguments. +# arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \ +# $(filter-out $(cmd_$@), $(cmd_$(1)))) +# We instead substitute each for the empty string into the other, and +# say they're equal if both substitutions produce the empty string. +# .d files contain ? instead of spaces, take that into account. +command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\ + $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1)))) + +# Helper that is non-empty when a prerequisite changes. +# Normally make does this implicitly, but we force rules to always run +# so we can check their command lines. +# $? -- new prerequisites +# $| -- order-only dependencies +prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?)) + +# Helper that executes all postbuilds until one fails. +define do_postbuilds + @E=0;\ + for p in $(POSTBUILDS); do\ + eval $$p;\ + E=$$?;\ + if [ $$E -ne 0 ]; then\ + break;\ + fi;\ + done;\ + if [ $$E -ne 0 ]; then\ + rm -rf "$@";\ + exit $$E;\ + fi +endef + +# do_cmd: run a command via the above cmd_foo names, if necessary. +# Should always run for a given target to handle command-line changes. +# Second argument, if non-zero, makes it do asm/C/C++ dependency munging. +# Third argument, if non-zero, makes it do POSTBUILDS processing. +# Note: We intentionally do NOT call dirx for depfile, since it contains ? for +# spaces already and dirx strips the ? characters. +define do_cmd +$(if $(or $(command_changed),$(prereq_changed)), + @$(call exact_echo, $($(quiet)cmd_$(1))) + @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))" + $(if $(findstring flock,$(word 1,$(cmd_$1))), + @$(cmd_$(1)) + @echo " $(quiet_cmd_$(1)): Finished", + @$(cmd_$(1)) + ) + @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile) + @$(if $(2),$(fixup_dep)) + $(if $(and $(3), $(POSTBUILDS)), + $(call do_postbuilds) + ) +) +endef + +# Declare the "all" target first so it is the default, +# even though we don't have the deps yet. +.PHONY: all +all: + +# make looks for ways to re-generate included makefiles, but in our case, we +# don't have a direct way. Explicitly telling make that it has nothing to do +# for them makes it go faster. +%.d: ; + +# Use FORCE_DO_CMD to force a target to run. Should be coupled with +# do_cmd. +.PHONY: FORCE_DO_CMD +FORCE_DO_CMD: + +TOOLSET := target +# Suffix rules, putting all outputs into $(obj). +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(srcdir)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +# Try building from generated source, too. +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj).$(TOOLSET)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + +$(obj).$(TOOLSET)/%.o: $(obj)/%.c FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cc FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cpp FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.cxx FORCE_DO_CMD + @$(call do_cmd,cxx,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.s FORCE_DO_CMD + @$(call do_cmd,cc,1) +$(obj).$(TOOLSET)/%.o: $(obj)/%.S FORCE_DO_CMD + @$(call do_cmd,cc,1) + + +ifeq ($(strip $(foreach prefix,$(NO_LOAD),\ + $(findstring $(join ^,$(prefix)),\ + $(join ^,i2c.target.mk)))),) + include i2c.target.mk +endif + +quiet_cmd_regen_makefile = ACTION Regenerating $@ +cmd_regen_makefile = cd $(srcdir); /home/boazsender/.volta/tools/image/node/22.14.0/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/home/boazsender/.cache/node-gyp/22.14.0" "-Dnode_gyp_dir=/home/boazsender/.volta/tools/image/node/22.14.0/lib/node_modules/npm/node_modules/node-gyp" "-Dnode_lib_file=/home/boazsender/.cache/node-gyp/22.14.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/home/boazsender/git/portal/node_modules/i2c-bus" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/home/boazsender/git/portal/node_modules/i2c-bus/build/config.gypi -I/home/boazsender/.volta/tools/image/node/22.14.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi -I/home/boazsender/.cache/node-gyp/22.14.0/include/node/common.gypi "--toplevel-dir=." binding.gyp +Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../../.volta/tools/image/node/22.14.0/lib/node_modules/npm/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/../../../../.cache/node-gyp/22.14.0/include/node/common.gypi + $(call do_cmd,regen_makefile) + +# "all" is a concatenation of the "all" targets from all the included +# sub-makefiles. This is just here to clarify. +all: + +# Add in dependency-tracking rules. $(all_deps) is the list of every single +# target in our tree. Only consider the ones with .d (dependency) info: +d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d)) +ifneq ($(d_files),) + include $(d_files) +endif diff --git a/node_modules/i2c-bus/build/Release/.deps/Release/i2c.node.d b/node_modules/i2c-bus/build/Release/.deps/Release/i2c.node.d new file mode 100644 index 0000000..1c269e6 --- /dev/null +++ b/node_modules/i2c-bus/build/Release/.deps/Release/i2c.node.d @@ -0,0 +1 @@ +cmd_Release/i2c.node := ln -f "Release/obj.target/i2c.node" "Release/i2c.node" 2>/dev/null || (rm -rf "Release/i2c.node" && cp -af "Release/obj.target/i2c.node" "Release/i2c.node") diff --git a/node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c.node.d b/node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c.node.d new file mode 100644 index 0000000..c82a469 --- /dev/null +++ b/node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c.node.d @@ -0,0 +1 @@ +cmd_Release/obj.target/i2c.node := g++ -o Release/obj.target/i2c.node -shared -pthread -rdynamic -m64 -Wl,-soname=i2c.node -Wl,--start-group Release/obj.target/i2c/src/i2c.o -Wl,--end-group diff --git a/node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c/src/i2c.o.d b/node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c/src/i2c.o.d new file mode 100644 index 0000000..708f219 --- /dev/null +++ b/node_modules/i2c-bus/build/Release/.deps/Release/obj.target/i2c/src/i2c.o.d @@ -0,0 +1,221 @@ +cmd_Release/obj.target/i2c/src/i2c.o := g++ -o Release/obj.target/i2c/src/i2c.o ../src/i2c.cc '-DNODE_GYP_MODULE_NAME=i2c' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-D__STDC_FORMAT_MACROS' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' -I/home/boazsender/.cache/node-gyp/22.14.0/include/node -I/home/boazsender/.cache/node-gyp/22.14.0/src -I/home/boazsender/.cache/node-gyp/22.14.0/deps/openssl/config -I/home/boazsender/.cache/node-gyp/22.14.0/deps/openssl/openssl/include -I/home/boazsender/.cache/node-gyp/22.14.0/deps/uv/include -I/home/boazsender/.cache/node-gyp/22.14.0/deps/zlib -I/home/boazsender/.cache/node-gyp/22.14.0/deps/v8/include -I../../nan -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -Wno-deprecated-declarations -Wno-cast-function-type -m64 -O3 -fno-omit-frame-pointer -fno-rtti -fno-exceptions -fno-strict-aliasing -std=gnu++17 -MMD -MF ./Release/.deps/Release/obj.target/i2c/src/i2c.o.d.raw -c +Release/obj.target/i2c/src/i2c.o: ../src/i2c.cc \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/cppgc/common.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8config.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-array-buffer.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-local-handle.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-handle-base.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-internal.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8config.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-object.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-maybe.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-persistent-handle.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-weak-callback-info.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-primitive.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-data.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-value.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-traced-handle.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-container.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-context.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-snapshot.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-isolate.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-callbacks.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-promise.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-debug.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-script.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-memory-span.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-message.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-embedder-heap.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-function-callback.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-microtask.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-statistics.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-unwinder.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-embedder-state-scope.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-date.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-exception.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-extension.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-external.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-function.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-template.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-initialization.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-platform.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-source-location.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-json.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-locker.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-microtask-queue.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-primitive-object.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-proxy.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-regexp.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-typed-array.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-value-serializer.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-version.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-wasm.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node_version.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node_api.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/js_native_api.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/js_native_api_types.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node_api_types.h \ + ../../nan/nan.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node_version.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/uv.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/errno.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/version.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/unix.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/threadpool.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/linux.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node_buffer.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node.h \ + /home/boazsender/.cache/node-gyp/22.14.0/include/node/node_object_wrap.h \ + ../../nan/nan_callbacks.h ../../nan/nan_callbacks_12_inl.h \ + ../../nan/nan_maybe_43_inl.h ../../nan/nan_converters.h \ + ../../nan/nan_converters_43_inl.h ../../nan/nan_new.h \ + ../../nan/nan_implementation_12_inl.h ../../nan/nan_persistent_12_inl.h \ + ../../nan/nan_weak.h ../../nan/nan_object_wrap.h ../../nan/nan_private.h \ + ../../nan/nan_typedarray_contents.h ../../nan/nan_json.h \ + ../../nan/nan_scriptorigin.h ../src/./i2cfuncs.h ../src/./deviceid.h \ + ../src/./readbyte.h ../src/./readword.h ../src/./readblock.h \ + ../src/./readi2cblock.h ../src/./receivebyte.h ../src/./sendbyte.h \ + ../src/./setaddr.h ../src/./writebyte.h ../src/./writeword.h \ + ../src/./writeblock.h ../src/./writei2cblock.h ../src/./writequick.h \ + ../src/./i2c-dev.h ../src/./i2cfuncs.cc ../src/././i2c-dev.h \ + ../src/././i2cfuncs.h ../src/././util.h ../src/./deviceid.cc \ + ../src/././deviceid.h ../src/./readbyte.cc ../src/././readbyte.h \ + ../src/./readword.cc ../src/././readword.h ../src/./readblock.cc \ + ../src/././readblock.h ../src/./readi2cblock.cc \ + ../src/././readi2cblock.h ../src/./receivebyte.cc \ + ../src/././receivebyte.h ../src/./sendbyte.cc ../src/././sendbyte.h \ + ../src/./setaddr.cc ../src/././setaddr.h ../src/./writebyte.cc \ + ../src/././writebyte.h ../src/./writeword.cc ../src/././writeword.h \ + ../src/./writeblock.cc ../src/././writeblock.h ../src/./writei2cblock.cc \ + ../src/././writei2cblock.h ../src/./writequick.cc \ + ../src/././writequick.h +../src/i2c.cc: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/cppgc/common.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8config.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-array-buffer.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-local-handle.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-handle-base.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-internal.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8config.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-object.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-maybe.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-persistent-handle.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-weak-callback-info.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-primitive.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-data.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-value.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-traced-handle.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-container.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-context.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-snapshot.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-isolate.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-callbacks.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-promise.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-debug.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-script.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-memory-span.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-message.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-embedder-heap.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-function-callback.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-microtask.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-statistics.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-unwinder.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-embedder-state-scope.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-date.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-exception.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-extension.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-external.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-function.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-template.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-initialization.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-platform.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-source-location.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-json.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-locker.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-microtask-queue.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-primitive-object.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-proxy.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-regexp.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-typed-array.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-value-serializer.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-version.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/v8-wasm.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node_version.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node_api.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/js_native_api.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/js_native_api_types.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node_api_types.h: +../../nan/nan.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node_version.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/uv.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/errno.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/version.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/unix.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/threadpool.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/uv/linux.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node_buffer.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node.h: +/home/boazsender/.cache/node-gyp/22.14.0/include/node/node_object_wrap.h: +../../nan/nan_callbacks.h: +../../nan/nan_callbacks_12_inl.h: +../../nan/nan_maybe_43_inl.h: +../../nan/nan_converters.h: +../../nan/nan_converters_43_inl.h: +../../nan/nan_new.h: +../../nan/nan_implementation_12_inl.h: +../../nan/nan_persistent_12_inl.h: +../../nan/nan_weak.h: +../../nan/nan_object_wrap.h: +../../nan/nan_private.h: +../../nan/nan_typedarray_contents.h: +../../nan/nan_json.h: +../../nan/nan_scriptorigin.h: +../src/./i2cfuncs.h: +../src/./deviceid.h: +../src/./readbyte.h: +../src/./readword.h: +../src/./readblock.h: +../src/./readi2cblock.h: +../src/./receivebyte.h: +../src/./sendbyte.h: +../src/./setaddr.h: +../src/./writebyte.h: +../src/./writeword.h: +../src/./writeblock.h: +../src/./writei2cblock.h: +../src/./writequick.h: +../src/./i2c-dev.h: +../src/./i2cfuncs.cc: +../src/././i2c-dev.h: +../src/././i2cfuncs.h: +../src/././util.h: +../src/./deviceid.cc: +../src/././deviceid.h: +../src/./readbyte.cc: +../src/././readbyte.h: +../src/./readword.cc: +../src/././readword.h: +../src/./readblock.cc: +../src/././readblock.h: +../src/./readi2cblock.cc: +../src/././readi2cblock.h: +../src/./receivebyte.cc: +../src/././receivebyte.h: +../src/./sendbyte.cc: +../src/././sendbyte.h: +../src/./setaddr.cc: +../src/././setaddr.h: +../src/./writebyte.cc: +../src/././writebyte.h: +../src/./writeword.cc: +../src/././writeword.h: +../src/./writeblock.cc: +../src/././writeblock.h: +../src/./writei2cblock.cc: +../src/././writei2cblock.h: +../src/./writequick.cc: +../src/././writequick.h: diff --git a/node_modules/i2c-bus/build/Release/i2c.node b/node_modules/i2c-bus/build/Release/i2c.node new file mode 100755 index 0000000000000000000000000000000000000000..71246b0c116ccc91e38a81df01a72d375c3c0f95 GIT binary patch literal 113888 zcmeFa349bq_cl5}0zt$CBm%BcQ9)c1AS^1HKn5ogFbF7!2p9r{C5c&B6fhWq8HZp{ zQG8wAsK5)#=E5cd!9W6TZ$w30SX9&+KtS9Of!ybus_w4tnK6OyyZ5`ld;bG7-F52J zsZ&oqb*j3$XYzS}_V%UqYTZkSOx$g#Ay z6dFfYluVPga5_zuY3Fg-uTpLt^>SQas`AHiOt?yxGmd(>hRE7ANtWC7nEg2B99b?~ z9gTAJA*OQKQ>A|PZ2NJaOuCF?gf!zKAL+fA3SW+0>V+%5@zs8{#}(*Ff4gjz)d`P>yh^>q~XJ>n>GasD5axfG~~f_>Z>tCWrzUj#xzQbWUWshi2)u8_n`}{6m%-30 zv%>PopzDsr^2Sm18@gJBg+NmJNX+YSI=WK5nQ*e`OX4vIn1qsbuVdwTZH>%YG^<9lW z^CToixtc}QiwbM)DsWw1zk{n;Jy(Q_*-HMf#kGQ8>avOKt6!EpiJi|~F8@1=Mz!<$|!@LtJh^5ab$-csqe)p0eB zYt;E#9M|EUaN^w_Exs)2niqL;${*|Y@7S04Zll7Sdzbfp>v+~u*X`o3Mjs8nIWj8$ zoiXzoxH|N>=Kd?*`}fz`{^YuMfI{5NA~M@amCxOZeI2B+EL#Y{rZ~d*Zt`+ zBBs~7jov>0$nAX3?vk!?HTzF49DI1wIal}IeObRT`CHF_=%y)&>$gAk)7*-` zmSk;x_?^n>ovvQ<`}CX@Z$0zJ=4Iha-g`Cb(J7n!jR$_wdc=|H%btlYzvWKf*dMm8 zdimVHD+zAB`ToV&cL))BlH|hc`|5_~N^-kAKYlpNe%4 zK3MeR&zTFt27P{TZpF37dx?olH#VI4M#1CVmS=5U+b}Bsri+sjPo>Q*-S*<7+iq-8 z|K9q|^HxutyX4j{Pi$V+=ibNu)nt3c{LJr`ExvEa@YIrlgU8;o;LbVY7ESu$kv9K6 z9sW*k=WDx9-&8$g$HpO*ZHL@``S<-hHGi?HFlj~gH4hx#lyTAV_{O67kPb~wPWk+^ zlCIfpHvMw*V^bTI4_?-P?8#o@is}7EMm`wc>*IU7xA^OvsQgb>jBnhkX7jQpiJdz5 zpPn*l+whk4FMnZh_NxAk4n7y#?ff?{S@Zkz@3$SY)w81dvj4s^FKxrBm)}}CorXfl zR~F(x^B}qRgpxOvvBX)VapU0fU5IZKdz`Q05c-dWuz%d;VYcRksg9Z1*`Wz z^@7XO5LkohixB!BhOmEK2>E$o!R>DW&cW(^wRLd$;Slz>gz$592>iQ*&~Mc&c)bGk z;(x&Fvx|c3M~2`}a)^F^5dH+SzZo?K!)IIwJZ}uali$w`Zs+_Ec#05qUcsar%%3qK z+S?%no*hE)ZGDJ(b3)+UFGRhr5dC{$hsn5aBdr7Tt5=RjyD9( zgnbO&&ex?O?DP!bPsE!CTSo|GH7d0I;US1yruHldyL%24`8 zo7?qoRQ+4}o78J3vt4EAFT#Nri^#f0**S^v#r0k<6<<;M_o{wB`nR-W;F+N0`%c*9 zcfvH;sgAYVX{-7%mI4c2hMi-|pV(KWor%z+7p>LFPN~8l@bc?s#jApFyPbcldSg4; z>s=Hr+nfEQEN`^83i^aYIW7G0YNPtGiL##^X1BjF1pg-}{gsWRzR_Pt6%U=`=uxOq zyY{Jey(X)7-KqMq8kafrGVBy7UZq|n<;pEryc&0d9OJG(>Lp$seN5^bd|uT=)!RnO z)i8D~RsE7$U&@VsiBj^I8tI@RZ=vuk^Gf-%ia%F};6ogEOa9DvjIWnedt;+zy+(WI z!anJ5bBv2WFt1U6Wj`$I9j(T1BH|n4887XuQTxCLVlI>Nmh#|AXeI5( z&_xbj^Uxl8T@iwB#|<1PP~c_oY6Hd*`B_F6m3UpE{Bf&(T-jPy_@T^pO-H@d-ZDo& z{-*GE@^GQT*>y@9F#2VH@+V=AlpFp$r0gWrll2<<%dn0j+)^))a=IR+*G$!4<&R6b z!JnN<9^vRmui|0b*>?TeSQl}enJn!Z{q=MRzI9Q2SQ#bl7<~9Z`B|;}d|aAyeXn>j z+2QALg^!cBYgIo+HL=@oqvA%)jZ$vJy-7-5(7`VMQ}HLet&~qy{rj?t^W|ftgBL4) z-m1o9R|lV;R(vbpAoY#7w^+rEm48aP(O-v^e!>>J{!Yvzgmc17DZfkc_Br@P{abdW z^pn=>^g4uoWc{~f`U})YuR^SIm=D)UMPpphbjfy9yaK)XHB#}p;6kad+;X*4c8*>v z8f9bUoPc_|MOLQvzJRd z|5fe1Nb#*S(r#yXi1D&qwRgCxaJw|;`pk%{S4lgw6(43O`%x|I_Fq)~A8l-xU#;x# zQ|liiJ_yDC;i^IJsCo}5eb=SZj?vz4l>g54(j8dmP(SWVkoubp-lD$<=j?m!IA5#c zQmSLT?*e{gr~J6oH~9Iv(ie_6cD2%X^7&?kTSAQ8|Jh1jaD`pIQ^oV)H%qw@=U>IV zK=Cuy5eMGDx|-Tm{=W3{qqg$6MA<3pYPVCZ`XyF1$lz73;;nQ2lcaEVu4nF0>zV3* z$@+{qd_dVxZ7S_4a0lLZe-ePcc88a8b7gsjYAxp^aU@`ep_4ND%-XV}Q}ob=Hd zxq0b11N!tFpOu+DV8jFC(`8=poMCB`M+_U4kvU>~#zRoNw{OS3BQoRS5_6|yrrnd3 zGcG-+OHz7nUQX5&_e3+h182J@r>EuTrMpwRHX8P zveV-_^vp>|Nhxxt_U%8+G}}d4rIG}7+PGn9W5x{|H6mlY(N-H+aUBRWv%w4*+%(L@ z#iEHl^K)|2GxN+g*qrGZ#|{_;+=jy)Mr3CUGa4J$F)1TAJ1aN+_VHN{j2Q1urFM-R zpE@yU`;y{hRdHPjlH?9)J;rCHjZ>X#bmBx;MpjxL8Z|6ECnqy&7*s~&Wn^WN;Ss6S zj?58kJ+2chX!Hoy;sBj)3fr8Vtel=B#*cphKuV`NWoC^`kL%>7O5Kyw(zB^jK%jx< z&PeT@*1yv*{8wlg=)`rg;Ovm00%Fj&WX1UQ6Q>>Uwio@bM zj-UZIEKM~+wKKG@ak1Qrbc~uj+5Lo=jY&xzRJT)ykqf!9%awe<-OgS@r33B`9REx~ zi9=`igp54ydm|<|u?X4{u1NR5AY`Zh>6s&YOvy{PdDb`1DL3@H+?Ae|o-r{!NRc2} zMybyCjN^(63(8FRl_KtAB_x0)rL3-BaJL4zYTdHAB~&y~WYK~E zsuU&7Fgwf$?g+CgRCey4my?k>IxY?-X$deeZ&X*iX-py2TaLMmn#goq~bR9 zWyq@f_K%~8KFo~V{o{=pDb7AWcNmbxQ-XU!cAi=|IfGyqYv#pDD9%nIM`l3BIPx8Q za^yNgR?uu~#5%GAX>3;rSTDwPmhS&osW#ucw;9PFo& z7w3o!Hc#R@7%PwdSlryzo7WZ{VvXgHL679jQCZ2fd@;urS*BIL6kxT7Aka}wB$hlb zmc{adpqB8^MTL>Lcq2Y!=4On}Odn~F5o7H&cO8&5FoUbE)x5m;i0d?9OitD$6H$98 z(c2e?h;FWB&H^4M@FD3IIDSK_I_8DYdPcX(IXJYQeaa7^7uShrTwZ0IIS_Fji~)b< zW%~xZA`0Q9cCFeG7ajJF)uy9>If6$?ut6QFB4UPZ%@R^EAP$7kjO$=@#F=9x%TioE zo3h3_^(@N9sde6&7u7;Xx8&R&Sy|)LM`X%HoEAJfs0gt_S z(lbZrjrqp{ah>B&rHK+6go2K z?v1|N6u9m*+Z@-?yv9w=%)qrZ!DKR{_KSUMz8ndgxX2ESzgAt{tnCZ;L~IGAWMySL zYII?5?ZN!?{B+)7L(#a7M)W-knAJtUb}dd8yVx#7|5sV3W=v+CHs0c-yw=%TO$U6< zcIK`S53N0}vnb!u2w7)|u2Ec0joe?x1a+1cjpCX`Bb=Y5MWeW7Q7&G23O+lV0n2G_ zIY%-~9cO3Lu^b_b>M{VEljF|LX26t5R-odvZZT;s5L`IxluCn=~K& zuh^vWRw+wIwMD73GaYOl2HSjL(%C&ZJ1Yk(JG$^N z=0$x&7aItvy(VH_>pv{iMGWl)%Lr%fOvH7P^YDOl+y%jHhQP_kc5xBc*_ix{0-;TH zphXg0*_d}sdS>P0&Vq4s#aT7)jwEN|J_b#dwraH{ECB)x%v&yj4)gs0(owr6ah;uh zxHD|l<%+}HtO;ymkUDCET0`2Z3-<_ULp_oAX}a~tCEkd<{G4<^NDjqy!%czQyqx^B zysVra>0?Gr%#hc+*m2GnneN8oC@qh-g;J@PyY)1>!kw3wr(g;6JuVK@xT$IRf-^g+ zxCq7e`S|fRhUp70x)(BRLe|Lq@#({i+jY1jL$~O%(TZUcGjj6sM~ruk&v+m=Z)95g z_BZ5a-O!nmY4R+iL)r~w#C3a0a*v+FI^597JnL{nysPJ+L5V$*hsE8{Q9He%o75RJ zXjn(+yYR)026zU``e#pBa(PxCnqhc{Yb7X$F!0~wnCe?8KjT|%tM#qwFq zSfpEIWZ+SXaMz_umVaRe?({cswMCj<^>BU?_ptF;3BNvFF%Ea48@f6v{VAWUz@73i z*KI1D*X~I?aZultqRJcJ*Mg8=F@xlBpL#CLkPp8{%7sI|Ps#VqmG`R+eIp(9q+Ram zFVk%u^1GEhN)c?74O;UVOUL&%SYkatzjWjO5@gph9wA&;6(7Km^5_6`amZ>!;!&L!nX zb_jW_CVy7bAEe1|)#PO%NPnGdYC3JcK+#!&$eJ8bUrlgnVBJd0P#C-F|im z`PvY2m)0-39Zv}PWDPg<2rQ#r9zq_W;iK!PhLFz>A>S85-d4j$x1SwCzBYv1rQxI7 z@r00lV@o9 z*_!-LOEHTmnByi}7HYw|Kpo}|fF zYVur7UaiT8Y4Tl~yoV+in!HGpAJ^nBX!2It_+6#RV>J2mnmksMFVN%(ntYKaAFjzC z*5qR}`3OxuS(8uJeDsn!H?-`!spACeP92M>TnZCO@vpU(w_d zT6}w1leg03Z)x(bntYljPtfEeHF>HgU#Q84YjX9dF6XAsvEu4DO@ELkFVW<~HTiRz ze2gZas>!o8xkr;v*5v&)d4VQhqsfak`BF_@s>!jyH(&ELd7df7_qR3qL`}X}llRr+ zD>eCOO}7ijWwP5!7R-=@j4HF>orpP|WjY4SOme4i#y*5pEy&(q{bHTfNy{J18c ztI1v3JWJnsH(pVi{C-1-V=GPGOOwZF@}Zi%ttNj%lgDau^=L2WcGcv)HT?ulK1!2& zH2Ew|o~p^8(&U3Q`D>bdxF(;i$;W8&R85|($tP&?$(nqfCNI$BOEh`0CQsDlrJB5t zCZDg#AJODxn!Hq#FV^H8HTgu@~)b^T9e1pvliMlyUTE@+O)*Rg>c@2Igy!CdUSd`5Lat&oia? z-3?71smZf7d6XuftjU{c@&ZlXT$2}T^7A!$sU~ls$>(cwdNkOP2N?L zx6|Yan*3T#?$PA!HF>HgzfO}6(&X1`^5L5N22DOjlP}if*_!-DO+HzZ$7=EdO&+Jo zi#2%%O=U8c4VEG@g z(zLMh-({s~LFMmZrD-AM?_i~A0p-8KO4Gv0-`q;mg2`XsO4CBgf9#am{uoMsXQgRj z{(zIal*SFHNAn_kNX||shBL45JG%Y~X1eC8%A4xBMnzth z=}3Rb-=jmf<9X4TdN0Md_i5^F zT(d9ovI2~5SA{x4|2fu=f07REPJ6sZJ(~~T=GlC_fu~-j=abWUEnpyA8HlLaC&#H# zp62I*?gLTQmEV4#r?C6KI^)#i{UPsMkFWclZuMMZ-QP7eVkBm}%JA!XVDI< zhZu`{lD&TtAj#fSz{LA0AnB^(u`RA#{Cc9M#=FN;GPH~uSOl}l-b%3>Qjd2pwG*jF zU_ZtClXwjEr+EJ)(RflQDvzA`6e@%!$%@%M6siTH z7fh)Vmq0?s!L11*n`}{KRb=HDQYqdVaUoZBB*ptniuXIpNaiN*6~7RyKKC{Y$2j2F zRpFR8jClfkVhk*aPyec^amW3kxZ)BONFSUn&V?}zGF~t0{3$$?pd+=*<7?#eL=|n1 zoI^jDLG=JWYjSnMg0cWv;^3b&G?UukilJaK zAZJH;@y+8(_>k{wCBmQ!x8Tuhe~@F*PyOn0Nyw7fmkRMMG*L65xCp2I^Js{DgUo;C zOKJ$dP>3`5vJ+?$U#_zUFKY ziSFt!k=#xml~YdPmQt(13Yl71pokqn$_jxnxY|&=<(6VB8L-zY;uHWMiobsCzM`|gi?l`IfJ1{ z!$ZWtMUbc5BF{@Ck>sgh9&wL(;A#MQoOZbC2m1>T)9C=5V3e@d8K=^tIE9vjc|FY+}r3VlHd~uwzo*C&z6xzRV1>{ zm@d%~{%HJo0mE7H^LCaVV)9^eSzWjQW z`7$1+Bwv~zWxiYkcQn4-2gic)**(lqU*%GM=CuE{T>Y44{a=Cn5z)zY;08AKL+C!!#&pQfWGwSG#2 z0#AG2!7^)Nz0BFfd9k0fG3|Xotflo6PkYwlHL?f{q_8$fTfmMg6+=)^<7tu%AK>Xl z2hoBT$t=vr^O1O}Tl}}OXvH?Hiv3?628E1k1T(%h3mV@pwBj2&hIpMW_0U2Qg-XT4 zu;!d6ucXL!1u_r-pT|KGI+2)M5}kH{Xh`$qt)%9I5slF1e0gSkE4Kts+vSH@)2A0|e$}tf^ zhHK$7R=O?`3Ab!~UM>0D5;d!3+)|tppTndxDjY9DwZ!M;+%6unPaT4YF6=ZuuP~Zj zAzGk3Uk{uqpM9{a@%imT%m(mckU$GQqFTY{bUxON&yAt`zlF~UFeF|-7=q7tAp?B= z00+tE2Z_if(Pcl`_`IIHv97^`@p(+}_}mzMXvF7LfS36EyNpb76_!8>KK!>$LCAoEG{<@pXvG?JQgpI1Y>s#_dn5(_}mLlBUitCI3|d%CZ7)l#^=ok zxRBZ#=&1~kW5Z15qbxcCh2+gAW8C%j&n#aHn!1uAllF;@(Bq4fcPJDmdH=-4$pTMF z(IW^78yn$b1y?AG!FpWxxYrW3S+Da%1||$c^sG#LfGoHt&l_Y`g`jDjX6EPvW{cMFN-Nixt24X_Wkk z*d%75X>eQYfrxS8MN0wNL!+da(ZV3D6ceDpqvRV@%$k+LYk*lH4s$l5{#Imj)bB+X zJ9>=9s*s}o7%l44zKuvjQEi-j=qE(zdZ+sjXyQULjB(PPkIr#I4?vSmd))t4)YO!k z@qRP5Rd9V`U)B5HXDP2|RlJWj;{6d3gUW;tR+4?atm~p)t^DoK6>9w>+9MysWC0Fx znA}0*qa=FPer^E5{%z0}Ps5gRzfSH^S?ia!LB>b@$T=@lSE=>OJaiC^j}qB^a(wLL zgl&9GP^c1h3Pg#CkYNmU>DJwRN*wnxa8uY~Aem30x>i$JUK;DV~a==ySRh z&*!ngf%61QZ6W-Ca3kLwOXhXHwbsceu+tm{f3;e!n?I! zSj&0^wA)U-qxkzdI)YfYihE40zwvcK8jpH>U#9ddp2LvfLW;jWr7=!gQv5x|Dcc2m zbF|F9wkaivvM$NL<-L;en$gS;`j9&vQ_*p;DjxH|BUKL zFWl6FA^O`>Y8@6OzJ|l3@jVAsoD2l%$Kxg(#6!JZ%Q`G~wW9ig#ME=!D7>y<2D{ z@(#)rOe=Ho)kEH;lCO!8t6MZmEFRFX1~)I#%RGhU^%A>nnI_O^TH8mXLbbMk4X3oW zua6_+#B2KnXfj5gSjvs$wf)@P%E`83 z?`hWKIhWQ)zsPdLJU`vYHP-c?eq-}{DUB|^9{CPo#orU1Ebm+68uK_*MH)Vw*9p5( zmpBI*xIieB_ApS}VQES2haEXk{~)#8-RxJe>u3ADYjb~dFwt6#&wO+ajVd=&U5(FD z$$JeCaXq{sJ^HgTpo-exoP-o#KkxY(9I@T5y$=O2=EO`?fB~njpButi$Cx`N`axw= z1iDO&Mj^UPHU=R5u_&I{2Std7QAOMif^x>+rNBF{xo1WN-QDr{Itr>E7v;&`7Hu|_ zlch`85_l2*RCGO8AMbxknG)queY}rEBzqerS3On?3B7Py#wRFt0kwm!?<>XgI28@q zZk4zd=7?^8d_|qLiHee+MKyU*qCRvqbG+F@UlM~~1VB$@Z=weclf7J}c$D-pu3m#J zx^@>Y<0Nj!IxquMRs82WQ52Wf?K%5B9{pJ`cPuh0{PrKo?6k$;wdjp}v}-;r!{cL# zkLGU9*x~jw%vbm1AuK_ov z>Erl|As%1!!*syo1IZ+W3EnNXz^``Z)lO=9((RGH8+5KFdA_ zf5^6d-1dX6H6K36V-23@i+2A*EamYEuG~r13o9Z}gMYWw=PnQpQ9WUQ16L31uabU< zq0%pZ7KRj$PxMTgsMl7Mb4 zP=Phxoc^pox@s|Fn9B=D)a+7T1 z?ThcM@%AU$VwJjkj+G&-6Z4I-ad9%!i}yrvqPNIkXBFi$G#>(tji1NUuv&TY|r8pElm${NEvSZeJ# zd#e*8lPbMMQ!!tNXsDXg<#3}CYrX2GO1!kSOmkWlr+yMg;3M|7)Oz(nM+La)ctX5O z9c1j6{mC-`0`73^@@=6>R~-6O8RnagnQZt^LH&&u;2|xl&Z8MVU_6|aW*P>5a-QU# zNGVxEhS6?O&9<>gi07SfiVf(P$j2HWGs*j%r(1R8qyL3Jv`Q`MQ|6wzKQAeKO~*Bfbp;XhLy* z8Qn&g%WJs-GL7zo(pMQg-af_RQ#6&Y5^3?{7*7jGWM9V`_YcMT9ky{g0JEW-7f*c* zI8Py$+B=Vr&WMnr?AqtWZqPNyhgzpb_~Xp^QRBD2yEQ*DpIiC+OFdq{X7hOgny9*B zQY(Kh&xEqi3%5l1&oR10cWfT%n0L*X96?A zIb)j4C@gPiS;K`{{fBD*AbTwm!YlEi$1zaW3Z+yt8;pV|> zP{YMy+ztlX-wfR5Hv2E8uyHFu)UNLJ=dZN=**e76cyO>T@wKVa3msoCQW~|z*H6*r zI>pyJfRR1EZX*fe>ru4cimy2^sIQT1@pTnc|0%xy@G%!w@pZJS;0dn4h_B5Y6>xmL z&oqqvfFSX8wqcm#>v?SWPtlnT8}U`JRL%@$d~IMF4jEsw**3@5Xq^7PBEHfF2FKT2 zH0o^P>yVFZ@#C9nBYv#dj`;c_aw)#X^RaI6^~(?czZ73@Mr*Wn;(aDQPhbJB#nS6ubiuKg`b-mJf%G5x7I4{srE?lP?$4Nc4e*K+O`X#qG zupOb#wtgK0)F{4|qADxCHiyAr@imVoqJdB~<7>H5iM4($qDsv5Ya>;`ja-2dU*BM< zwLs?hdJ?so>(_e>!`AxsI>Ru>*X5l0Q|x44jrdxu88+kVtEOS#cbFENwmXr=M((+= zsBPpf+h)Yso8gPGj%|eVxbnn;lQF&x1PAT#M$RkOcX&&ZTn&?o)62Z>new?j-sSBJ z&(tpOd9Y#a^2QkJ&06+(uZKTspZ7hS(ly$JIC4MnKJUBaKlXXINXTh9zoZHx+Kkrr zdAAx6Rfua*o-f8j@AJ}c(uGJ(H z2Ck1kIY}4Jj$ZTcW~sH`+sgl|)Z_JW6c$tV=T=+!&o|b?;1sQoX~6}%=KgS^N@Jfl z3XX_}D`_jk{yYfn^BVic&m&)J{{lQOCgbku_YimgHrBNw*RFSqskf8#K82pB-pbJ{ zS!!Z+cw`HVl|;V{4cJ8VT1sl&bbNyCXL*7@U!upScyxMQ;!{(l7dk$D0H?{4icc!; z#LEDsUpMDKk)AKX)vNW0$iXg;Em{;bvs@dNS4*k0a-p<~}i6wz!4 z&(hMfE8slB~<)!}jFLE&s5!c0LO7 z*4jYVCf-`Ri!D`Re`(uk7q+sOm(o%R8@PSE6S0-uFu7`0F(mZDX&Ikj#Pmib-26&W zjZ<+mKG69hm+e=G_DCoDHd0aYlee;zSoj9?!*3KzszKP+SEw{24z#MI5Po;H*Z(12`WfveH?UGyBKhY+(+eM#!B1Al} zM$7*|%M+_+Emn<#k1N%w+{xZ3cd{Esu5m9PmFS)IE^X`>#7i+LyN@reeKO~hpgM< z(-i2QMSKE*vZ$8AiYV0Nr)yA-JL-EC-K?~~nqyc2L8bP;;U;z14eTa5>?-N67%Khu z-(k=<^qb|}59WS1TZ*__nJ)js6FE)@6 zl>PzrU}V!^9}6e~;>9Y$F;v1|yn;$@tQbJ=c{NP;<< zcu#JEgN|?!0Uc+!*kXl?WMtdIMKS4veJf#$!^MAaVug#Z*Yl7Pahxr~1>N_iaM6dR zITbGYAwNX8Xh?MSg?B;A>l7|lyH_L@%V=>C*IFe$l?``{;2UMMpbaEMi%E0{j20dg zHP&C^gN?R$F`lMizK-&snW8DzRv{KbtFG}P8M@~9Gxz&yUC)3)w^1!BUQ}7}fxn0K zkMUwB3Q~`q-k^HycRr~S*GvEX-A+@JY28He;#tb2c##aT_!5Opf6p>re2#kR5-*l1 zz0mPu9DJ)&yl4)^fOt_tLd1(zs7J+%o6x*~cu_>S{6oB0^)44u@uG{eI!szs@#0&S zS_>B|UR(n`885m+Cse%XhdM&Wi?@+!#0yMeF7Yb_^f-$zJOf|wt@HBY(0bMSO7S2p zh;NVvkwptQM)Bf9q@D3%7s(vU3oTx>h8?Ch};WhY@?3u=kgYU=&zX~SWEIk*B7m!YmUD&iWiYo%h|+>MJPz|;^TD$3VLiS zpHzuc?01DDUW}$(GhQsw{XNTgu@HS-mv}Kv>4lCLH^a9&#f$IOVk9`PM~0#_#fu`; zqvFLmXkI|P7>N9TiWfy>oSt{*^+h9P^+st`#fvvs8Z2J?i7I8hXbPQB@#1pS5i(xP zM5Ylhczsa;fs7a3@Rf`@$BTE@sMc4CL|70@k*0XDpY2zO7m#+wi^U`h9WVUIw#AFK z?Alh5%C^D2+i_yWi-++QX{z#*)!ZcWxjI^3{7jd|Dqj48{1EYC5nx2Tps%o>X}nm^ zwc`4V8|=J7Q1Rkw`gW}^x+NU~9wqtwOkEt#yhQ z{#9oiFZQD3S;dQqaF61}OJsoJ#XLT#5+6zb9r2IgQy!eVm*0APn&8v|APw`?P88_p_7o0jGYJe21 zs(3NOVc1$kwZw@PFM6-wAthdZlbd9V7aKOx zK$Y7Un~@(PUQ7hkX!%e0M(>%%3m?~7C33g(+YHV-ng+)HGI#AEIQtCC3dg=*X@{=}C#VyFDs6&HV z{y@$DOW1Prn+f! zOdMt+(CssT{AGY)8T0(GN584X?E}cqNj=_!Iko&BV%~5RW4sH?L z;8^u1_!#{qHH3Ae;L()HJ&f(IYxd1}-|TOi zWZ)M5oAJ+2zqcm$g-BRf)ym(|(BpKBzqgUrZz}r-80AuY81{u*qx_9dvVD#+h4|f| z`9?YHYmJ6Sm`7p&m_OIh<8rP1ZDm^YgpR~v2^Pkr`71W3N=189K3K`=88Z_D8<8k0WiJCAb#?Y9UNBO>abnb6*3WAvs_}`_o_hHL={;;m= zRXor733a}jf3~7tnhiEEA=L8#QJ|C<=j9bqE zOe5pwy0(T>{Dty1Y#aFF{xnx-Etq*-yVdJnDvqE^X&v**R}wA#%d?l+tiQ~u!xRP= zNt4Cy*Tw6wA?JzB$T#N+fQFbR;Rho>Uu>TzB4@6qT=`8E|G#l=-0yuIn%a6S1<{Pg zeM$7-g$Ou5BbT<(iumYU{Y{}JV7+G_pY5P)^4A=n>U&Cde)vy;k!pOx>&vK?!irWL zcshzwt`y&MDaN4&(g|EQj> z6n$VqtVJ4Ch@)(;N-Rb?*|&j;qOEdndYfdHxjses?FkR4m+b38k0bn!Y_*2xDn%#u zwL;v-w%ui-KTfR4=&@HBRHFJPxiiOOhl2*8XSvk z);mJ1LSLiZozd>Zsv?9>e!)R~@^O1t(WFC2_}ohqy+t(ZU`~HMvAC!lr(zS=UL_{6 zv(Dap9V#AQ(`&z_L-a*-;I(|d9^4P1S@gWW>ep8OG$Y>O`)37wUI07B^9ND>Yq*Dv zbcBDM)R%GXG&@uwuI3|9yF__75Y>R&{#A&D*1rCxg@gk3^|wMS>Om*y_xXc8FM#;v z2i`{f3I_rdbv`GVG2Ub3h}7l}u^V-e-ZE1U@hgJ$RQy`6G<>E8hT?J=Idn_8@SQBB zNj(+6=1E08eq9Jfd;FSD62z}^RAt4l9)Kz!ew9GQY|kLWxD~%PEZ{Ujiz#5ox@$3h}-xogXn>xlbL^0eUH3HgloNgcl55Fv1zKFeb1~gm%z>%hdQ3(Rt9drl` zXcwUq@Sj0Fu41U8nV#9?#aem*QEmBJAYi z`{G=GmH3?9bq2IIWI!v%@7^GwO`$_zK)VA)t?N5;oz`26Yh!}Mwa8N(2hHb3U)JN= z-RxF{nErx7FP~4U#4^UCO8v5T5`l>4FIrMA#kCEm(Vc^#V_pvgyWR}8---3w5?U## z>rLuUiZ<4DWWC5Ig8Y8i^-6DoTxH4cPj2IcTCZIMZ^)9mj+9$*z2p|6zFw<%Ug}*b zEvfa|^?`ehW1(n|Z-OLh+K+K-TCO`^(68vV4vsP=k)kg%kPKr(r_NmhG#A-P#TzEou%j5u-{A|{Dc-k?YfNj? z)40U6?SI0c3SkFuDh5&oSdtNbi2K4#X=D2n8+!DE4gE-FZGZA5CjG7jLKyl~Jc(=$ zVaC?yClH{Y#9#BtcF|;bDt^Yf6~!)}$H(Gm?zioDZX#pY@f^)ms1d_(6tAH;Rs8^UN5GCJ7L9{L^q^E;Ev}Puci&{X;9%c7zLLjM{>VPj)(Dru>W!5>ItJxpm|5vpr^#{H;u6bn^+ zUWH02sxIXCsP+Sc+>a_zdeclj=l!VXmBtWL1J~0*?nm{9-&A8qQ!n`asK4h)y(Uu6 zc|U3?vhC6PS|CL6;x0I%V(S+y3bxEs_oFU=t{K3C+>h!-wV2z6+c<^wFPflg$PZlu z?nkYGqBM^%9^`)1PfsiJd_O9K&GY@JIa~wZkLsz_VBU|q-!u%6L*0)W414C<)p0*+ z0&3RRuC`ypsYa%CKk89-Qr?fc8s{PIM_~o!5OCYmPW!1( zY;n3JDyBHS2|2X=y#_~7pY+j%?=Za1CB!OTrZt`LApseEKOF+&^o=NL?0dg8*NC%z z{ACjg{3X$|=NRji-;qn}l@dNWE2E9z!1YQTbgk>D|C9Hlz9@zFwcL+-3p#S1@yhn| zce_f(^QOF;lG9(vaLhlw&{SI1WKu=6pi1WxJpaIW1>TPer+oc>)NfBXz$YvB2(LaV`?fA%mfYIz>wOV|rF|NLC?5A#nd3R?3|eRfOE zKZ{T-#QZ~HQjFq~LFbOvjWII-rRFfWHWaW7}fivwf+nTTrueg2sUozU}7TXZGn zpI<7^VE(CP*13u+gxi(kHJplQd|0ziJ)d;_-#%;B;pZU^Ll9)vc?_kEtAh_n#hP_e zkj1l3F7$YHScpian^C{-VQP`a6!I6e=6Bm?AW&b^FLp69`Fx3#C$_ zB`Aa|c|KnT6|9hG+~iQx>AE@Y3bH^Y#B!4HUuYEP!wzpTTu9lz_)p+DxDM+cSKM|8yr;*y=$~O>9{E(b1y3VUV97fV zmD3z{1K0l^Z@bK6hi4a~1zqrAwuwFXoLZ^8`O<11wc#tuqINaDirNM2_KKaPLQRw~ zvb{oXiz{-bzYQYzXOHQzZ&V=_trGV`DqW16c>-!4?>rAdx`^elM?J%Swjmc4$R2j6 zgd7EjsDKLXS+X6XB^1!tA`(Y&FKnrf--}am2d8NcG~5-^Hrc~pNBS4?jb4WanHN8z z&7v7HOqAHE6|x|oza;xXVOd3JH@0_bQB1m)l7#c%%Ly#Tc@)Vk zCb2z}N!>`#7yk-BiY}Qn$}(><=}nT=ok=}eJ%CBykl3p;=_WKz{7|SIq!u!h3IT?} zq{l3Gh)KniMJ>E1#%v++QDYL@Gnv!{dg4)3VXdYX6;RPCaV}RZS5vVdoDoq5=nnDl z+d&e=q(9iXAWXVM_LSHP1!B?$97P05Djt;JR2+Yl(mD^Gp<;5_AfkAn28-C9$%7-8 zfCmqu3X2EsX;idIgmJ}^2Og%CoLN$IhZyGfNuqdgn4Js4gJ{`PVgnS22di)tE|gR} zD8i{YTHxft94cn=AOT8F9?T{~Yf#Y6gMqRjJ2;q~GI?+zB?+bN7n>;EO)`rIY|rGu z64CpeJ%rg~fvfQ>kc`I60mDVRQRH7b6}d=?*c>?~z3D;74{Y z2oIXdo)W8|Ks;E6qd1N_6c47sh!C9CL@BY9(>goupl&zW zaT57Xc6i88E;j*9H)BULS&-e1W)Dnu?4&HhZfmrOU2{^g*unNpb}S@4U;G?ufto{_ zTjou6+)uK)v*QTi6nK?dOjc~{_;CtaI2RvwcHAgCgW1v1a);Q_iL$7L6)nsb#N zB-z3COm@5qJ#ho7u-NfY9u=(;YbUcmZ0;5&n`DPecZgx0P7=kASJ=5A?AR`gi3g!T z?8v}Typ1{(54s^=Ea0@xgC5kuCJ%l?zLN(DWM~{ai$ml}GkGusdg5wSVe#N`#erqohzuwY4@Tf9mco|eK^*eM3!K(@a1(W~$%8}4ck-Ys z8A=Oqs-7&!JP2o}OdeEH7NHd1%tWa^saQNUa6W3OQ&B?+aU&ofavVGv2KNZFpr zgO5nh7k_#=9b`N>VVO61(2H!;od;i#i9jA?vnTpq!^gR3;S_w>dC*e2z&yB!3dt@Y z9$ZXW)WU;J%@(#YTgWBYp2>p`peHUs6&4SQ6%WdCsA74IxrJ#Zc_3J>^I#OYsCe)= zI~RlpZ^(9t!B8L`^utlS09%R&mm^=y=Csa(YpH`x9(;p*ClA_^q5c6*{h~SbyEJ0( zU^OKPrG@93C>=A1BzeI0Odb@Go-cmUQi})2Eb}H0ZY3La=fQu;L?92wuqQeXDj!4( zAH;{92a(bR?$z_Dki~-*ltnFkwTaonD6@rJg6)|+D1@Fk4^>z^a8011RbqZNRV;aM zk_V3D!9JGjJh-1+R6KZ;oeRQ)C9)l&9~6iO$vBFqVN3C#HS)zwPU}3lf;!mb!Dq;K z@*su`^$u{#uQ~OzG-B{zIVB0Dq34(=9WaO_dBFBe9&{%?U;HdQF|T|P2Q2d@4?2^L zy7QolOa$^^ID4Y=U}F|qn1K&F4;o1qxL2D{A&Up+QWmvvNMo~w5oQay1lu!ta5MBo zLsVh$plCc5trDe~RI%j2NFF$n2fJ9V^WbiBQSsm*b}k4HUY6|;$xt93B(h@kD@#yY zN&JgrQ7(vNGWX$S7;Y|A*5nB>Q$Wi0jDCB(>iAkOFyWY*rzN*zLPVD$WTjU zn24s*?7B*8z&iH8TuVGeNkY`$$V7BC$*i>m+cP<{o%FCjg>O+BoLOy|H#t+EY}B1I zPmzg0&RoZy=$v_c0@@Rg53_~b>z`7a)s*&y~CJ#=KtnNJUv3kG`L>u-*=fR`n(4On@VYZNa@&jtKa_7I6 zJH&%(%AywjJIrk1hooZhfbE$)cm#Ul{joX^Mk^i+fYjhYLWK z+{z9G;X%4=hiD1~;z2koM*p|~mP_K_9wnp1Biy#=$qQL}Xtb1ONa+<)ccRkmFQwN> z>8DD!JEY=xhRLsKa90RU>-?G}eOCPH3MD7MW|E;5C}^V3{OY4MwjX<7#+l}nB=qYw zFwyTzGK*hq&*ay)^`QrTy-EkkufCRflVATL8Tf^ps(iEEy320dVz=F4ZO`gkV(FnD z?N0j^h#{hz?(NVj@!1&mOg-^65eQJ$bZDu^1q!L7sW}&to79F%@d(+Lj|=Qad461g zzCR#lA+-+U50enOGkzqMs1i|-QUzqC4TYRxvQkMNX7g^6sK(dh%KyS2wNkgwV`LNyD|^LKR-a^hlq^rm!btYLk`0%#2$K1gEJezqNLH%q=qhC~B-^X>+DKUf$%>U; zl#~^a>~p1e5+LEmiK`xD1ximSS$)W6E7@mC76#dys%$xAjwgnG52x0r?*igvHDUDbfbtKf+sltVVdf8~{10TlS-#C*W_|+YzwRi1#c?w~ zhVp%m@+wuYGM)^$~7_fIW?ZL zA(KTOL%`h8&j{^3^p*K!xz?QhZY%a}s;`~_P64WNMd9u*?4)ARKBi`zBBBP8B3 zeH)8fsr-R>(6K))K|H?8@Dw?wf|}GQdE)U6J?`-(#B8tGXO$=Y#DR$e@H}LBfBFVk z;i0zrGmyLR4CDa#BcD+bUy^Hu>&uuvY(8&rO=@h4@6}R>`V{TYyC~UrOB?!9WVpBm z${T4Or>n{uDp^%XYV@KN%u?o+d)G)$`>?CpLYUtiS6yxSFF+5i7*$%6+VUFE0b`anCu0}1Gv$gg-i1v8Q_Pi4Vg|%2*xeh*xZ_pkckr=?{(_JK1DxMPft^R-UVgV)A)Ni@W9s7KZ*BHuVXcnh{d62#uoCz`jg)k>i44( zVm&v97tKe%7DYl&>=+8aO7aV^8l@|e{^X`_Jpq>Fd!67CE1@ADLB9JwdX)Vz7Pa7X z86JBTzah`#dy4!B))_j)hMOJT}~%=VpOVft7sBH8GZ~`)Te^D0%*bw zJR;tM4>Urqg`67vDAN8Jr>SR?$osuD)%-V3#dauwlrnyp-?zbd4my_cpnt(LD9_(> zXyoy2A_OJVTxc1x*CCrif%+=27<`}E_B}XN-*TWLQDP_wtgko(j{#kwWX6EMrHL}L z*2k&czUR41ioVXfQuv1evdAd>QdU%N{4OPaF9I4HqqxiViuEW@u;j9{`ao-<1rG5x z)aZAE>Vil1yx@2oWmm(OAX~>H8U86Qe2h~Y9(_nq8y;<;Wa4p9ny~PAh-=mG`0`!{ z9>=M?fye7e5FTj^V@Ny}K&`HL41YQ}9{bqUaC(kk$D|Bv*(-e+rM~ zIJMz%Jqc>VBLYe$9v?^(79RI9P^&8*F{Q!rC}UT{2P0d@z?a#=o6_0IDGV$<96BZs9a;+L3Q=o3cV?N<&;L#fi!lMDh7!r>p zsMQq@*PP&Z6tJt|-H@&0@nwG#kNc_lIv%@`S1TTCp=9Fmury)eaSqq2;gJD#8y>}k zr-8@KNDv;saNY$ELBqtO2@-@y z1v?uOk1(j!6_0Xna6A&&v+%!=t>f|BohBZaQuB2@UPNB4cua-goVfZEYR?1 z2Xz}B9%z_&{4Ko^Z?Ur>@%RmDb;V;PE}(;rmss{J+>dM>4{u)+kMmHA4UZD!)r!X$ zD4BS)mnJMc-eG};M{B6t@aPH+6OV(^8}TYT8xoKGP^&8*Wse2NBZfT-{}S0c9#i_5 zc$~(m4UcIgsBJwq2uda%7r{}Ou<&?|8t8kKu5W2?>>AM+>a-IO)`mV)+VC}Q8)z{m zv`_X0G-%8`!4B(~w4`fXT>Eb~J>#iw9aaC}_sdiXkI>-Y>#G4a`h zQyV@*Nl+U;U7=*+^S3l%;qy2(R>#NRI|x2u&@%B^0~>@-7CT%UK3-^x1^B2dKEsQG zH*_x3yPWeOhSV2xsf}xHvS|-Ta3glRwW(6Ba(#Qe$;|yigCoX8~bs@aG;R2%kvq(Aw~6 z2W^prkGkUHdNepb1+W2px*=P~=gZqoeC{VW^!a-?@@mCrEtE`r9+oC7e9oc9>iA?p zJpiAXgt3877bFOuBkXWce5$SS)fn2M4L<6M&%T1-_zZ^);M01B9iMf*Onh!7ICOkA zAg@+@=0nNEXNWXm;d1~28$QWU55Q+6v`l?~q9G?W( z06u>qTj$SnZWEtN2@V~f7m-&hK9iwj;&Zb!Vd3*W1U7uyK|KJUBxsrV{3$&WE7;+n z_-OHYJG8}qeAE@6vgyI`iDB2nzeKi<&y*w+pVK(C;WLc{wZ-Q_P%`nk2#&&ph0kl$ zSbcmohI#-#ZJ=f1^93}BKToj3LGjt;verM)7F+O9S9}WSJKjOAFJ0_<_&Q|k_zdo8 z;*HhhMXpf-HELdnGEZ)w89=W%MRj*q`b5PZU*W#Y32HVB_Ab~q?L8h^ad77OrE zSA2%kcb|jcvyWX5e-7C?KHcCiyrJvOjX1U8)13sh;nNCACO%(F6Ba&Wsj)gf+Y^J} zv!84j@%dRK2%kFvT8Q;exy7FhXp5Qns4G4R4+qDm95xVtrXX9#r#1Xl_`HNu8$Oqi zpf-GtCusPrmnJNH?x4o%_$+~X!1&sNVkSP5kRW_+j1qs6E2s<1UA1(eghPG&f4-21?XUkpq<*D+G;f(+V zJ*~n|okYl|G(;7Y3y;_2okNeSY{vru2`v$^<;($(BZ$e~-hcv0!~UlnW zqp~6V6J3=%O$>LEAgs70gg@^9KKVoJrKGYhH$5+LYe zSWOS$NJsRCGejI7Tj9SvSn2-6RptH+9=nR&)o`}TP4l5k%t74*Tx&!l zOEd}PcYX33Us7_3T{n~8lX5ch();CS06^t>RYIc-JZp0B6>&F^me0Y2^gqD!#|UBB zs!De?`A?4q7rQ^v{QnqsgZQ7K`QMwIlh1wFdC&u8B@bG$|GDXzBYRBAOSf<*9^hf3 z=YW9yc?lc-c%Ue9^-~+*+dns9rK@;gIi4I^S?qq}|7!315hWFe6xyWMOcw6;wf)T9ALv@Nx$sq(h8RiX74_={N3 zU|*`K`n0sQg<4yOK3dai3sz*F?>YD0*_qkdWQqSg@B1(x$eB6!oO91T=iGbGotZmZ zikCY|yL~&oef_@2=qCM>(d8!`7vOU*^B98WaSN{NQc5e?XPA`4A_K%$uQg8u*72S9-%k+!hit6zu z*9CZAtFK%Aey636ED;Uq=OP1#{>S_TEja+)c4L2*rawX?yCT85VB_i_-pEotyuTm~ zk*EFF7JVjYV_zeTjX&Z;gl!%C6~bQgU7ZGN%+cFeZ=eRb_a*?dVW8fKisdUz`g2r2 z-jG>M5fAtXYQuX=?WFz#DAVs{cFxU;P^NFdby?3eyqxztdSfYCvsAS>^Bgdn`Y_)s~L?l?|46yYy+O zEY2Rbc$NOO8iGeY+xW3#6ueAvY3qFY?T`*9UzGkNIk^wz_Gpz(#(R?eT*`j_a5icE zbo|URh-Qfq{av85b!Kprtu5CeEI;H~+#c0{58>9vz@JT2} z@IBP4!uL-o)Bk`!2ryb&bfQdu8Q0G6y@{HO@ck*uIDF|%J4CB9fW=#OTR>$E;bo|r zLU=FNbVQ#~j!>WS4KVUHbJ`xT&Ih??IXV z9B~W#)S*m&1lLacTum*8eKw(Nc>CN8Dyx0wp=z?vR<7xYevDKY+CFnp;fU??PA=7V zgzWPLRH?r~*NNh1Hwwu$s*P`WvLe(Dpe86^__G`*TeDT!Sk0XXrYSeeOpg+2>leOTT^xH&xiD z6J`2WSQ^{sVzPD%uATNdm0Aq@RH1Bm`^*EC)jk~GuunbLbVPrKR2bSmAA)qm_Ib!_ z+Q$ny`WCuQWS_61knA&u?b5G@xT(TEbtuzsWNB=lRI+vjuATPzD+}49=Kv0GpJ_yG zdCQmM8}=yyo~F<(q{7hl`3*>iuutM#Vq>;xn=`4po*&bkSJLw!EvEDcO2ymLQ?5XU z(f!ww?!RCe+Dis{f;jC~r1ASIpsDx>IUVo{hQfXqqf9@a_{8|M2Q}&waqYCSuD1K24* z1e~s1okccu+bK|hhKUUOEYLi)ibQhKLVE_&$p>wYvYlNm83tx%jJ@uJ9ZM$hA;P(*JHV*eeM$LWk%Y&ueU&iW*mQ(DElI~YZx_sD* zu|q5ATJjSld$eUje*`*X5t6=c5y`f$ano<1`5h)JK(>jEBWius@nL%Ut+$}){q#^u z_u%vT==9Tl&vzb8NnaNLw&TN$=(-K_-z(X$VzBe**z{W)f!vjWx_06VMaZ+Ko!Z%l zt-Q-7JYU#(EG>Oq4SY~ucc3W!iSnsNQCInSeH%(g&3!q2JyKy~e)<#Brk2*dRMNF< z0`Mt>zZiHzr9ZLkRQwvvPZ=JY3O zVA7f~eTTQ>TIQo{eDVSmwirBp!J|dB8 zoTvHr0QRAjc26mNT5Urq?Or*J)`Kwn)fwrhFZ$)-sX!NYf8c$IRXY4VT(XV% zw+8jmsKs3G{l5^8)Z6v*p>?8ouBRRRf6<@JBt>a|fBL%LfyDbSnppK-w8UjrJuIm8?{RnQ*M9@m)T-zg zDAV`hkDOJTQKs+2wR2XjVcYD{x1enJtmIZuS!dPxq#0(_N4TaV`dCuMHmhFYSlFxa zRw??{CB*S;JIru+0{-Y1Lm{<4@hMulKR3>H?{}%|4IO#I6L+Rwr@5iu*N2Bs+9=#+ z8@L&p{_&%~JeuHM&tBZ?*^X7^KEOW%9+3BbcF;Y!oqSI&3>9waYoC|?obS)+&n@}O z^M^8?e>3fr0i3^m%7D0EK)1Lqv&}4RH=4J&Fiytq8_03<>HnaHx{RAYh3&-MgDxW3 zRUcg4SQjjF-aWWWKLv#5d}Z!e5ke1XCYdKU=b{?KaA_b zo-Nb+U?p>*y+i*N(A|GPO0$vDv`kRa?@@G+Ui5j07ihV45&IhZ&0r<@O^I|OprHL5 zi4)(HxQqjfnDmV(#wNh@b-zY&d3W>9MLo|<-;DD`Jr7N%+f@4bTm!z33fWZiM25FC zP(Y-hO#k>(tOC{l0O|iOt{3$L`Axa>vYx!@#6|Wi>)xvmpisr~j`Hp|>6~v-kvtIY zVlO{MB4vgRo%Jtrod@+dfu{`nO1ieiawcNA-ExzP<{{$T0S^6K{J{@UAD%`!-v~`& zcdyL(${a5qAI@JBgc8)=O(gx}>B3+9^g-Pi*`fah=$OCSK}r4^05;~Y2y~%7`bF4H z`pZuQ4u5?K#ezvcgyNz7)xtIO>;J(__rI^Mi}1&# zf6WFu=C6IYB7b=RWB&RXx92_m=Ntkkcv0Ve5jWk|zy2?ZrN6SlKeWG|BLS#sH8bJ< zFX~YKdH`kmy-aYBDk~!EY`}G#zcN|hy?Pjh!~5%c5^3?*RH3l`b>PWgza<@#@>eA| z^rtVh`0F?@pU7ViLz?tg4oSZk*Dn6L73i414oH86fsOfV60p?2rn28q@S=Xu!%esO z>s&VZK^hM`z(2IVCUOn^`iqcFexvp(fBgf(^>?WTG0<)z{eO?^IDfT63iYo(6b|pN zACX9lzi#5X59+T1PyV`;u9NatFF5q^_+$333TX0){Ppn#roX;U(%;3ki@$yabj)83 zprroQ2W-q=%b^ST>n7Muj)#khz%d@KVw1DK22eb-zi#9j`t`Gzsb8n|Dt{HBO#ciM z9HiiQlk~rwL^{XAeL#}GG60A7*T2tarFkDXTBkq7bsp3&0yp{Vi*%iozXl;m|2+Pf z{<;q`hV)mZfl4+!Yn#TzZ(~{S0nme~V#t*}Z6DQ>%h#|DzHf(G^owz=vfvG~($Av= z0>3YR9+^UXVrmAaYyB7@de%?xq737fm*}CCmk93$dujLcrQI6}pb}*+`Y%B$`UYH3 z3alPNMMyIFycOohIZ@-@6{&G2VaWR%v4)bJs+n+{^60NZ9D9E)ip#tIhM3VSxR{00 z<#v$h*W-^5iOm3M7@MMtfiCGjPP!hzDaB(ppb$>gzsd%APya2Hl<~M5Nd#+jR!pPc zQ5(cJx(dM0-{_(*&y@B^HNK3rN~BXNz2avldq@^4{Sx!{>yNU*gk64sGW`K2I7q52 zK$*S?*KwhFIjg=`Z$qJLXp(JF%`Sch>?e_yq2vOgyM7z+6q*M~2U}=X;qwlZ5n8e< zkvF5sdL@bLXO%&s9qv9(bsg06f!7~Am*Unq`~i?yH|Tfa`tUD4M#*nboG4#TK7KnP zPsVQ=)z`|`sQ*QM3XG!H;W`$-i>Fcu_3Q6Wb;R#Hkh#V0>%cqW_jE=bL=7r_x03;6 z{630G?eWX;?ucLNKO)5RNf76Z-`ly^jNkX5t$q*wQ2h46#FqH&1X{%})S&nc10{r$ z6(#}8^B-i&_%+S}0cm83-*c5lSWkdI>G)0M%KG)E$p)zWeYTE>-?veZ{w7r>ro!7$ zroW2oxcF^`6dGC|N8#}Cdq0V^#4pD)0VnqeJLu?AH?-8bYAg^zdQJ62m1BPfwhglHxt5T z{GCi~vyZ>mfK)g{#qWDWB;)se@~3V5<#>0*FZCZ8zf}sG zIG6a{3A}zW{#eJ~GjJ{9_d3+}$>TQ_@?`vWQGM^9X}W1MD$xIg>s@C2zA{;izs`;x`vQvd1sSyCZ(7|H$~=1aZ#zoyf&z{DwfHPsJaX z@i!G{6~9n};&*Ve5>7$0i4F9geh*4z{C<@P9P#^IYJEE_vjf=w+?@-@mq~+5x?I7TcY@_Ma0ol!2hJXzVb(5yZKwMrQMHHa^Xya=RvFt zPa9~V9f?K}f%N;Nw64+iiQGXV7?%JCvAY zn%hO~l*8&%imIM{QcUuZQrj&R*jzr-7sq^oFu+vtB07BzFoVQ+$w%07Qb%@1%RUVHls26 z6wxB;w@~>hwiv!|Mb+~UIqUsEaVuV?97W9edq_6L^pwpo1wHHx zH9ny4)Bvjn26`7(e~`$yUr?o=f(X)Q5lI!_uPyKXqg*Jo3;lEtYji}P!bFx~H2oHQ zq62LY9&pWLyHJ(>eg-64g7MoTZ-oka1C_sqa-a9D!}DNnfs+Tuj*xSU{YKvgqD!x=Z?j)_)EMs2K zP7}URFTzM3-W|#3ERHtV#I8&x+Iz#Fy5=&AB3etJ<;ucVs0Yqf!HA|b*3=t{F*e4; zF4dQ`=?mH{R%xcGmY~I=6+#$xL*l(MR)w~A#l(R@Z1NN+vyd7i==m$%)(Y+FnObv8 zG^L2RQWeIoNN((kTNJy*OPMx|*qjEP1c_>!x?;t}g{i&eGFDZrxt3ykWlX|W5+r3g z#s2wADvJF$(aZ~Pc2QZ4zp$jFDu%19T3oZZcyYOZQDMb`^0JBrv7+ilMN6vvl|G9E zfx2c%S@A+AU6rq}#9wq>jn7$dZB2)Lnt#%&My+Z)?ljR;)m{%A>KRE)+pnM?Hba%C_cUOSIJ!4z#ug z>pjts2lTwBnW8kau_fwRQ9na44$WujCl1!3`C@*wu+8*P&C463RQ1sOD#qfu5r(Y! z(EJqf6nJs`bcWrwzl=)&+pT*F`(>0jZYq2=(1q=rpf3t3JPhqgyV zxCm5nZV73d2v0+x)zcF4w1xw9K{AbpiW^&2dg=qw07d$6`j~^9sm%&}1R&ZNYVp)9 zAJ#6aeG*K+7dj592+{$=0o&HI2~*Pje^| z^h6s1EuP#Q&vJOHmFyE|Ul)O)mS~`{rPb4fm=h8%5gJ_*lQXoPS*SUIn%1Im!3>}w z8VNn^5>Bv@3EOF^c8$&PQyLFo!u68d?tNL-UDE z%1HI$V2zhVoyfKCI8|jo#QM>R^&$6hf>lZ?qK3AUOoMHWbD#5^jT&06XsxRQI46mZ zuq5QU2N=ntxzwTH(DFDwXpFYCJbo^82!$u({9%e3eoh>|Kawyt3dO5-A`xembRuJ! zYx|T+NkrVxcIUWI(mqiGZIVu`OL2dUYo|kClGBoN6~T)Ke{7NAERQW}#OlPoJhpmq zmW!nitx$&I7h1S2jzs;jWe(dy(*}2sIyd#xGx5?Oeda}f@3>Kl^RD-g8)3lBfL(x@ zM~)kVc(LOsppNUb504vpr)XOKzmFRO_`XWRvE#;Q{PI=T@#97&b|CK53}YFfo?;l4 z>9`(a7+ru}X@=1UxNW>)90hEcXc*bp!&!<4qz!tq?&-nk8r zQA+{S@CtVaU<0jCxqARqAP{f6-dVA}T#V>I^DPIFwfZKK NlJoop| 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 NlJoop| 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 { + if (err) { + console.log('Sorry, something went wrong configuring I2C bus 6 :('); + } else { + console.log('Hey!, I2C bus 6 is ready for usage :)'); + console.log('Run "i2cdetect -y -r 6" to list the devices on bus 6'); + } +}); +``` + diff --git a/node_modules/i2c-bus/doc/raspberry-pi-i2c.md b/node_modules/i2c-bus/doc/raspberry-pi-i2c.md new file mode 100644 index 0000000..a26057f --- /dev/null +++ b/node_modules/i2c-bus/doc/raspberry-pi-i2c.md @@ -0,0 +1,80 @@ +## Configuring I2C on the Raspberry Pi + +This guide assumes that release 2015-01-31 or later of the Raspbian Operating +System is being used. + +An I2C bus is broken out to pins 3 (SDA) and 5 (SCL) on the P1 header. The +number of steps that need to be performed to configure this I2C bus for usage +by user `pi` on Raspbian without root privileges is highly dependent in the +version of Raspbian being used. + +### Configuring I2C with raspi-config + +With Raspbian Jessie 2015-11-21 or later the complete configuration can be +performed with the `raspi-config` software configuration tool which can be run +from a terminal window as follows: + +``` +sudo raspi-config +``` + +In the `raspi-config` user interface navigate to `Interfacing Options >> I2C` +and answer the question `"Would you like the ARM I2C interface to be enabled?"` +with ``. After the next reboot user `pi` will be able to use the I2C bus +without root privileges. + +### Configuring I2C Manually + +On older versions of Raspbian (prior to Raspbian Jessie 2015-11-21) the +`raspi-config` tool can still be used to configure the I2C bus, but additional +steps typically need to be performed. + +#### Step 1 - Enable I2C + +To enable I2C ensure that `/boot/config.txt` contains the following line: + +``` +dtparam=i2c_arm=on +``` + +#### Step 2 - Enable user space access to I2C + +To enable userspace access to I2C ensure that `/etc/modules` contains the +following line: + +``` +i2c-dev +``` + +#### Step 3 - Setting the I2C baudrate + +The default I2C baudrate is 100000. If required, this can be changed with the +`i2c_arm_baudrate` parameter. For example, to set the baudrate to 400000, add +the following line to `/boot/config.txt`: + +``` +dtparam=i2c_arm_baudrate=400000 +``` + +#### Step 4 - I2C access without root privileges + +If release 2015-05-05 or later of the Raspbian Operating System is being used, +this step can be skipped as user `pi` can access the I2C bus without root +privileges. + +If an earlier release of the Raspbian Operating System is being used, create a +file called `99-i2c.rules` in directory `/etc/udev/rules.d` with the following +content: + +``` +SUBSYSTEM=="i2c-dev", MODE="0666" +``` + +This will give all users access to I2C and sudo need not be specified when +executing programs using i2c-bus. A more selective rule should be used if +required. + +#### Step 5 - Reboot the Raspberry Pi + +After performing the above steps, reboot the Raspberry Pi. + diff --git a/node_modules/i2c-bus/doc/raspberry-pi-software-i2c.md b/node_modules/i2c-bus/doc/raspberry-pi-software-i2c.md new file mode 100644 index 0000000..cdede3b --- /dev/null +++ b/node_modules/i2c-bus/doc/raspberry-pi-software-i2c.md @@ -0,0 +1,31 @@ +## Configuring Software I2C on the Raspberry Pi + +Raspbian has a software I2C driver that can be enabled by adding the following +line to `/boot/config.txt`: + +``` +dtoverlay=i2c-gpio,bus=3 +``` + +This will create an I2C bus called `/dev/i2c-3`. SDA will be on GPIO23 and SCL +will be on GPIO24 which are pins 16 and 18 on the GPIO header respectively. + +For further information about `i2c-gpio` and the parameters it supports see +`/boot/overlays/README` on the Raspberry Pi. + +The advantage of software I2C over hardware I2C on the Raspberry Pi is that +software I2C supports I2C clock stretching. Hardware I2C doesn't support I2C +clock stretching due to a +[hardware bug](http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html). + +Some devices like the BNO055 9-axis absolute orientation sensor rely on I2C +clock stretching and will not function correctly with hardware I2C on a +Raspberry Pi. Using software I2C to communicate with the BNO055 will resolve +this issue. + +Another typical use case for software I2C is communication with AVR +microcontrollers, for example, the ATmega328P microcontroller on an Arduino +UNO. AVR microcontrollers are not particularly fast and it's relatively easy +to implement AVR code that relies on I2C clock stretching. Using software I2C +to communicate with the AVR will resolve I2C clock stretching issues. + diff --git a/node_modules/i2c-bus/example/ds1621-async-callback.js b/node_modules/i2c-bus/example/ds1621-async-callback.js new file mode 100644 index 0000000..35e91f9 --- /dev/null +++ b/node_modules/i2c-bus/example/ds1621-async-callback.js @@ -0,0 +1,87 @@ +'use strict'; + +const async = require('async'); +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_CONFIG = 0xac; +const CMD_READ_TEMP = 0xaa; +const CMD_START_CONVERT = 0xee; + +const toCelsius = rawTemp => { + const halfDegrees = ((rawTemp & 0xff) << 1) + (rawTemp >> 15); + + if ((halfDegrees & 0x100) === 0) { + return halfDegrees / 2; // Temp +ve + } + + return -((~halfDegrees & 0xff) / 2); // Temp -ve +}; + +const displayTemperature = _ => { + let i2c1; + + async.series([ + cb => i2c1 = i2c.open(1, cb), + + // Enter one shot mode (this is a non volatile setting) + cb => i2c1.writeByte(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x01, cb), + + // Wait while non volatile memory busy + cb => { + const wait = _ => { + i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG, (err, config) => { + if (err) { + return cb(err); + } + if (config & 0x10) { + return wait(); + } + cb(null); + }); + }; + + wait(); + }, + + // Start temperature conversion + cb => i2c1.sendByte(DS1621_ADDR, CMD_START_CONVERT, cb), + + // Wait for temperature conversion to complete + cb => { + const wait = _ => { + i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG, (err, config) => { + if (err) { + return cb(err); + } + if ((config & 0x80) === 0) { + return wait(); + } + cb(null); + }); + }; + + wait(); + }, + + // Display temperature + cb => { + i2c1.readWord(DS1621_ADDR, CMD_READ_TEMP, (err, rawTemp) => { + if (err) { + return cb(err); + } + console.log('temp: ' + toCelsius(rawTemp)); + cb(null); + }); + }, + + cb => i2c1.close(cb) + ], err => { + if (err) { + throw err; + } + }); +}; + +displayTemperature(); + diff --git a/node_modules/i2c-bus/example/ds1621-bb.png b/node_modules/i2c-bus/example/ds1621-bb.png new file mode 100644 index 0000000000000000000000000000000000000000..99cd066f4ef3315ecf44b2d2b0b0949763864223 GIT binary patch literal 227449 zcmbq*cQ}>d|G$a|iLwbvlD)}DW@Zu&#~#PXPBu}>4k2WRP#l|Vl4KKdWUs93?5yAW z==1qrzu$kq>-xG*mmJ4=p67n<`+dLG`-D8WfA1n8Eg=pL&P63fxraD7xXU;==XMCr z!!ufiXLsP+1t&%16C9jd0oZ?MBDIgFaB!G#l;otfJcgIYJYUnhj!CV%yQ}v|ihEnd zvm~jN+!iKP!Has0!$4^Mj&mUn9e^q`2K|`wYzfv`4V(3GP(CZKLq@*e|Y;7 z_w?OzFuj@grZ)G9*VbIbrd-5^oX%hHf0mk>>K}0-K*mlKdw#k_*H2Hh`Em$ubldx> zBh8QG$O^HVNhOfBzqxP5Qt7;Y!jo?AtB; zNR;#zrY8xSIU(Y$9P{Jpe9Bo?@$A}5z~naJ(mg}ohF2^@2`Fc>cNijMg>g5bU*XS=l^#1cyd2iaraK^yVGD z(?3wNhM7unx3hlqsH;YulQzK7gE}Q8Wu4^Grb7nJP0Da)hVc8!2uJlxfwe}$Vrt&9 zva-PnnWQYYY-{JsOd+8z3jr|K0Wf*!E9Q~Bl<6a;d1*zqzmCvKP( zQ^VstKK{M2o>^zpMt?lf%}#;G$NTf|SIOW@BjiJF=sA3n$?`#?rk$0M zV%tG(+!xZq#Mocqojp^#*)8rdpW?p$D@Oe+PGVxB6ZS0zan9UTsGPehDnxpEdg~(-$CS}5rtp`#4Zf1xHOu@z?LPJY zHh@)hQC@?I;4H56+t-6S+OA)WywRgt{1@c4P5Bd;LZ@G*41Sbo(ToyLQFWoqUTb=j z@fpQ09sOQOGN`TcUbf14vR+*YhD*YZXV^mhwb%o!SpDHurWi9cB*1&&6dT*P=-kNCq4;%%;QU$Mq^=v1Jjgf=0b9yvF&v-q z&YekKSbkYkOJDkXNhQfbIJ3H1%rFx%SRVxlH6Y0Qw%X|B+glWYE2=Pk0@aN>J-wB~1J zP6{B6;=UBSJU z=l%*#42~_`(C{8lyrC!P0dH{bZyT+FAE-|wcEWF}#%@UQXpon7=Vg>!esS&`H7)(i zrbW(2kxWX_lZnrsyj4vvw^^zp%33!P(a<2NQ)lB~5xJge19+!A|}FDkb&`Wpc}K4)TMV>RdIXJRNU z-bX9F^p_Sjs%8+{$_cVSi*9-Xk==j}n`9y3_ny@C`3xa<9C$KSSuVq5&T(<}k|v#W5`C@6 z@>-R}BeRP)%842$TV7p^IfG_%{A$Rg-^s4u;iNwxm^c{Ubz01d zH=FNH$vK>#dac{OzVG8CN>6&@LIz8tS^1Z>O|{mqtDzb1R(|q*z|oR_o}2ptUBJDF zItlTh$5FncZm7{OJ2{#wgYOEXnt(1aX zv%|`+7uMwFCde4+-SVE;uQlrOJacot4~C`Jey9X*;xDGcY5MC0;qx#o#4da5rUu?C z<=8@0zu)C(GZ&FoCU%ww@61i_%H|9Wt=a}sT%0$tv8L}D7(b#eKMc9qOoe;KVoiOg zkc}`SiXc#eK`~mZq-yrfZV)E5ecUy1lY7cmi8Uts^DU*zj&o;W`O7&ov{G^#8BB+9 zTdy{0@rM*dM4*=t?FOaI88!SHuUneJ?#sQo=jSI?zf)c~6{}-pik;SE!uG>2^YtsH z#V7VjgzbLvF79*wBzqPUCV+F-SpCvpFE1P>fp~+@Yxg`uZW@u}o`HQ7IdcB*-|vI{ z=kmG`(MFH|9LRtBN>1&Ux@e*O z(a1_nT-WVog52CMYr9SG=bs9=Hz&}4y>#;td*eKFYJxRQXSB7+BAb=}ctyA2N|Taa z2)OTg5a=)c7FC66GX3Z>Xqk}}<}yVle_NWAN$E0+QsP6&yCK1rwDKBGP|eI|zJ{b)_GZCl-#>HayszfO4uIrh*R8^V7LblLE7e` z!7%Aae9FA?_hGDXPSVjVPy@eypJbXYrY4t{=A?Y#=u!F0{$uTgEH7=yXAy~41ra2~ zUJ_2#1~-zDc=`iFolD+|O-oU}%+5|6)`R^x0)yBK3?lPBxueQ*S<|v@{o&#L(h4TB z6z-kXv9NO6!Rc_3aTDxxi8AfACO0; zp>=sfbU1>s=MV~G=ISc}Wh3;tXS$q$I~WYw9(KA9`FS(plFdJt-8z$`7{_kjN6iIy z9-XMq@4k+}U{rZV&F@9L^W9mFF7Q&3(^B?37@1ga=J6$qQhXUM4Y)wwbG2$7z~FkG z@sZ7!xpMPHhd@njip{wmMpx?J=xVX|4?jldJLwr}#+2(q<>PJp^K!d8isix+TH4pa zEm4Xr@7M@gVm`i?+{ZCNJeB;h^_o`tSsTiq?Y`D#*TqEeT8_*zEbIMX{^Lgf+CmYHc>^hLw;lWr-0p$544;HG8uaA^>+Au_ zoNODP2-$myT!FgradWrftbCKni+QogL$ELTlKHEiTruzyjwl8!umrqOnxo} zu!R;4+tr4Id|+oKi`WbbdAV}szf>4;`a_|SHiId~qjj=V~_+~MnC+t;mag+wG1KI!+Z!IqU2?+`g z&K88NxcaYGGM^O*EfqKC{%8zb?wI?;(>=IFjQ~TLGcNS^_rF*wY+x808@u7HhQ*%N z$}ub#xGU)H$J;&(O1;v%xaQt)aCNo*z(E)n)~Q-$YAVC1Q`1Fi1_ti7rQ(0QtiL;s zOMgAw(dWfQ>}`*kTj%4cT!;BB7 zD|NE0{sHIg@XULW(-?h6c?pJ70ML7DqoU#HqVdV!!Io`WD3b8iTSgkLurbTyNAvvd zv(tH&^P^u~D%>jV>8FJms2ngN8IPuRMjTtFnu3N%;fw@t_{`8ve2%()FH|fJPyCe8 ztw;j6_4vD(^Y0ZFP;Yz|RgBqf$Ox|_MfR~M`Ez!V%98<<0FJ?%pb9XkXvpq0%SRNF zHRb|5qFJs*DZb0gBZB_}pchWMn4z1fSHeVqoTrFvc|83!L^W>AA&80KMwfD$jv%eP zy80y)vb)UmW4A4eE;J+9S}?S}{*GcaZr%W4QWv6RGqC_yy46NDtp~qwkSL}NH>vA< zSo6a^VZo%X*DMz@*uE@nf0^Huj8==g9|NbQnkz?v`p7SE>?Q~uK$v5gYVsA$Pqmk$wL4VtS z#IfP(?zp$3Y0sgZm@<{80%Z)8HvR-Tc);m1kv{8ReA&N9KX|T^MG4+IaoX4+u4(F7 z$1LrjXI7Z=^&S<{muSw0iA(VvctK5k1)H=S9G63wNC{9S-@J_wc|uF`6u4(XxDZGPjx*LsfyKE;#+f1CA65lAvo!m)ko!S`1y< z<6&UQ-~rEd@B=yPw0zQgdr`)4wI?svX0BEyofL&s@btWmLNW|`A~`9?(%eyWiCvbJ zW2=v?$a)uVMk!9J82`NtFQj_`>n{7fRjTLtJVgE%05-OJ)FdG(Q+;(I-+u3B<+7iB zjsw&xolRK-S;7f;I&w%;UE_^vTyCzs6^$ehTxQ{*zDr#1_><5Kl-Fa5q}bKxqKL;D z8sx;6E}46HycO9e@Ml7Km4y!k!Yl$ZI+IvAYOP)eP`t6R@v)>GZI?33<#i7Ud8@3E z?~0H4q7+R`Ox}H1omk|o8FTnhNgdfTwc!!k&79Fc$m6>~L@(wNe7eFkhp)Pio+%u( z_3)!y&c>0~2<7$<4`NZmyOi>(Wd?7|JvomvHqtfXGmG2V_3tt!jX)+0MQXK~NK()sWq%jFQk>4iqu7 z+g@a0&4gkKq%Zx0rt@<3v@q6%@yc1D+(lPv#A_BVP7Xel0{BYYRJNi?(dUyiHY_mVecR?- zW$;$qyq$3&c}X z<9+;rtM|=Tm!t2MUh6lf_dh2fC)JCPPQ>BsJ*mIF#cA6=4RQi=bE&sHCa=$1@7Rc5g223Q-eh)YjH6pkY&_fZg%|;!^eSu%6v$ zC7G+MYa(aGh@|EHdb2%_!dm}(j86sg@C^+OuR2sto&WIznBJ{We-qwdU_MQ|rUgiRYnD8-FYqU16#jXwwI2WOWxfK=(RKO29#bGQsY(59#ubE7*xoR^A35>3DU zsfmKk-rb25h<%eAA?5kjm7^=LWvw{+iRbC!Cnvx74Xfpf+uC?axuFL6*O`rsk}p%d ztCcemXtS$M&Xp@`e!zx6lu6{wlpS?0^|`}Xzn$-BL9z5KrVcml=?;=!!h_e=8|pH1 z6z`kZk-WB z@y5P1b#--~kwew491lNgVT7;aiA$5ZFxKMZ<8LyQT69o$CHpFr$Z7mQ)$L7(Wp+>P z#5Wwu_a7^iY!Tjo``;}-n2?*hw`6>hJLDk9F$l6sygR|`+}xkluC^M;{#YZr<5l;D z4smxBkb+P4BPB4^%szZh#>wyA-LMeG z-Ev@X^F^pNq4(ZYQ18G%^C@!c?*k+!Id?XQ^JfZk2AgGId`hUlVFBF6S6-@YVgD(Y|>!sL_OUWn~4=ibC@zEj>Mb`TCty^yooRO^tUa zp7mDAE6$>rq}bGXXTg?;s~o>;w{-iOURC|X?R`T|60`x}KlESK%D>C>3>K@)mX(U| z6`H3-T-uE-txIog21d=gI~31oJ2GBJX0dli4BW}hO^uEXQqMVfindK3^i`M>=FEPe zw_M)d#sBaD=guxvsW3^N>ka2(66ED_(k6~p-R1Lj)v-`7R^o8IDbr2$?RS4eFAJ5L zF_NUNKp?rqBqYqF1aE39)T>(n5_F)TL|>yO?p{chR}c~s3jceO)Mfc&u5%uRDkiSO zpDQl06Q*NlXD96L^EP4R=$LhW#M;QSQ%lLEC-|FhU|=9o=^&hQSVNT#GdO75Z7#uK znY!w{b}?@tG>{KrkqV`L^*}X!Fb|DZ-K-JNK$e%6n{zXz$7^@44K5FrwiswsX(8bx z%nQDYJ4d~iDY1;+GGl-eN)mJqz(PXLuZKO46OIqntvn@CFLY!i++c{DX~btl$pRi zgf0zxl_-=rF41gh_;h<9lak`jMu@ugCzwYZqQ)S(WKz0t*Y8bd zlw@y8rr93--Oj8JGW3`VNL*1^+aKNi&|AWy^aXpE+usxst992xr#~PqOKCWC3VzUQ zs*&U8ki;9uQ%@jJn#wMnmtP%0T3916siYeYw0Q1Ta zWz)f%1SCTwQ_p5`;G1cKr__!ak5O3d`NBc*Rh~**>1SP*O&fn^kVyP|d?DmAo@%ql zT!NJ#5jU1nq!jq>cNov5IM)AC7XX|MXXEu#wI>X*e9oUm2^6hB1{~RRQc$41N9uUo zWxPSS$D(CW_7b1=NbVY-k);Zo4=mMsHnmI;uC7A$8{v)%JGgpP&NmSGdRbLD&feLx zF(Xeh>+2a#Hl+FU?26_>`Kgt7_$5J zEu8N0HySIHeT80rAmLpvB$crbAIKl?ZjalPPiH4N$f&8QVccM{TkqNPC;Z?FHio;H z_;kfh+@WfgQf+Nu1C?*wz>xO$M~>iuSjzpwrH13YId>m4gJ-727;wL8c}KW@eaAZO z&0&So?3%53y|vrp9d@>S7J0sy1fU)QJ3?`>@xvUr9f%|hw&08-(Tpe=|*;*I*Gv(&wL<$QN?`nKEJM438 z?6zV6mx18qU8UqPdX;u^IPU>FPw)761nd)YbCzmTXGMoHo2}Pkp?ux)Pw|{f@R)p# zUu51wQdUuMogp%_s)`2CLp4&NP)C9x2*k1BlP1PvUXV?tYmfgf{RbMt*t!JWqKu{p zYZjFJ-3_-FE9ZKwln;I%8v`Gs$Zm*VOGjskQi!mvy>3D$UoSwQN8*ZO?Z$b)hUvNN z-C|3eV;M`5YnG% z^6ye%3oMFfDdO%K4GoNLHCH?0c?J!1q)CabvU+S$QwVbTQRfaW-8wHJfDYmCK9vUC zoW}JAPmcYW7E*2NH`|X4Ddow4QBysJ>0<)E5s(Wu4vwZjvmLHsZ2_noF>Pq((l*o= zzrz;4Nvv5iUgr%IkUD%eJuu~@ zG4Ka($Ul%=-IB7)089vZE32DWw>CIC7R%80maU}nhK&0BQwD4XxbALkZ>NJ=4IA=X z5y#YQkJqZKV75LmGBSD)2PP{+Sy>s-9h}X%u6~I<))*zwAAzUQJe38v!dftQF~F=` zuh_DSmgVw=F$#wMOWgtF&-##6gPl`Olha{53Y?U(`ua($#U-3nTD1?z!Nc1_gPj~N+fmoWLVqV(Mdq~_&% zLn8z?iCW++G*S6^c})X4#^F;_rf><13`;IzM6?f+>k(D*!B~rB*tW2Fa*|1cL46!u zJZDRH%kX`77XYQZP_!-Ys7rFk=eVh@_{ zYHD7Af&AXzf39Jo(Ay4)qzP)OKe-d5f7e!7xN&|ny{_)6hB`UyF-|pO2@Fmbr_R^T zdtCZc^eQ(u*Z)q;rUmRJ*XBY@F=(Vyl|dqBX%G59{+vbucw@z6a6hbvZ~GpKj(aU} zt$e6`h_@ig`^}6`V(Yu?&rkOHmPt$mx=@%vZC!gq^y0r+fD$x*u9K+Up0qX(2R(_E zmvC0re4t*9n>_--M(*Fgn7lEua5F|}%)j57MM*|mTf0$`{7Q(N<>fyzs~_9j+x<(Y zH#{tzT{BTg?%&V(D8pz{9XY!|Sj@=CnA{9)HcLn=e~rI0dhN9U61JW(2c8da%}a;A z8MI2Pvs}I<+Tl<^r6tJVX(XJK|Bf@LNka<(Pk*?{?o^_yV;w01LNiGaQ8%yzj>_F_ z7nV?Fl95a2_TD}F#8i*tceu&8(c^b4VEc1tx;YFxZMG`C`2)(1=8i;p+)~pQ30Rcc ziC?H$bwzfytQj9lj(g06tHv=ASUWg;lczF#xmvQSin-&-i1@10x!@`M$PQR+VeKEn zfAc$QKGplaW)TOH>gA|RQf_YLTKxf_=|!+-9b3|lw{DK%OJ_F6jt$Xtqr*+xnu zpX{4dc1tFPvm=ARABERx+~kp`al32ina0mt1DA zDqojk)O)ziA2_wOFIr^dg0_*w;BytP(QXG zk~cfWv4yhn@bFZ}KfY$q7Rn6RC6pmLrJKJb_XCU42Q->9mmnds6irN&m}nw)ao(@< zDA`U~cnZr!0Lf-2m~Q|r-|H|w_OD8h$@`lflppcw>!EepiCP;gxcv<+SS%Y0$_SQZ zW3l$dsX#RP<5q&IX8&AQQq>n;*h7uk21lvFYK1W5)dnnz+6kOT}F9x&^k|Zee-L>cYz@s{OTce=y=W&bPs>; zquCB1{0Vrbz!tjLU5>S`<4TKig}Gjr(&>{N2TEoH+h*-SMR|F8O%0vy%M7WQek3Sw z;Q8MhKZ<0K42|^N%Dg*+Kk~|VQCfg1s0l(Cy)JPKYP`-G4bhUl^LO5aBkrn5y}T;! zMm(SVRH;; zvE?OhC-n;XR(pNkPerBUZHtSmYkGBYVpGd^NkK~mHTO5W>bfii-o)w` z#aPgsteqT5jb)61WVOL_@`nd-bSVt=eUYlP7_Mwe1HYr~#0+{IEiJ7{fQGG{3{ecZ zHd{~lkM`5JNf=@xr{3Ir=>4TMW|UUtl4ajZbyz8C`a@* ztyS{l^H}S?c4ydD)NL8dJSaJJpUH<&J_>Bm%SW{4EVlc>Q55dP#LLG|z1wC=j8?M- zz*vK(Gd}(k{}}9AdMRIeI0PJ2x6ouX?v-ihcJbVjHt7m-@`}Xe!JBWwTH6w0GPm?$TGYk9IJedHk{Js z6xnk+0c9;@qJwAxx%c9&xbkITX)(hA<)llVIJ-ndNfh zpRdki=qMu9_obA0lGVj-9 zHON7~#-;;WOOhWoJ+zqpWXf_`+R@PwK^OO@HhW2ur-L7M8Wtr;Fi_Le!^ry&*a&T9 z$)+P0mq7iV+V;BE;mn$+wWeM*KfB>ExqEOEVpzhm(Ja9k!5}Z-o_(&0xJ9)~CeQbz zhsggKI6E-HaH&aM-*!FDrM0OQvjXmi7Xu{0xxe#4#gBEw#(u^@R$c>S?p|`+_R*m0 zrJR%7Z(tD``BOIFN!m~irs z>C=~lqoVKA?{F#{Gh9{_6c7td^>{gS~fG^f*DbQ(Inr+`_PaUoxuxS{Pv+#!7 zdUl8Tp|(&A1^7uymq#6TD|OmCD?HR45PY%>+a=&~*}!F$l)x!qotuF$c4NA^)OgMg zz_ZK6LZL3+XFmIw-l65ZNV=qA{FBks&#GkkB5BIu<>#RX=CRm)gmrOcMP8Kt+xz2f ziG+Z2l($|*SqwQjqCsT?(~B*Xe+t=X;$(naWVmiVhM$`Y+K!2n6R&M0B0Yd8sY`gy z^H%8DQ;$Zxfb+WKdo69i;7#l6PQ9Sw^^WU?W_$)WZEcq-#iCsABE@U)4j}zSN_;-d zx1ki`lcnJO0B}Ii0Vea??yU3OoiY#A}Msc*YZ{}02qAYv2zMQ7)x_&ea zL^4W|9OFs8$nvhC!0s#7)*mLBA5>T9UjuBc(VXvcsZ8dp8J|bpxc>;RaZg&WT&BjJ zPrXtbAdMMzQ8f_&B9oq+FB(lWnz^tzC2nGkC$|#LkcdHHb@zaX+u?#g&gn0D<~cl~ z-nr0G>Md+|)q&MhI~0X2zT#q@%QuM2h1Dp?P)z6REB30LU-@#8&BB5hbROiJw3h>cZc-RKrydskWt_5*ns z6%VG?65K%0M1ZKjiA}w(!LzhdF`)ol5JV?n=IBRDTVFU8!ro@E{ieJ&vmrX}dteW6 z;aaS+DX18UgTw(cMSA%&3}-#71rk)NiAG<_T&sn!)WYK8bIuOkGV7@9?{jdm>^oWW zc^$L62OEGcGQn3t6{ zapOI(Y6a%C5s1L-Y*w|k8lZDOFc{iy<(}~P4v@=1K$SN(W&{@zYxQ`l6%K|$9JM${ zsP~bo20837CI2d>S);@Ge!6bV*jRYYYBkZR7m~p?4Gi?#O%T4YcFMb{s-IgW!y_Y) zA=8psQzKrg7R_Sd+;*dK{R>g)&PCj_f%9hl9Pi4@$|h62SEY@OjS*9(W7V#rYqgst zI~UKt2n_6-6EAEEx-eqGv~&E6Nnrh#M%Pg^;j-$De>}) zjgOxJIQ}*H_7naQpcYVfM^+dFZb~-j7f3;r^3*Ju+eQ}@e7h(z`t0vtFExaN#`uEg z$J|gVBabsZ5}T?Rn@lV^09RiFSorq(Rl)$`9;%P=+dnkbrvj*qT4~wgG9!~5sxM$w zGR{n6cGBJ-5IBh0W;opyVnCC5qPVOYJJQcaPB`_?z2H8YJm^#5nSyxRAb1F0xkNhF zc4r_ab^p}am~rTcC%Ox{lLHEw!0VjX``pFJlH2aG;vEMkJ}1qWwk48rFnO)jzg_iu zXht>_1|+_4>}^OiP4{hJjFjA=2GWn&QDiZ*_HgrR{t@N2IvRpSFNp^p9v;+SZV-UC zCxmQH9RxzPzK|Jd!{8#xaOu=ed99y`TpU2&8!oXRO7)n&&{a1uF%fx>!BY;aqB&EQ z;yeQd(7ZoeEzy(98*I7O>yg&J@uKlpdl$p|Z(}uI)f4?-2%~_K+a-Gp)bjnU2d}o; zISQF#l`ZTA9@<@&*Vw%#RdJWE50qP>0J7`IXqHDMMm`(O8uN@C!YYos6Ts8%ab30> ztJW^i5RvCFUiKhAd zX{$ZBm#IG0^slv9E|E3sL+b5XNx(ap^6HSvC=T zC9hQ-5S)}v*=k9DR;2_5UrKuKSo>Cl8kPkH->);H%7Z8?b0W7NQL%~0xy6gSohwJN z5FB{d&|tjz&R7-G_yYf)Br6nnYil;!q$qsHI<#yMNx0Xmahrr@a`IQnI_m0?+18ft zFK&mv04JlO!nV6f5u;i)57j4vK~n5DpS`_3I2i`u+DCSGcWXrUCgps5J5l)j`Ew1T zwS90O);dNvf3L1Gl;W#?EP+z^ZJAHUj_z{r53OZo%qc!TL*(|x^u40?f=&KRRFbxx z8(#~}Z3V})HapoJdiIqg?RHxsja`F}Mmbu$-6%`QSR7tI-O92F&%d|=NS*~769HWh z9#5Y>1!->m;OIu0qAoy}d<+^5+uGjIF^!~qd@ue=mP&kt*Q;i;w#2&(&(a5AQ~l>V zkOW<~J-ffP%>}Zr$Hufqj8w6s27_cpZULKKx{743BfVr-3aaL4yJX0#kX4~w)xb$y=Pl^CY|GN@tNXpvszB?#$0cmw z(km}tZo0aC8TZVfp}XNYv{hixuQ&<5d>9ll1~uhpk*VzXQ9gpBTk6E8i%)@2zslGL z!Zv8*hC6G=Btf#JgrzJ>fhEp89hRk2xp@WcHGW8Bf+dAzOdIM0)14~>{y1O<&CIrJ zq|Qjvmoa=j({YCW6XQ4dR?Af%E@I{gQ`&m8DYzfmGTOqAJm@+QKssJBc_1U+45>;6Z zuH)Lr%eI%ysZls5W;z5#-`HMjhNWkRP>_E0}z@2Xt&B z+-t_LDe#;sDSKgki1FbRnKqqA>sQ<_tpkReb}%|G7~q+S>`#Hb-N=fl-HAzRAEhRd zo+_7hMR{h^abx==Ff(duYPRYMcn#P))yS(mBx9UApE7-3708|1h*#yA$=)jO`};G! zx-F-?)@WyKO#p%{-gY2_!Vq}_-(SqNasn6xrGaK*lbIpXHq->P-o5=EzX-z`xAe@+ zb5l;#Dsi0BuCC>C9y$GwDlbAc0%%-~01)-<+$D);V>RxXAoYSKs1naTK+fG45GYfs zAO<}g8<2}TTjRclMO6Uh6O)o$y~*b&N4~YUbA9&NYhwKN;?kX9>~X+U2VMl*qAbij z2Rhn1zwMG!%L1$R7MtV$b0n~D(3Ace5@u$_Z?l6-9md3st<+52OpxTZhG3##U0fv)%(X^=ne;Htoq+XRSggo8=bb(F|GN8Q!_H1e`M z8P>zu_^AGr(6Mft5}YA02O^;I*?6slWavJiyRUQFT7xz9p2ai^NG{6g$yS~Luc;|I zJ!b7dp`Ms-Xb!3=EE}Q@TC6)kOJdAAwtEIE>?9mkJWwKX+xHT5adDZ1MB>8Q+C2b7 z*=#YVM#Q&d?^_}&g+F^Sm_SG!nt|H{_b+i!HR~bNU&su>NsriCKo<~(gwPva`Kbz+tqnW*}Jz`RIsWWpBm3?SoTERl{m$^oQ?>u z`Wu;jO$AR%m)*n>g+}4vR)H8WX5PQaMH!u?gDM|c(Ji&S2pD!eR?%K~E1JmXwtE6W&-vkNUTO z8(9Q*7)q@*!jM~-gEDN9#5TXMu!Ta$;Q9Et(VowpG4nA8cWLdWhZN zLx#sw=OY(r$O|3Gi|uB`)}gMT{ep9zQC?2*yb%X8CXB z)v8KxluLIa<(QqsQUV!5p#n>M#d{$=>UVPVv(!rc)T{vKjJx6R5BjKSiWm6os}lvO z1l8Y^$=|BG0bAlp5rcRUoB@?|sdWiGIMdzwqQ2L(?2%<@)rU=X;k?(=TdigxOayoo z5kRkB@!XGuI2mkCgn!4}Md{_YF^On&RP(M(2{wPm;0RVT@U3>N(clpbWfP)sP$KY- zjH<^RC_g+dY0>wxwyAz5EG5j?yX1+>8BqH?MC#56KAr^T)aC(78EzP#3g0dHH}< zUi<415XByG_w7H2!OH_XU;#3C78IHV_T{w5?J+>p^Mxd0}5a<(o$4#e^yYQsVM8=9i!EvC#GLva2DSjPRDV6nq) ztQ2ihtP8C!gtTHJdI-Z-GeVmM<2d41-WGD&Op4 zGG|{~3Gr#NS9sM^sDD1ToA!3H;8=|iRL|X7U|oW=17)UvC9jVKDo~a2CRzw5l_JX3 z(sZgXB9k$`_p`lgvGfMp=u_hdy?<~&pWPVRb>KsSqngO`T|o>iK8Wu<3ka~nP93r? za;%zshizq|!LQRCAZ!Vtn*zd#0#`alNUxat=<^^36IZT$QzvXdnJT3Z`bKY}O`?;u zb#z2bksBTod3VJ%=JBkF8m|lm#&{a_YdFv)s%BrPxzzuJBRipM?n009JTf1n)B%?DTz18a7_?>3-k4J(WlAND@(x1L^5skvD z8I}5;l$iKUA{$auOA`u#>i`k=n|wh`FlP{PUmf*7mBa6W9A1@H;RU#szitV~M9DfN z-Sk^l>$DX=c6c;CUEuinbSsnbYPt2`=qQ>d+rnkLV-y|fcQ}*iKdOjrc@fGBcNT&~ zePThMWKUA`O{pL&C}o$PF35WB78VpJn46nxz(MLpA-5QILnZFlSOaL#kldX6cZ^;( zWkit*Ys?T2XDAjt6**1Gbk&1q@g?vgo!|)MBh%5No?jqd>dQrH)UY2mn}3 z%=nL_&$0CBtsWN8jLGOhkffk;n$YET4fF$P4S-DgCib7A53A|N(P1Gt)zz*`g8#Ep z5GC?A`||uE=rIq$(Punbxc9Thod*~YA*dVJPE*~Yy8@lxY|3em10@qwWkBQ)DX_J* z-M~gbVJC0=*AQIj@lF{Mx-HSJ7zz`G8wNjdj;;fA4 z;&5!K3YtT%+;kfCp-*Y$#&8jG%6PhZHm0>%g$#41BR}5=l|3&^723gk~=m!A!p z{eRSYZ&YysR$RY5OD=yKSr(R-l_cc+JS3{QIy989X>$+^!qdYrQUR(4x7)N_uQU+- zn=h#g>+5=X*g)VDs%^5ihDIZ{`LBx_1{bn<9d?YwNVQUVJLG1M@V!J0BSWLDv!shX zCl;Z?9rVIhPa8jRRuj(-%%1jIk&(^vUAt111wDaHrod)ECPy3cfd3t zuR~*mtg#b$5>{FP=LdVny1ARtEVudt{h8iD3^x6NwM#45zaR4KV!&0i`eWXcW zD`&xj6nHZMF37pr3Gt;5Kv)0;zo4lV+kFAq=+#*Md_-P$%fr8SUMXZ^o8aXik7Awi zZjN2a>rah9$$fqo$Dv|m-6k_2d9YO&UIjZP$n%HJmgH?H{{GAYvhcT7Dfo@7s`ul} z8E|h-gkhIv@TGQU%)FWs{4I3tQqw&m+(Km6VQE7Iz&w2N-p0B_Zy_MFdJEz1E-onORdrW zNc2a(Ruv-`FY>5b;hlXB+fdd+YFb(uUTRJ;V2{-8u*-vGBgaNQt=8RxI^8z<8Cp8K zOcv8okfFZ}FJ`ZN7PZ=}6AZ>sdU|?Bci#8gZ?Tem08QzT!8*MvP%xvyipkBsrCz}} zPy<0M9$#K7)yv1bq(TzZBu|kX+6Gr6Z-I>ll!C1RU|jehPjLCGlDp}GC5&pOV?loy&&x;mg!9ox0$-%FIz5_cH8WbWWAlG`P($f?VL1LW$ zi}%6b?(ZM@O2JyGEcNpCE(ScdwY!@MA~crQF6&q$>Yvus)SSxr5N(^CorS?Dwruz( z$vZRL!`?Gyv8QRKL%0Glqp^X>IU`o0_=AMX@~Fk~Yh6_x~bdF`q72w44kuIs31 z0v|bm?X>ogNJXQCY%$nKSog40iUmqB)<|RNd%7&vxi0Zq0^kbLCOPQVrkMIg&P==j z0|@VMuR>!4Iz1dVk3SteEuj<~B|Bq8FK8l-Fq-a*^M@7z2mkVTd( zyHH;Cdk|%(h`jUH8gm#A3mR0TtDwuhf7Ap4sEkrT5K@!aOs-yRKYShoG`GH$^7FNX zybuBI*+l=6UT-69Z3%4K8AMNE4fBtHqT^7zq0pHkE>fzd@uqXs(OikAFDhvp+EPs* z8Hbc@2O9FYUri((3`GtOa>7TUg9@dvU>ton=?>vj4?2g93=PBKlxeW?A9|ykN(o!3 z2&~XEC;dAmcX;;kE(0$YwJTuDoeI>x@P{=Tnf))mygpz{Nl_ z2%3`~Q$%>l|BM1k4jL&>)9=1D^NpYS(b85$?OUSh4imCExXPT@onRg@B(h z@2pLvl>@A>qzF|IFC1l%gNa`WX$HYf*Bh5FU_UhCUL?bSok+Bh{ltQthNc084@DTf z7Ott)fCF?0odWWHetwu8T~15u)-vc7W?lvdf8(cluHV)eGUhd zn-&Id)lKgX)8c>Qr6<)=a>0@T8VQ=ipf@{0%y<+;e8J}P*8{lfWZFR8P)J!nh8FH# za-8Xn%Jj`X4z^dq?wC^@9zosKN0+<%g^1^s*D~Z)&_kB*gR|qyAN8|#ZL`T^T(Wd< zyr9=`a}{DPaMup6+v(lio(6P_lAdn` zn$$xVP9_6%pa@AuypkYZvbcKN8TG?lCjGTTWF?=YWy(~QdCK7WdQrBA?y_fi?7-k) z&Mjx!TSf~O;M`mPFc%XS7n(O^vCSUcghC0eLeM&Z!DJ61I_t;?a3RO2>4f0h{r36u z=eI=VZ`hY$Q#UVY9q#Sbh(wsmjW}n1lB1?%P*ZJxhmPWoKt=MAB4|%3a%4 zSltFypb5hJ_aw86i;F*?M>lf|3NYy3cE4)30*NDCjUWf}?QNLYLW&L_64o!>lV0*V zbb?RMQWVRr&D)D$w{Ljx^71}|(%1CFoiZBQ@A#4627ovf1eUHR<-e=`kAMz4Vd)T4 z2S22unFt<`<3a0W`U5rr7u#CdI2NToR7eH^qz58fR1$?!LaC}QeYG7dxVkOvhn2^J zCPo7|{z!VvQ&ODf_;cT28+e2ypKKxgt}b0;#3`u#qx^Gar?v&_R3>uPQQQef8G@7x zfqqPZVcwACuUc%p{NiAtaazUtH3Au|b3X3l1jb@#O#>LUbzbG!hT%qq1|p+Qpp$b^ z5^+~AWJJSRiT?H+T5&@gR6X2e&{MtEhvJ{AUMlFQY3P{!(gF@+229=f0h{K(+e@3P z#zJ_Q}l% z=tWe;ct`9WOLZ>(97~1V2?TCpAw}(-mzn>&MyKV}|qdcgt59 zGibGS%7J{f>HhWY$(%3F%R9)|oOjVqtEk_6%AZg9gova#=ufshDXuj3@#L?&PrcOZ zc~4zVO0}qqQHr=mg(C9=l?G+j{_pNw`=pm&3E@8YP@VL*KG1xw#Mc(jYN6Mxmc`^1P)WnI* zNptKr0Tf^s1VC?T7-7r+DDl{M8O%`B2*eP}zJfc?-kGn$U4`qnt@D3~`tEov+xLH! zw4`A~ks^C!he!z}BZP8i@0}eYl_(=BvPaol_6ik}y-6xch>}nV;rG7ue16~8%OB5U zbl>-NUFUfo$9o+FMUrcnInMXyglg#JhGxVhMNqw5h_1*R4@;6z|1RGOgDJ zUzI(%cjfe*icRqmsxG8g^J`4POm$$y+xIvyHbN?tWvwVlUGhvnKTVeZ-z6s(WN!LO znP8^V7FHWTEu7eK=hG)+y{_FF^*0V4$wkBE!R!I`kD&m)skasoW^k_LGqr0cK-fb9 zL-e2fcUlw;iYyex5Z;aJKYW=-P(MI2eiA|lYzI?&k5|3V)8RQ7%ESJh=;lpArTwv~ z9*uuiQ&6C8r2C~0`sNW2{n9mP<7WSihNhQ53$g#e0d#O$CB=L1DbP~1Hb3Gael!Z< zK|_V}1kV4?H*YeQsymZKBOATOD+Y_LsIl;ZVA0H?HL>#l2L=`$CWSdT_n5KiH(*i|62AmkJ;FZB%N zS&DG?7}HZ6d+$P>S2@K^{03eH$R_a{pY~^$=@nd3{;g-OLzlSNYVj0aIYe>L!;l7r zc}9NzMK6m~&Y8uKpN3-@vz#{^=Xnp{25I_pcUjxW*Qsp^3=DLM{##)gUz{K}s>X`{ zwOkZhUlHV|Oz&T;Q*FzkmfwT3L)>+W1}QmEEzmsBLgkR0oE-Q%C6k@PI_w$HqsO_q zJ0Yac$j#OItOqEC{=fm>ma&)trlWx@ED!E}l5%3a1M%JySUD`(?UUcr zWvOXo_(LibwV>f(p;^`=9yUJFBAx?yi3expv~0jZT&nT%(B^|7P-QOFY#`b^pv$rz zTM!hsPJPXfp1Y?!I9R9C-7Lbo`P6d&HoLd`b;2RHq#x8EWVV{WcoN{C)WM5Uj-VU} z@9pc?TbGuXwT5lVhD6Vt-Z=V7uw#CET^(Ymz{%h4nD8C=s^y(u_p#F~{Ol{ow2vR% zstT-n(iC|b;i}P720$vp$Tzxwd2+`A0?fhRv^?4) z2oox{-H4buoIN5cfqip_?ga;rz<5>=|*3BKJDdjFd}lfAC-(b-RVWA$UW87%uASWB&Z>mdToOqaDaH4Pzrq32~(K48_T z-1wBgP_@T*bI2$SX@~EQ+0Xfj^(gg^4wV7SAtW_RJC@8y`_3FqyUq&pKECb-)K1R- zIu)%D%Na5Ef!;Z`JiloC+Jh#8JZVgZof$$+o%R#r!jC*U!4e zX}2ak@LY|X%AOnejaT66$V`z}GU}TN`xW4c61rAB%9RXOrhAe4p4(_|&N8NHBvhO| z^025MHl}2OuVe(218VT)%Msb=i2h}n|CVvK#$C{I3ocLS>_bIOH`6t=Dcw1y?TA=NtrJ#w$pAso-HwOb6j3>tmG<;GuGJi@SW5T@1) zwq9<1&77~R=l`o%<^vdZyok2e>G#W8FJhecR7URo?}MDV^NhhQTIT1zqxw=~*8pFb zt_>9G!ffTIZDKMSJ_DU-Z|?eE?PI|U1A6BgE;4*^%f*F>jF*b9zt~Ii0wg91VRY}q zK(i1_isiV6@He5zD1L()FO431Y}J8gBvQ74Ie)wk%AS<42iUNB2yU=J%XiFl}PA9UXFjVLR)?8V@(O11y5$ zIsdB!=l!11#shwWM7OXx9B9EX%uQVogE@1Yy#5 z`1wVh_zhN8R^kwpYKUZ~Sj=!gM_dbLdB{{FZbv?Dcz0__P8x5~g(T^?JY6=56Q_Q% zCtXlViW03YfF!@0r6Pqi?6Hbr+K7_ueyzc{FC@LB((ZjZas`M-77vLr4v>b11~`f? zSc=NW8WzT8^!&SgTa7n*xaK01AV)jf_CTEgTv7^ft-+3>HQeaP2%^-S36kmnIhymI zbs`$zFDw8&pjZNi`wrMCLRywPJ#QNbSP@B=()&U-3#yWWTPz z5j~F5^<5H?d=BHS4ES&0qWFF7hV$K@JPz`Gh5sqhYEd=5Un50NFNa@R45u`oPe-AI473P$wx7Zz%4R%9|S_X^`Xk2{l-U=>*bIxg834m-g90`dL zbaet)hW7z#W`RW)~6XiWDW~ zwPASB-bz;#7l%vU`0sPNocy?To)K5JXfUU#ciWx1AD-2Pic$KbEU|)7ijZk{OyI&b zD=J}|AVKopU%c_=$#xuK!DrH@uaIeY69*(eW56|2|O`XzEn3IJY`>Mu!xf9zN z(DH_$eaR^)a!=U!_Vs3^np67A9{x5|whO^91b|-Yl4&e)No2pu(FgG%(A78M4;{Y0 zlR)U7h^Xj`X*ZtYmmi;wn+0fmZ&bz=oJ9=T6FlNcoIuYRRMRgwCZsYN%rkJU>9C_K zdQ-5{U&@i^CF!hiP$z>pw}ukh$Rp?c8q7KVP@epapyEt3zeb8a)f({ zz^|-JjER#E!ESHpmD$70S>HhIv)>Zxa-wbpSAxy#Cgf5L?)X-pX0YWa3C$i!=W)sp z-V1u})%w^1i5wlrJOu@X!h<~jZ8O*h$r#+`X_C7#F1;Ltu!)FH1^sdE$~9;t9f$-^ z>cl^{p@FVw7zBS`LbFJ`8KEz}nO_-PIOYPrt$69XjJq5)VAcSQm6uY}* z{yyb(vV!p94VqMi9dGe%ll2?fvla%{zqUbeyphVP+z)7DX#b>bQI>ft9rlPq7 zhe1fEK@oZmLH08X_>&O6v#G)W8;Yz+6YOqJ?&8u_`X}SK``YqB}f#X6kXoyRa*J z?+-QDU=5x(qd9Y%i)n%p=Td(#ugx+O!98X}1|DOyMEn_CR+^Spf=hkv;2HtCOWl-N znLJ-O4e4Rx$~OzMU35qIauxnp0q?Fy*t$$qx~W2M@V$E33~HRloE_#C)=rod+Q7!A*2sJDI~vF~C*E6S(8ljnV2-rTf>Cha7_Fh2VN zEjko|k1v@=olAX+cxJTcXNf{r)XJWza zf*f;rRzFV2tW~t;Yi0x^BaL~yi}WJWchmlS81rl+y8)p* z$&qQ}tK`Y+OFfC)Ct@QS{;L+r9S@)OfA96pB|?jrmU!UURb&aY#2uc93)w#?)^{1>@b!kHc^ zX`+K3QM*h|gh5#@_H`9y1jIfu##MAZ!WWbR^I8;;>4g~HC+?wixymLy$c3(5{aRc2 zojIuCDflQq?KG=Qc^*)1gg2qm2OG!g$};VQR*?31)Gj|+LZejleP&^qcKjO4gU7dc z{uRLFr*zBbFG+4DCqqeQ-93PuGAw$Uu$fG?%ikp)!5Ob1w`A3&A#8@yh{L<%%a;t6 z?VJN{DygF4;u!*M#d5Y|PE;N7$J76O)6E`f57?pi>J8{v>}gRyrLi*w+EoPKD<}{I zUv_>e0n+qmmOCjaIa$7#pUXzPPP6RZ3Tw097cDF%!qcirK5Y{j8volV`G0uu#&49h zyA}8K1hXg~-?s0h^FASXtiiqfFAHbR3ugf%ZA)dL!Ifu=dXWrSu=^0Yh8GJpn zo6K#lFe$NY&zbmCDifch2e9!l-Rw`+u7w#iK^t| z(1jrNkv$*Z$|Hu{@mY78;T|t5GyP*ALurRE@R3NbywZT${R;1k<)G_%ESOK#=(wAF z1Ku-w>MQ=k_0OM^5vGg@l~#GEw22)ZyEi=pLsJ#q|N2^a^ZKVII&}CO1iwgiq;ptm z=%=Z1k|TvNe<0h+qgOL*BjgU?s(oLO`5QeK2$pS`m{+-MlXoaE>80kIXCA`9GmC00 zfcOVC<&(xVL~~mM1_`8FG20F;j=W&z#q1xM=HaH+c1T|8&I(6*h8F#0QZZ%<$bLoi z$DIaa_4kQJ^r)ic3#13!h@2G^8j%qZt1;Ob(Fugg(E1>9;pDXpNeB1Lonhq6!+yexlvWLBsN8ZhpJH%W|ZxX>)f_*0vJvUc5B6`Ld- z)1pBK>`w#$6+X5{n4Yp6a{dBD-ZYS_WeV&G_!DrjEc97 zvR)u;Ua$kbf+;E(klA2GH5g->J$h0dHYi9Y0+u5lJwkl^Eb}b9Hm|vZ;Zr8e)PZ;T zaey|3M`vTdMO^R)zlgZBLCZ)g40H4&!4eD&x!C7f-W|#m<0C(t36f2RmJRn-8<`$Iiu*o&1A*1 zc9R1Xt(&Zzi-j};MqfIL{MoNY9E?kOTG<`lk=K9R@1GNcXv)UZ;neQ=o8aX!03JN_7bG=8zv}H>J$2iq z@U;vUl^dT7Jo(I$e_U_~}DJcCjl z$)%;*dp5rk2+mv8=&Ae^$n(@~n)GaKb@|KJuf9#Dh(o&fiBw<6YbzGZPBgUu>rFf$ zs3+VXBoxls{9zGEPksg0wH7?{UUow&;2xNp;T=8-WdtA*&7ssjIcj-g}iVxsKK>|SiZi6?YAD=e2Q;-Zm2_tBqB)XM^i|iloRVbKJs&GauMQ~D`n_0I~vDr7`XH*{;Jv^M(=;d6YTgjTlQL2=Uh86v(1Ybd`eD>qVhWZmW;kcoE<8)-q`z;9w zyvJab2C;o%)0Z_gZrKf$zPR{V2~fG;=%s!7=~lrGjCZi3L~B>nBA#KYF>u)j`MP=4 zze$vIRL#ZxX9gxj6#j=9wXddi3~Vt|JqM_!X8HXL_w}4j#Ap!En!}u>=Ub;!&JY#Y zhifxhK%gD4gbC3{n~qH$^?InUR@j_{>TNr*1KW4(aMo94#5cG5i4Y_J0cSHhg2V$S zla?dL$>$oUDyIs4s0)=&gdf6*A|PysC%M0uKfOo7jJ9L(A08BwrRl`D1%kNTv3kHF zU6wBA_!1^S#5fC4aFp`wzh_-}oeux@GgD0(d5BO{8n(@4iuOr}?7xSD>qyVUCYqLC z)W3-KgBHL)sJQ z#8Za}#f-e*iVx1C(o_!V$k2neGVRS^VDgk9| zC*Qao0K|GSwO>S}iY$z)3;P-!aqE*f(>gNIn>(ADBc`G$BKMrhWo}7hVDZL6iXOu$ zXU#J89(tGv(05NaZ|SlWdC#vHWJDhwk?`exW^qc~18Qf9b0pMB3ds*%J!|&X5bDC> zbo|o!BxiX6qA#o+U22X4RWaAkno7wbc7-v7Sth}C4G1~*>rMAM|G~w$Lcm9XEi2r9 z8}>^XOViXpUNhHTh~8gaxtU#bxk^U=~$5|$XWgjH5{tr}C{h*uE`d1d4K=hn6d}4)bHaZlU5sj9U-KiH; z$#HbMuCoL6erLz43)9lfn-{_(Bh!;Xwg|q-Xgb@{I;?Z~a<*d7|Gj8Dad}#F&`|qB zm}2(c=hsvp4(CEU63?=kwI0limbSL7m1_davY?zQIh6e4Q%a!ihA>0u>nb9=AU0@I{9gkwzQd!%h=Ywe(vY5l$RQ*Q z$RqJrKRlSO^897(HFY6T!^?lrwm$`yP1EH<-k^M+m9OqdC7s0xl$PImW%f)&jMN{> ztRtxEPNAIN!2{&C9A?W0=TaR;o^KemfnBG3JjSNe?(4xdA4@3~J)0AnPPeZ-A0=2yF5)DXjdY>M0N(uiQ4k?@VtS2JsMCXOx(ehz2L;!q{W^i8FK3Ij(^IL}Nq2nsIO%J2_;rxFoZQ^!j#fP?jxlKy z804CYkMgFcxb$J=W6L`z?<+g`^v77)B(>Qcf7sne>GbCy)-{Xg3l3{seF4ZZ2rA{ zeP+4i&5m)#O<8n&*?lpNpBQkECp~#$qyYlA4gZ5(G;2<7T{s{ND zzyIvvnBb%xPDOc#JINv&Q?qx=0ksp(PSV;yqeXLgFjDRkWimB>Ecj+?dZS{zd@DC& z+jz(BK%+{{B`LpstG)NOTzA@7?Q0}iL0sh7J$^<+a2 zcvPz!>~CH5ec`}P-cnssAYWtz%L8SjiLc(}GiMq*yQpIdOxkTGdr_wl>?%FWawt2M zec9!!FDLOWHO`dF1RcQriU2K~52D@!%g<;-A&_9A+AJK|Bv+L8^r@P2{jy65q9Np; zQ5Q9j*#!P*4$XUh+NX@0qeykSaarXuPr*WF_K&NH1{<@ZUkMWn&#SjQBa^IlWuRsD z%GLa~rks}B6PIjj3n}y0jD^3i8nijQ-6`z!&SOpM0mS{={Xl@G{oP|P77M`GS*-I2 zbO~u9f77x>hq3;eOr2hJ>;u*;zXvHAf#ZjA=b;i&Ow}lI^Nwn(iJ5jhWwM%lEDurM zbR2Y}Aoy|q}KCMw7j~cA9c)>$k|NA3t zH>%T5cEdIGeBNt`aa_qJ@1Y0P83hF*c9GyW<`;#i+4U1IMIaZ(w_`$SArhg$u{xZ3 z3*sT0>I9%DuZMV)l48?(0*>>Cp@w-WdVj*}3UIiGL>I(1GmW1!+EL9YEQMlq;u- zG*PYuWu?F}FBV;shmfYIjl7(wN_$*|LEb({bA&I=|?xaAxr|jnCGOdr-4D`0yMQT#)&LV5k zcz%h}A!JsjpX|uWNn^^h!DJtMPJR);A5;0f-u0rEp;0Dnnb#QKZ5B;MWI*0JWbSLj zfBA+_tp%UE>S$cE=7vkLWT&~FA17<4ddhx?fxdQ)y?A zmXxju3bmapG<_4#ffCc0nuX~|umWqj4ylGm-g;8{I}CP2FUo$OAbRA4*CUL!;^?ZR z4Aw2i#j4cvgf6Xer#!)_s$Hxq{%qZP1Yu|Roc3k0H7+MrTTZ2pt$0#$NSnWxOTmBb zOxKO@1uq8*6T+S!hmw4*YeS_@oDKZf&o$ON~^wUe>tZ@PJvedSM3%=RB&1}=WgpOLt$ z8Q9-QZ0q&P-OpYJG}btF^_nxykZ&&~E7c;KiCJ2mdB%8h`(2lf$=7Zc$b_!R>?@}L`57eDBNHo6IbZaxlHwot*mG{qNpdjLX3B}+&g#!0k zV@*sA{0&(Ptl}}r&M8vv*3@6&PE7(Q3&#^|54dQ4vOK%DT8atar_sS7A;dhVlQ44P z!V_(_wl@3F8IpE--}C!U)@DM`Zxd!-7z+>7T8bRwiLh)m7Q~8dqwo*EbCeqXJ>s7S zpg~zj$lFjHJe)@SYPXWlgfO+Uu4)Q`0FZol8ndp*Pd$g$kak=b6I&pW+WFmkEP`+fMDK!E#Rm&O=x#;OE1UiHWXH{{tfi;1Ka&KwFbRfOBx`n8Q$yt3SzIsfa_ib$5f`#_PZ1e+ldedp97#qxO{6L61tn)48VThMM&1 z#iyI;m!wBzqFiTMwD*0yympOY^<&q9vpqF~+eCmV%Z7+iHLVM*%rZrqg6G@Z;pP`V z=svOmTuy3PH9~EmFA>eFUG*F+z=nXdbd|27)}%YT{-rHohR26e5GgR+Q^EKV&pW3q z)Kx5(oEgoyg^KZca_EUbhd*^=JfJgPnMLaPLjCu#GZ??t8% zhpxxiBLK%mNqRU*Cfue!R3A7mHG4a!8CJ|cX9%waGB^Be4HRuogbf-Xa4Om&;RWqD5xrBYet4X_vgW? z-~Q;Eks07qB+Atq_jwn5OEt^i!=hdH5|1R|$l;{Kd7Pxk*_QG*B0!F zRy|MBR76E@Q1};f zCH6yyQ8<=KhHHNS%>7D6{ToIfM4Xpd5y1jA8)AKMmz^(D@~a%k+hML&$w}cv zu%jUPxk@MIq$zG-W|0E%C;qEp=T8Ix%^h?rnR(LhCcXGM3^GLeV~jp<=JMomkV<;< z+Q59>Z!rC{%jb`8)=hSTK8J>atCfOJK{2f##4m^FHhrHJR~^?=xg_feV$NFi%ifsv zON8{AyiSn5MlJQSs8@88O9;kVhiR#75lx<)8E7H>~n!iYKg(iP+jLO7} zAHmGo6Y*|l$7>26pg^KDyfk)A2~2m`mA|eRem`@SrBy53L?&Fc<#6xDhB8y{#iGO< z1v|fclIy_1T>Zrv+uQQ5A5OQaQS$zgGJm%u6tRKLC;Hde*SxIf%?(R7w5?f2>1F`~ zeksCCl5-h8 zGpCc~d3x@4CZ)PjrAx{%HmbMhS|udvHX52IwvW3H%rR-%T;(5C3yL6BIdwIUU6YD; zwiKX;Id=E9J0A})%1sOw(Z9Y_Dzz`F?b?{1g8@6gtys?7$kfhM9sX7d!xsi)_jM)D zFdiUVmi%Qy+4$*zPj$FtFi~X9J^w`7V!z_9RT|CkbcFwgXh-{tH`-)*Dmn%=%Rw#A zzj)b;n+SVy%|OHK-)8RHW_}u=Kh|*11BJ!E8?FFDBjG@mmX?OSr;#vN#hDhVC|Yq@ zPfb02nzdaE3c$?#EiH~;zD{m1cQ;OU`w$x&%i$dg($mqgz&`90-%B%YJ_y;)mgk!Z z<)xM2TxeQ;k|L)rAxx0WS~@zJXWu4fs}~_8TG1dsGgF1Vuz}$y{l7d(NnS1vF z(w})s$ArY72;OZAHvBlqPJ0?zDX6IqV} z`pi$OcuR9uOrV&3%#mVpRpj?U`Rk!Of0}Q-PI)yyk(FRJ3whq?Bj%2d+p7 ztFA&)E{Xyz8C%I8wsa^S<3Oows)`ege^G@~dQ>l5uB!6_(mdBTW}KZaw)TV*W>6 z-fjoom|tU|2Kow2XNbnCXX$;@$lFk^uR1RO(*l@n(>4@;UOg?v7`~IUocn9bkl0k! z+Qj>(VF_6_(c$21&|r<*s^Q@y>`x@b9~}*Qz!0z5W=yU*e*2B3$S3fzP?CljFB55P zL;_pjw#SFIN?1WJg%k&AOWSY`eLC_DxX8&Y8u!5ClA@_k!sT}b(?tWfas)Npx@=z| z??~D0RId9L@%N74h94IeY8bsHlFTx&0)h>4)itB1xw*Jrz-n`^P-t=A2Uwdzj(H~v<98uD}m<*R$A?6NJKE~Y_$c#K{5JHSx-G2Hi zB#4BSl}0@Qhw647q6Rcr>W-vI)Irb&azT}5^_tE9W?7lV^b!%qP!Fomu!>l;ZLPNQca?>cUoGflHaF=KmbKLv0&AerRn&!0C&#ffQvf)o%) zx>A8l`9yLj=IbN{@t?DS6c$K)_PA*8@p0jNKf>4pPf!S+4)<7>lq4CIZ#WowX5M%2Ej5$w^uB(xiJ9k=4WmA@8yb|pM$jge zt3AIFs%%53gkJmAmK#4@uFYNi%S3OnxwYivB^^#D^+!xQ``n64mqoobKTsa`H`3f$ zjI=Q{fCR)1;uGYuJVQbx0wA>@V*W>aGcQ0wdK%;QfY)o4q%~KI zgh43rGvW9a%!7uI6`1OeWkE@yTQ8H6p7D-$3mp!TW5H9H)+j(pB#6O+Cv4GfD!t&z zUiT22@e2V;f~>~3*Li0Q=Xy`FPTN=~0NYt3Lhp;Lu{r3m|EPD4l5n)MwZ-&4f*tCc z*rlDF$Cict+sN=N3DgUcIUZT3svAnZJl|1&E$<=Vu%HH-3D{vUCWjH+!kJ26m!h;aM=R;>WapTBM{kKEi1JX0b0$4;u3mO?K+ zy6CH!d@vQ_qAad-XHt!q^oviwY7BZF3k^^AhDJvrShPNJsOa5CTG{s8x0m?Pd(X~A zN1~Ps#Bu$&vU0y(KYz4UW9SbsK}Ak8tmDvv8}=;mnmiIDi}0VncB9|i(6p?%WP7=j zp5XQBqASaIP->g3;pajA-ZPdDAjJ{I0yW0W2d`+8#jBRJVd3`g>7 zmbg&@I1Jg9HBrW42#;j6Hjr0NLcHiO?7h&W9E9lB#~5n^{mOlBdqk+SJa~Os>r^!W z!3ZNKlDmlU@J-`szl6w3c0};L< zX_0Y|@9>?wf|D^%`kseVid0L`aO_`!BiTglK(InE<<1uiFI;a=c)Vc>(YY4&@Thpm z>7a_u&+kx>2qt@}A++=DTkfGUkYvbJ-oneQP+Jmp*>Km8=)E%u6J|>G8w_83*(fzT z&q1^6I+pKKsu_M8)%*I^~KxBjKZj&J?E11?X@e{y4>=7{In$8Mls<)BTO7Q0=ULownL0l>om^xgZJ%JAc){)u^<8iQos-`=Wa6D6f zbZ|e%7h(3%slrLQ?REb zi0(;w@y}Z=8=^hV=bi5zy;!^S=p{6(%z4B-#*D4O6E)#;tya|>N+jy!KZGc_k8>L7 zlg|)NDq*unj=gUzjJM<%P2Ae1&v9XlRre(CuRq>~Mw3UJ8QNV}cir!}PWfm@aYx-8 zopA)i>~B2SW_lXi*5yjrj4_nrkT9!L*AjZcVCRW;v-fL1KGu~3`@ubz+1@uv@4t9f zc_X|fvQN}J7a1BI!R<{ZZDkMRs+Qt4Aaxf?MwlHAWP#hFvRtmF7|qPB7msuFnoKqN z`E#3A(jjwBNfzTMC1{BuWGBsa=RxIyk)rndS_%tSAGRN6a2>>*m}JY=c%+$GOV~DA zCzN=cZOKL{!ZcGjgcD8S5-j*x*cZ@ekm|PWmOwJZ{;!MY)T1wv#`(t_Ka2BwQvtWj z(OW#iJlr=wwa2S-;bA~OB99>RGkZUb<&0xjfLHiS4Tr^tMr@UiQ@xr0=y_sPO>k(h zbac7EERC{L{71%#HL}HTjcQ+#T#yt8u6u`0kczV7Onf!-=wRrRjFZb!&aWt|N=r+* zhA}UaP54`}=15r9FBQ|mfSWjd%UYktayQ$Yz-DVUk&1i%s`!YnjaYHJMHPnB1b?}k zB%VFtkjKJs^|^a^r}FOsIX6vzjw%~@=n?b?lTh8=U>MLJz`)Q zcqiq`@E-E=_cC+x>YATbtgU07ZQP3UDl4n||J-n&5y8jBtczo(Nx8V;NrQxqiafM4 z@52I~?cS=gH$Iy2_}Z4J*ZQ0J>C;}Xt9oBAugH9q!8ZdpWS)&M8A#a9PWTA-_CT>^ zh>}KU!JziK^gH`9+t_|axo8pwSI6`o`unEw1O;IXUDvbfTK?nzZ_H*rhsqvOXPlOx z|I=L0M-&qq8S-3nmIwO!o}{GQ{@x^~Pfs7HJm3UA422K+*1xv3C=l!9~tq2t=xfIbbQ1e@~f&8WsJuz_Y zO{HtL@v`!m&N@IcuVSuRE>^RXn3V-!H0^G2HiGLAO3`J;)FFM5A&Z<0lwsWWCOfYK zgn$n5%K8Pp#PBo}TdtB1&*#&fGIdJh5oj9u=}le}e0ngn`uJHULS(R8qI2+oEcYX` zCM&Nmf0;*))Sh~Kt$28CUfV_X+&39V9bgoHnlIMeB0x__=ZFkgSp0SQ%>ph%&YLjc zCQhAgdJe6u*UDFeGoTQ0)BY&{cBc1ay4N-sKN&lQ*Qt+V1D)e&DX4l$^)VdS_&63S z7LLd%{z!~tgx4AqLXez*K{B)yqzlE{Zs|ou^aJs~iZ7ul= z=01WBpZ_vlN})a*oK^F42`TEnnlAqq?$|>9Z)K-7pEdm4c>8IZ^;_G2-4XTC z{1BgwsuxC>*NMsg4aTRS0US?#YE6ROTKzUlY((Q|la9@aq_JnJ`}~cd^G<3WQMTF; z6-Fv@rJCR_lBVj*((BlqYbqpRGXbi){ah8l%lc_>2nNlRGDUNeRyns_!iG_$3(^PA zw_^ZrPmE=+A_>Kw06k@|Vtuj4{QFbEOGTQxI~d77eVBJPtjkvxY7#&5U;91sXHva5 zvE|_|eiz2OZV8E-4lK<)d%tE;U;Qv)s)%<7NbKvL?ekLL&7dNDRAisE4fCuwHaf!Q zm&>*?Y)Zs02u-D(oZ`t0{f}(-HzIu31(yzOmDMkXDX+^?*#@K02#fM7g_>fap+}hr zzn#~PSChQBPUj;c5Yu(q??&|UuWR4`Wg@^o-%S$Pld!~iZWO3*aBwi8YGZ7~3&IZY zOz#+o_%2Iw=*{Q}?F$l6yze!aMTm%zVMfbt#5;_LQ$a$8g6|3mdi(rY%DTr8=7T;Z z-ut8cFPX}@@DYNSd0{AUayNOiisWX<_e3A;M*|9a6$-drgE)o3U4osb{5@$PoU-g= zS4>CYyMedmmYL3_y8fT8JO(6kq_GCRDJk1`%;0jS5a)&Gok}O0n2N5cb*Ub5IQuKr zRHNRfcJO~!eCfT!L9>O1A-c?&krgHYxP#Ie<@@M|VtVxGUpI9%fVMP7}uB60)HQ7@K}>bx#sL=Nu;-I zR%4Zfqr@g8ZpWQE2rybb1|K&Vcco&Ii&bV$^PA4SM(lws;E%md7^o^8W$^E!ZNs1# zL7|728%{#8ZUaRDcuPEvpL_Fkivdie_wn<+ss^~h!0-Z2yPYn#qVB|r3;U-Ve1E;V zsd8fYhN+<&)vE=T-S%4ET=c3VPZHxFQ>_D&Qk@g`Mgj~H6HM}#@PD9{?Lzv zDW!mvyVusHqgEGpyUzY?uoRin$1GxYK@pLZYe`pxqFs*GwP-1k#xsa%h0aw!6*inB zc}DX#a~{AAKzAMfbq8~dt7nH12J$sI2*tKlCX3a<$85d0vKrU^L_ZgU>p>b`MuOs( zkd2hEtNO{h+~m0H@!D5LIza76i*HT+?#|_z8{&0-2mfxl`Q%&0*VSJ#=ZzdV&&98M z&pkffIe*^iiVDTegvOhirslg?dN;Zkof%mBSt0!8OP9=D1kswW=J%p1yRS5%MczPa2^jqmgaE`IH)PMbD zO#J-&cW7=wI?5vO-j>-)CmvW&3LAbQ1xuSqW(Ehe#ovgSp3AGtY2Z)2o?t0*ls0_s zs#$kWkMDo{_ohZiVpc9-Y13s0es0%&^r+QzFb-)6K<3HE+_Dd{;J6{$Lvx;biJN}A zpNsslbBj|#5*~9$h>33)#)XF{2if#QB$78GGI0(K=>d z%=hoJel&dy`7B}4s<27Hb{qVNHri6w^`j~_;aV>kLaAE z3snBI$!n4-O#g1y5j=I*)*LtP@^bZCqAEBz@^0bg=Cw^DdW$k-YsXKng^~68A|uIB zYUy*+yYZ*J)$`P%!bCn1k=nAG@_KomCkRW}Te&b@_;BoBXf5#ZRj7?iq?`y|nl)7F z*4fXe)0c7OUP7_&FnaG;mbF#Dl)A9y@9*z}d=?{p9`KEU{5^`2Y<>Emo9)Ahh>U}x zx%lR207t@ozA;V(8^e)O*wJV5CevyfMogK-rt_vs`Uc?jbTOU#4ZJ(DuuOD( z^>T}*D8cobYvP#2Xdms;6{HR}U|`ZVVo<|%rr*n=6Mvh(<)a=TJTq@fY$9!!!TiDY zbj%Qg`L=`gkWQtl69}Af!czxQ@iY;;CMX6H+8ln}rqV4NHxL0S#RytD=>1cj7$EhJ z+eQX);XD&1g($-cWgTa5H3UXmn7wvy*>zAeu5QS_Y9~fOum3{&BcJ<+?(PU9?pI_k z|4TL=>8azlRX6G_Y%=rNN#8QZ%FTY`g+=4eD&Bf(meq-}52wT*ru;`(&;M*;dQ)Dy zbx6#-qU?<1jrN&OYefs=U5?=vt21T4r?mJ=+?3|*TizHx|91c8Hq%2!itP7qKRtT5 zB5c@UX6M!KS5#HY!^kNZ=UR@0ofK-i|JPsm@L{8uH_43d(A(Ownp_J$RcdzFrr@{U zRJBco&)umEq?_57+~$)`boLT2&RQC}(s%h+|8nkx_rYEt+WQwDoz+TI^cDQA@teSQ9#m2=)+yac_DWS*sv^>04)087@X=m4fghb1k`2aa}63lRaUhKL)QoaT| zs;z>r`k$9OwNDdcC5TB-O!MC{w8{{|5-}4qx1^u4Zwajk;fxLOSRm$l5oEX+GH`sl zt&)>QZLu_@r4YmzvN#DXu>Z>P!cg!d0CZtkw_Sphu#a+=DYQ&iS9%iO zwWxNp3h$b(JHK&CcTRswSjn*Jdxus3hUaU`wZD_cMmXaS5tU=q77>-kwQ5%xs?xF7 z+wxR5NUv?AJaHn7+k}7A=jWl$6+>0T{d`{@Tz2^Qger|)`>369l;^C?7;{4I8J{g0w1lu zJX;)(6)Spq&uD^%cHvu5$N0MmtlC2FaRr-#Prb(yFwy*5nW0`;bVbAO(<(i4>-K@t zj(7S7Md~zc7Q<>Xc@vq>gwQGENZ_-NIABl8;`Kg__-yoF6DZQvzUtAT_R4~?^81#X zH`jKi+;O&F?HNAU;8XqXGzT)6keBk{lI)A=Ve1!a?Yae$0wvU6{!$72tXKYAJ@mJ9 zibkO1+N+;mmyaD9jCG#pSnU;^(4@y>x$RSN@lV*iDwfl-j4?h7nv}GrtAZq0#v~RL zaRf0j$z!RWBB{R8u5m+^s;r_C9YIcanNQ51ik+Pu>TQf*=EjlH5%;sXA_rE@M znrB$U(SgpUrhmu<=+caPoh#MAuS#3nMHP0c?I5;p8@G>_=3{M;A6>Cbp5m0?~9 zbJNqyx5W7row-jMrFI4uI(Iq6zN@7fHhKR_CE-}Q-CPOW8L{f>wyG6gB*wmr?~EZDM+bwS3&iw$Wr)f^VAS zK6&jr_v0xac#!~sl-B=ju+|A%yquYz zU#4~5^}^XYuD2YC{Wy?pDHIB(-#+tjZuic48ek zYB60yY~qBf&ryZ!XV2czZ2nrRXP?xWLxNHQxJyi=n@-07a%kr1vM-g{>#0w(Y&CXt z{``g}Z>eh9eWKd0g?Zokj6cn51Gf^TRR0CDcrpH@tp8C_b+whtNB0S5R>&2vD>4WX zU=FX(+4TD9<%eG??PGVZhw9;d7JfI$b=Y1WG~VU0||(1d-GN1Sp;hxd199iD5*tmDZmfBCy2)=eVX*8rR#8hz{ z7Q%Tjmg;X(an8zpGaVw!K&K1>fEUR?77%@eSK}m?v$U4tM(_KxTTdn8@N~yb=2>~JXOo= z0vud{1~XzpU6=up5xNmE($*xKCbo<_IDgrK zPZ)ZnqQvihXe-4Hq9q9amgJUAQa4QAiBfMuC{Z=sbJzXnw%tGb0%|Q3QyL3W_3;iD z6k`Y)hUcUXDo5-10i+j$u{z<-EB_%hD7Ve=lc^}-$6cMfw0aL9UE4SomIahmnF>n3 z)XT{jja90hK9&;eMNpVX*+_07XkMb)@lbHxTuI%qZPKW!=FnW*rMlHW@vHlhFqPb* zf!ZECrNQYF>4<{8g;wBKsFRrH`|NjnN!h0^f-sy8&vC2isQh#-sm&s$|KdiP~48?_s=n^ zIJ_e4ET1XPs5$-_nHJV@uC{dkd`b6cup1M-;^6Ayiigg0yLH!cm2&PG-U*^OusrZ2aV$oD~xP~?**MD|KznyQ}OfhR06|I-3| zcb$n-yx8do2NfBpGPV_b&Os#DDwD~3YOej7n|q2MW9A`#T!%QjGT~EN5sni5rP+x% zT|g8=xMqs2qK0j=Gc#i!Z!I%sxuY8N^>vbTsEH46OW=NnIx%`#gqH(71M3Fs8WOXL zjoz-2h`KRPBw9}X){;^FIrM<(^TPBnO#h(U?K}2SROPjB`gx(#iBRUlijCzbsP0*M z`a4HfQn3@hAIuR6Yoh%DQw92Eb#?X9j&~gpeE1d@3&Y}fWY1Pn*`gVVV3>Qugs&UP z-8xAGR`P_rHCg?opIS1n=TN@LM&*C3vdd**i0_aKYrqk?o*A3TLWyY6Mdy(axm*<0 zxh$^~2&)aQmbx&me9h$isWbf}r)<`pRZ}VLll%vt`TPq(GW2c$2|it98d9{ ztfV1d{_*-I`vDHcpap=DPyIN^~(e) z5q5Kcsk&+P#X*zx>*K{MX*Be7f-g3wIsN+C-ys%wp#N)KeE+wagrH;ZRMxaB?Ax-K zl!mfBdp1@+u48Y>stP~QIs9Sv+F;0ROJym(1rP1xdd?Y4TY>_Pzg@WG{b`>FyZ|o} zLn3x+MfgWka`}BWe>VDhc$%4NJ9QtgjPiDy$DNZr7aBBaw0&B~XBYFw;u|_~$!I-n z9iLzJ|3JzF1-|b4>>{)|SNSwQ&b)gg7xLh~>g}BeZyDKEV$xQCN&ea^Zd zqdk{WX`{}QQ%?I;*Cn@#P^E1A_jdV1BE8I3`~30W4te9&asi)qMURi_u6yQY2gPXW zA9;sNQv~gNm_(ahV_$OY3oQX*)dnE&%kK%$shO zX+{96ISD=!KRV&CN$QN2 zR(C9UKlJHiZlfPCSXW)mHRm~!|1k?L7&~h(vAw}{fbXQ08`JQO6Tjc_!SPd31a||L zeeDk=^xM254^H3nbI%&?>J(Sn0#}b0bHuwpd`UyELbfr83fR8>D=hGBt9dl+Bby^k zs%9mCIHspZk++7jQd4D($u^`a)aP?M=*DY+-9&bEvaWac(FQv``)VF^MbihG_SD!i z2r1rWm5*`?zk-G|69-BjWhy*#jCNl)f1{D*X(95*fLXQeA0`SdTv80a(uWx3b3eAK z&kuv8dhM6cx>^XYP(wbJrchQWJKpB&G_CMsuNUv9rzfY!&88(;kW7!UuB*GZFx#HJ`0)x=jp`{U$>1SF=}yNs{t*|Cs%8{X z1=Z{uJD2fjEU}GWNa5_$pRr-~tuwAK?fnA&%iJK=5QB+51Re5!k2k&>>DJ7N|MxT7 z4N~6!#nIVbQC3sCAI_yAzS1=L>ocfOH~E>`X6#_2Tno)ND~2O^iShwrYgc3sBR+eb zeQ0<^Y(iaS9=AVqP}#;Vh2yUsJ9QuY@LXMn|EIVzOQ&StX^fI~G?|TszDi>M{$g7J z+gduaK}6iz{ei~z71EzQ&yG0#a+Uy6^!jGSETeXR)BJ!Z6Ozm0I{%~*Zy+yHv&@O7 z;?L;ulPijCLOLFcqX2|zw(+lMpv>~lmP2Pas099Ip^zHq3UFZWmQVc$_~Vn9AVeeZ zXn$RJo|bkDPS<_F+?bYsxM6yH-`5ua{WlX4#E9&|b&XW%U(qrSB@3X!iF<@~E8p3=$1giyu`xb-522Hk;c3EYI39=yc`fqyzlRSGJEoE?tgi) zO5!kg+<+2Xe8n0|n5z8WVd*xZKXWOkYe06ZN&I}Z5$qTjQiRZ)j$h}KlvMifGrodq zJ;y&9Q~+!L+*^n%%^nu1T-=GS2co5z_{*_d15=0V*WtuUn8DhePazfS@D1JpBy|0h zpVmI1SdB369evKjfeXml3cvuKn3lE;3MzzMB!;bBk-QcF0Nep&UHPM~+c{k}@OKy9 z?e0@^dx+^ByMmN572>BjeykXG?G+ASZJKbPXQ*qk{9x*B@N`mKRc%w9?QB1EnEC(K+CrOSKeh(Y4-8+@%lbaJcZyW z+1Y^eqw8C2$a6g8h#a!cB3;Zq|4i5A!CVmwRU83OphJODxATAB2{QQKx3=28UTsEk z;F2HFIqC^&} z0}&fUSq+RCCnF#7dB&41{HQ-RvQtt}AQ%nq2GbyeG)~HCiFh&nT4{UOp+JU&K67cO zKXj-Tz%yX@y5T!5;|+hTvuWokt0@@}r8F|aidBodfv5rI-%jVfzGW8lhkXSE#QY~t zfMXGuioUKA%IvfM0bxt{(f^YD&kr|TT2}FBaG*d4NkZ5f3A)KHKOg}T)Z(dv=4K`E zH8jG{6IGOa$Xn$@^H>XZLm|XmT4>8)Q10sYXpyc?juy&l_^5c4PY~{Jl!F*6Cx5ka3>OL z{A?HBYJS{xH8nw!N991?x0{EjW}GFoii8x;0q!;j#O-1YeIL5-WSI9v77!#`Pq3Pr z3|g%${tM5=75(kKf`{*s20Nt!8)000xPg=3HyalADfEGTLFmTVvr*yK+))ZRYdrfh z@=-6R)6qc{C?V3fGJa}sQC3quL;Wb9fWVbU9fp|CyjU8^tsJ<=6D&wWA{r6*J0~5j zn`K${!j(l+B$U2~N4Jyz)TuyUU*FH012^=Vm{YeQH3>YhZd7w=w$Zg~+kqi`Z2iyd zk45Hiwaqpo?u$GWx}E+4e5~@Enitj7Kvz*`hI6@IlPugG7@qd8yb+9+mq!+c0C+HS2OaYzmwk5)I9IP$YEXPFC; za{m`nwdalRW*%Q%GObH{CK61Bv5*pUwW=CXqL7CPBaH5;1wC#QFmyT=bS1AdVI>$O zo&|-ZkYaUh;6VfxT17uS*zl>3ms-fKOlx9tvU)P7GHAFi_^ttMtlhg~n4II}FQSJg zUtHrriyU4AnGHrn@a@C|AXW0%#+?6*vTc&AhZC5r{glzW1G-$SA#m>E8hG zZL&3}P<-ZYk^`aNXAA7Jn#KmJ?sk>fvwM4c4`R$kq7k{cxT8=JfsPot;_kkG8z^#6 zx07(15$hQ^LhLHQlXpNdsMrhi2foD4y=0|}jgGo?D2|y%r_EJp=a6h_7UxKV=thgO z^Q;??ir1rX)9+!s(9T=vvjd_`C>T*jN;s-8$^~KmoUT;rFY&ao7da=5v87njB5HIXIM$D1`2}q5Mu(Q!(Dl{d*R4sC@j2#ML`Qw_>6I79u3Sfv=!-$G9XHz5 zG@>d*_W4p#(-mo6rNx+zEr6Ijd-r+$=*ruuq33cGjhJWK#!(GbWMHOinr%T(^wC@O z7B?mTLarapc&vSpVg{M~TCFV89S+w&U*t}|&eknch`&Bi!Pu#Hi>Fz1m@+1!U8f=0 z_~w6 zNFHOu6@5)`27oLBn$9-~js#x&v7>5kPDoYlKC3*UCEH>ve;}-jTm0{O;`l)2kFW)M z``Osa@wXvIlEVe{a&A^_=i(h%U<#BiNZxRy+Q!%L#Bp3wKdYHm_N1x4E1trRJ&hWk zL84RI;%w}B))`rAF~yl+rqecplaz#>@*P*sTE@L%!{o0q>&I%7_#5A}c>ETuOUede zat8VkNzfY6$YwLvGeQ_|j8=C~j~^^xA8nV3at4f{L|~eN$Q}5WL>@d1>j0xP4R2SE z?J@!^$;rvJ#v9Vo{T#$!8gtd5m#u850%%cC`?7;>9dLtS)NZR78*_%+ISxBTOG^R^ z2V(tYV~fNrC2^qW>WW;H2swYI^H=%ij4*>0;P(9h#@z?Of^5VS6!zXD2>%G>5NBZ| zP_9}CVtU*9f&Gc|hJl4z5d~#;o8D0eN+Jc4z{kspke!-S^L<7FUqF`NSeSRdUV}U1 z5jN6LwP~l>S4u8s#L~vHyzpb%ndZ|1G86M#j3x??p8}|@7^&~EXd+k8d=(@goE61N zIsruK(W8P_)woKmJa4M(d0k(=fZBjZg2z7vF`l$48R;u*ke@_pa!bjjV?|F;-59%U zHBj+sI=Mjg*ch#N_-EcRH;ZU*q9lCscWL%x1+>~C`EiHVbCHNgq|;nuOPFedyi@L^ zr+2-)^<1%`$@pVBKKD^`XL^jHg@uJ(a~7ZBQmXeMbKqFy@Taq_EsX9+zO~?~Q;J&% z&FezfdA2aEx>TY=OoydcxP&q@X|oJ~`dF5GuteE?PfX{;UV;FttI=);65G4GqwM1y z#ECFQ6`LGG_Ws4ffH%tpM{E%tU}v|_SNipw`YSB!LRTbt62-q+4I3ScInZH58(hba z6O4U40_N%_pI!zqJwuZPozd|N4L#XN%_Wxhp70+#L)9{Ja*pS;j(_A8nctbwfii{J z@8b@V{%H#Eu}|9){~S3v##J`?eSl*UI4*Qp|M94tbSo#0#LCy~0+j(}5Ix_BJuX$m z7*$kib1e6&H)A#5`INRnQJel*b2`$a8+~*s@|iJxIyKxW-0B&TNxVvb-zmPeN{jF< z)snTG3ailr(8ZpzZKTl6Hf=1&{x!#$kOnIIuXll?8|GwTo7EAiDQAu$1p?ktr9i6)A!*ON+1d(^2r0wcl}Loa0{BvhG7ylA!a`(1yNQX`9m z&_Fwt!fJUg{W6rO;Ff#QO3Kt+-rO=P3I@skyI`45mCllP=VViiL;J*!8uReSkBt^* zMrS|pP8R8?s2F7=pVTKIBi?0)k!De>-DzG&3aQ&TH6qY8Z^o!At|#z0%XPx&j)hch z&M3ji&P;|~{4AsM$ra&#zw-M-Lqnm#s}yK{+#FoDQAT;}&vE?$#4J2CDPbkmT-8Zg zWTWnWQbjNVpQV4Y*qur#W2{4Z-XD)uuYgs2JXqYM3Ki^A7DczgUllQ$nQefqaXfHX z;-HFFF-8Z}L)K#%h(UtuwNdq~PU@RG>`O9+y1a`TDCi-AZEX=A-}@Ubrmq<}#f(NG z;*U`hA=S|?_{v~&ZI;_PUS(g?djERgZAlu77I^9es&{U#@>23p~`2K++cEb6v~Ap z(6--Yyn8A6Adif)Lg(g&e4<;3*hA{1%;0z@xaBF2sWIzNBv=_W%}T&Vwd+qq{UhGq?Wf#-{2f?CtitJH;M%Fu8jQxl0Z*-p-!< z^4n?Sx)swe*KuBom~;2#-~mkNlN}sA)BjA}q@{_=DYDMBq}{zTCq4c3{r&r8DlI(Q zejG22tG!#n;dhmmZTy0_PKoatPCNYSZJV{Ts6AsHk`HaG7DUOdU&@2)p;$Vgq(BvC zloL4}Uj}%$GHfci|5MpecO{dN{%YyuaViRUIqGc5#=41_7W8O=q>$pcwwTW0rxhs0 zPQY=b$#9K7v*SNb@?Nb7MV{B?Pwxu4hKk-wyqS z4Z=2k<}r_8VAl}uNO}sJn%55AGbq+$n_%Ue?N~zCXdOy}t&k=D{@2K@VyNy!QAya^ z+iUqQg&HZ8qsKkzxHPg0f9YE~=w~}M35%nT6(IYA>}+0`kfRhr!B*5iT5aj-|1m=@ zq8G)wL@eZ3`Ar43qD|O#wn-#0JG;5Cl2zV?Yl-G=I>%-IfPEavm3A_`_MMK540TZf z!|?pHDV^Mjj=<#68e-N)c%Ied7RmUQ@RFyKr996N2x){0MNzkf++%bLJw=v8=4MxO z;J}ZYStcivaW2e5$vqMeyM%67cjc}}vr!li`6JLw4+}%xYr4oWgo0xT^6scR;K*WK zzorrW4^{&Qw^HaF{99}M@hL`QpwsvpZkUEP@=-QR%qqA|`|B4*rQJC*_{?2OP*Qj^ zVpE=vJPp;>9`YRC88F~+Qt0vgE@a64a-FVNkX-jP?s^^VNpF59O7}ELg`fK)so0bw zc&mN*y!5gTs9jJ~KK_A1iZ9CXl+Ny+d%|=pO&2S@R@icl-_<# zV>~UX#y^7Q`1guiAKR;`Y-ieVKx91WB)ZZxJRMoT^tYToUI;Sa``OVJR+Ze8W&P52&^0r3_2TO5*wjFR##Kr{bEIg zMczE1uJx#2@$yY>8hh#qlCm<6T2Ir{t-TP9FVNZoPZO010WHK{{!$tQR~9OjR5?uq zD{*NnYiVuM?X;E>$>)xFa`31;mNLyKrQtaT`V)Rv-bd;rraz?Gq)RrBsnn|T9M&>Q zB44%VydS-x&NHLq+w|!}!6!Fs=W=WJY&|*L_$4b%%r35lzY^v>Ogl)sysV)y{^A??p>eIO{7Cn}e#*_$!K(|wSdiq< z+>H5$c!K#mYC|G0vsb#ZyqsZRspC0@K`>NUl=V&}b>q#aZ!pt}alpwS@FThhzcf z;Qqr!RZ!f(gX5Kx0qW8}6A9n^NDY7$41zmgBVuFOT+)_#NV>G@{EOS@XCl+zt%SjM zYHCw8U(iLg!#i4M)05PVzJc4Sy5upl9|p9+HGZN>^_y|A`r)x_EFrl^O-}utYn#TQ zi3))L7_aVdHw3w3@#+LvawJNjr^gYQgGSizqrTpkz2;?At9;nKU;K%V^U!_KALX+* z&?5q9!}JPsqnc&j>wIpBL%Vlv-y&!lS4D5KQ(`*m=)F(arHY_rsA%QOy8qEDj&g&5L{gEPZ;XK4x zjYIHeY^Jb;fIsrio&>ra^*Ri|&!(3S0xZ9``|=)liWTyz-A=da-_Dt4Ir``xj=V(2 z3QE3lIN*Sc*%$LsOy32}=3-*L7}GSwDXT^4?*eVW)2eaM2Zl$0lJMHqC!gTwA0k=u zBS?~wy$nMke0q=x%|k+jYb)F@(~ui@Ye$>MA80U+%-EsTv0obK``Bevx|Jf!egnRbhnd) z(>X5G-hO^9i&V572u2>QUu*W+!hqLO>S5u-qJ-59=Oq;tl{HFjj&-iJ`d)jcc9f1U zFumbB+!|yV&?`4nI+bts^>zwA1-fyw0#~^SEvXVjNY}-a)+E zhfyi{=q)0J15N?lz%Qz)?js10fxXS9i14I<8ji7ZokBq}*5DUY#k~r(k3!B}Pt%|l zieNRi4h-NC;nS}(Jx~;4tr0&KnD`Wrdc1BPaCusli@N6X^WXY^q zmg~-$r%&JJ)+nJbgX)d#MHd&Bs$~A#3N{kYN#1E{3Q9S~0^2~o94xSJ-!Mq>H|ZwN zKA`W6==Cv&vr1W6iuyIbkyY`#taU4f9csa9!*!K^@+Q_J+wxr3^Xp96kj)4s95d=+ z{C&v#^w>@6JN2_}Y^U|~3Yz&Yo5na%D0AvWIugmOC!jJqEu1g$XagK9N1Giz;~WT+cu2y=OITx*HS z+raJ`OhDsjyh59?gTgCMIA0}@ z2SPCC*2~H3@@+b5bkVZAlF|tV^*JEh$ajVME3DlTx zx?3f7)ZtP}+k2s%`P}0HuTeaM2J=VnKf%tlO-=2v{FP=S4nG#qH)B+B=H{b<=||;p zN5qB^3S=^eOE0(`xTspGRRhg04bzTYd%VW)#HbXhADK6oM5r#Pvh(2vW}i0Ru8efd zXv>)PA6R)kZ9NJ|;ECso3jt%Vd&obv&-b2Xb#~l!x!s*cg7TU71q3=eLrti=lwJUqN3{H^%GZ(ZfZYYL|z6_Z#H5wYG+6Ilj)f z8tY#RzGfE(iiM!&O%3@`C08U4-3)JVlt0z>_^W?r*t3X;h**OF(BDKx5auz#_!8ag zR_#3{_9??N0(U_a!|6^;`X8lyDivN0PcJB3sSf6pr4O?`qH*=GvTg|$Kw{G3)m`Yhg(bq3JlnmN_cuzmLS;1w}F3NFp zUUFAJ-q}4&`~P10WmMxw&Hh(#%{3kyKs#&xIx4j3Mr=gtSYl32i*Z+ptxBB2RuRYs zX&-IN{ht=#FI#m`{~2+8?gGWO#mqvp_UM*a6^L@0=iRPZL`P@|yof~mVw5{2F6oKT zqg>wdTN|Z+G-=$+$)056slEYfz(wMTm`nx@8CvhOTkL6AC1K6zI7RM@U_gkMM~D?6!@ihxAW@TMPf;dRGl5bbp}Lcl7m;_cF_ z3YXcj@-SbVJG&2^@oN>w9&c~cV#|QtOzY9wkQ{5Jd87mLYWU4QG~YBzcdmcsz2GhO z*Sls3mbE<)qS!0eGc}GEj7(busm6(V$x)HO)521AX&E9yWC>;jEHW$Gw+} zL$Ee8ctRq)3fg$2e*qCjgy~MGn9+rrp3aE~?JBiHqe*A#DNhor&oqg|HPzh%CZ9^4w2dA&s&;m&O@xsqTN7Mx*ql1o3EK)->B;U zmxuy+GCqxX5EDBeq~F5VHG}|xcha3FYD^D3>>E3xkkY1^m??E~Ac$1tR7)WiTf-b> z{fJ@7yv*I9!e<}&OjSg#@&!Fw)6X0|G%`ybF&&qblxzqQ?DC@ zCNgSNy4Fz?$DWA^3)Bcz4^KbEK^DiSkH?9NcoWeo6v_&E3*(RI@FsMF<75jq9C|10 zk{}`y3JL@Z{PN+-Nr|=F4*3d@23S+&>qf3*7wT-y3Z-+Bo%!8;+Hc&Y&$f<{NU69D z_dV1vi9lBPLz^dmmD)T^Pe-kmaSv#s9QP?pBFVS4we=4CxCn(6KXfL(MeaHyt`Q#@ z|LjS@5HS`3)1C*fA1sWppZ48xynGK%wkRJui>A)H;k+ovm@6^NoBCv4T1I=1X$tn- zoibNFXxp3kyh+u+$uvT!Oi*Pj`RecWqO*w=?UXSt5@ow>N?rE@viy)HG@?W&PZiHq zH$H0snV8sfY@@du?NSH9YI6$IFE|c zEHf}LNJF}Ur|Rp+9~;#YkE?zE{xTc6{Bm`(rd^Cb#%))HX0U`VMTU7@v4s~%4*102 zQ0cL|hLWvVkEIE%#2)7-a*#x5qW`125O*K3H{U+Pd`4q0L0qRow%Yaf`kO5uw$Qa< z!`k9}yZhDcZGyDw4+MJ;ntodP;(9Or>?TWh;U%pdk!S|oY2VESjZfyB&tTDhRY z(N9juwQ=}-U_FYAwxVJR^gMzU+RnM5;EYv1Qsndlk@Txk_b)UQTeaBO3w&kGI_6wo>TNAJGy_@?bY@IPji|7F zoDV*jJ<|NNi-85FhV!^%rj4P(mKma37Lyq_Nqo;AHM|(r9=YlJmc|7=*M#9p=5?id zxitD;!xAm%F?bkjHAfYI4+GPS$$-35NKFlyk2vh;{Y&7wWE!^vbZ)W*fx5bQ=mpc^ z{E(y#hP*5y*#af)+zrjW`R3jRriVt%cs@PJaiSybaIB!QkJnJ6j!tg6B@K&Sl>Fm^ ziH5xHcTKc_!Yh=Gl`+wWRd?V0>1KfnQ-y;Gg>D>z1GD%n$8d6tLC`(GzfIx?0Bjj*iW` zoeAljfU_?nm;+-{KtR|2pSak2dgzSYTwSBZ30yjFkoI^o95%=qvi6LBSt>xaz59a* zh~|yACm&nfO3(0LPVhLrYwHF+e&zQz5B$>Je4ih#bUE}k^aIPmSz&Dj)_p+f_fQ-b zOn^!VoHSe0_E5h6m4ADyB)CM`A;O-Lg)|^i5 z{Ih_Qr1*5kf_dKn>UU`sSh{VXPUMmN`em||_>cCVV3I8hAfWozfr0pmV1h8-cT9q4H7-q4tdl}Ha&8LiS(a68{LAH{w8T2fm>+`Y= zKjsg_K9YD0=!|ZdSa3k}Mp-7P!l!?G+$F37l|yXo?1(kNQ0^u4sisigVmvkX1_r4$jD%nf$(l*YQ9f~0tP4>tQBrzC9|aOLlzaK0vi zan2>-TeW~jyx0}7S*GX87BZK1ty6WM8_)^a2#E(uI=#_rmzMIx4@-1FaBw2xLNP?5 zy#u9rb zVR6xbaconwvt7N*+Ez2{$J>HnqzP` zuw~s4RnYLe$SVKNLIJ!D9&mKw@;GoRO;92K{`+^Gyhc|rP~$Skq&zNkXAT(>o*4;< zmQIzUQcvZ;yM>6e++DK*cJ&hnHMtw7h-F*5%hp|0dmqRUsMi!pApVZUA<1TH1Yz$-fQHn4T%8NA$Ds`r!*t3CLq zfW%Zwc@lMP*tdJD!|osD#8j1^X=D&7`ePKb;L)Eg<9*N93~KMUuY zVehQ5F{c)2J+5vER1k>7CJX911sZ#u5Bz2np%a zx9r{q+XW^~E%7}iWM*a#I#CmOkX5!iQXx*>>Iq0#{3&s%9r9{TDx97i936)M&EaB+ zI!lFRq)kX=&VidIF;yH};pcnMy+TZbE*b8yY0_PGs3nj4BCCWCx1QvfxWW3nz{k& zLQeE~>iIzJ&!2oa7ZzJ}d*KM(<|Hd~?YYbPz&>a7EXc675F!aMbvWhR02Y~8QPE$h z%T0q;dq>6^PWjNLGi^dUQSkBRZ)6=#HD~<)z8znum8CGA^nKzTJzx+i*6jtKn zg7tYg*1nmDXj&6$5MtyPHw84PWvWn;=<1L2wQNp91<+ZOGxVJ-;vxeI_Dlj%hSP zTb7H@mw+IWg=tAPEIzRTRfGVea^+W!V*KBE&s7nnlT$*3`az)R@IK!c&Cf@l{UX$K zFt9zFC;&`HOsNZh#!p}Wz*61ZPpEK+CNdO5w9UDo7KaFl+wA$b)6;rM0>3ZtE#S=( zd|aD|ek&qqwrw0h?=GT4f>X|a#8xlmCZRb=!+n1`9@1eyM}fY9f$LCI0Ldc) ziiS!jvkMeE+$Ht(&Q)FeiW_>!?DTS!QT`}&_@9Z+9QZ%2+ul8HKpivsEGwbzWURin zn^F886ec^7nO8FL8bzosfpm#y$E;8!Z;lryCPZ{n457&`?-NBVWs}>~H46)j5}S!H zFW;o$2HZNmY$8eNuC4;VZ)Wf>!88ZW!(GT;HsQms20||o4y?a4I=MToIdaqYnFIydx+bYU)sp%%= z&F_5^&cnQ_7uyQU39VE9Ur7;P#VnE^c@SU4yV950lekve^M6<4FpsFkBa^?=(?6r@ zC6953h_68wY5)HHm_p?`rf_>gLuIv8@?CK4A|TGz>~j(kyQ)4^A1h5tNnszC1aafw z@KJb?S9TJMsn|R&;o;%oO_pK?BXtcpKD;4zR7fCbl`dWCeW!FF1G{6meLR-Y82!5_<@}yAr8pZV|O#<@IL% z?F0z2_7L5x_3&t3?FcgW#dsA@Y8BD!w@K$GJ+>(oD^?2o=5|rrzuoS$^as0lBEko< zbbM1bN#(lFU#XzU{QI8cb4bGtyHYkkF>hJ5b{+4qwte3Wi~PEiX?a9|4YM#VHf!*A z@`o(zz2T$8YD?>V>_xOKKQ`TcIP_=GTVJp#`^!P>Ix$Ht4xAvCdtd+pDC^4n14M zu)u}8H$<&2di_WqycgDi5}==0)J#96fLB#dYga6iV?Q^NS9+R@nx?CKCupf&hvcwhk^(97Z zuib&pgr9eW!fximRRcgWb5(a zSJM)^wIT{ud?44s14%ZQIfPQ)qMMvq{)$poeLaDO;FNj1``L0weJ<4YN-nK32Zpc& zISM_e^{zV6sbduLwnXf@5(ycs$B0;JIh8xZqB`*K70*tLm0LucUi`R519J`ioJ`(;0HwSM!4%H4?!wIRUx-z#gVtNIZZsYD1|jUT>b!H% zsKMgcq(;RIb>FQYFN3V%?|H7~JL=LOo@dgI2)CP`91q}{kd#w#fsUn^GtZ0pg}^L@gZoNLRBeW(SeI~&2jNcTf9x#fYxxyx$QpZcRdu8*f*A`;9p zd}?)Y&^A$!;(8$QVBNaOEuD#(nT=|y98xb5@b7K?rHnX>Mzb`vZu{qcjAQ)DHjYet zbr3JKgPqOKqitnuUrx_jaZD28;D)@WZQB-3>kr!@@QRm~Nlu7fH~0UifsoGF2mQC^l3vzX`h` z*70rlRX#UdkZ!OB!?MmLcx=~$Y67NGY!}#hF5%(!0QD>ah$7~*)E(6?2>xH8T_8}t z;>2g(gB@Q{Vml0V#4DVG5Zx$9cu8O2h}GKFW!{Dgwd^9(gN$CxgNPZgd-dw}v9GCM zJs~sL4-uZ#UlINAPu+D^#SyIX{}WIMY>k2VpO8PmZ6>id#H5pS|0(Bo)dQP$Txi!X z5tH6VdOW=8u2d|H+{n{-)zzgrHVbdm;8@J{V#ed~E#p1UioI1I;3S2c6v3%2<>3aj zn`4BnUn5G&T#yHfFiRfG^Ny%5PF9Q|tOvfr#1llW*X|VQySl7bIq;)r&-3W3(8^&P zl-1VOX6w0UqD81*iM(2?`Cn(4FBht#WfOVAf!Lc(HyZ~H-+&?gGmy=qPn~zG2IUXF z6!=g0(C0tWp}sKSym9#Xz^f{@Nge0LF9I^ACi*W@WoC|0t<}k28p@F)0&% zW%NSE|LGoteiV0@-}pT8EGg-zWgcB{ol)tSiPn?FRq=IAw-0qB#Ae^lx|)!w@>JwY zvZojK8U3ttc+B|?vOBYKg$_P&>D9gt(sDSbZn(-NG4Ubmwv?2%)HWe*BihbYZ;JJS zz7(a>txl^!HHMFFt=U@gnH%ya7WG0A)_9wG!a>={u84f~wn^&=%Oca_=>g{sO|dOJ z^2!3Fg1S|}gS0+X`P`A{@H1A-R9(zj^_$WEyIszndo*9kr{HB2lr2!RXw7E~aR+T$gVXroj5%@f+>egY;JWGxjrj8w_HyJz@#` z$<@`BkSyO2{bueHfk~N)F2s6K1sX6Y6l&}03a+WCs=jExU&E)+k<jiw}|y_orVi&|Ibb3+WFd;CD7)A5gvjD&FS`}fUoeq*{s_Sqc9B-3BV{y2oxOYW+vb5#&lned3T)DoxbGpGMpDLDq zHhMmuO5Aex^GNc1W7O)d6DL>y23nfwJ@q{zXqq>!xEq}+BkFXJrF{3DaOe?IfBg9I z@atf`a;tzE#02Q7?GahHE_H@8{B?|nCtF=w6;K?hfwlaViwGY!j`l~E68`D2r-beW z=FxtbaOmIQRv-@opk>y1Hu0)&cfXJ0pW|FyaBI*Z?c%;Fr`n^4Us}YuXSz%@h-)fT zGsRa&h`uHxr@{~9AW#m%dZb-!mG@FPJ~Hx*iAhq%HW&XOi{N4) zhK~-|PJlia>2y26@-ZkfgSlzX&@el7KriR{pozk?b6=|}Um;H0jPtXLZkvu~i;#um z3K9CGl!ZI`{fyPQhNV~5eG(m+T46;OtP@&K1N03!FM4PmMb`Mt)zf$gYu)0cDO0tv zz=U(q&e@M?A2{IqgF$ih_Z2m2NMfAgjc7Mx>3|KzQnDDZL8t}P4_?EfDilNCD)FHn zc$UQBXZ=&4A_D=|+zsMm4+RRh^S{TbNHoa)BdOSm4pD#~KdN@j$}||5^;3|V#H$|_ z2z->7%~|>x&@GkBXqyj3LhRC?U%TgwQt7&Er|s6AF_hWR81nf$UESnYzEh{BBK4|X z`GgMeJs4fX7^Oy#ImIxuJj)wQO<~Y%l>bk5@KHd0wMoYR_-Iw0(!>Ah2}0KqlN~XX z;xKFBxA{U!8(hZOl>6DU@U0LYs^o34365~kBfE><=F629vlI)GdiAk`$SAX<(vVaE zP)_}9bbeX)_@$z2gz&(H>S9`W)Aiigy=d{pt-Q#ZMa#^LI%uS#j8e!TQ>bT6#?LIX^ zYYptlhdthH9}zun9mhxgG?G6SLR{0oH?xfnQEv7Z;LRjO=?KoICUIjAmhf4%7qi>BC)O~~j2bMM{<0sJO4HEV+wbyoRkdk1oY$wTVP?)i1Cr@$Py+g`e!*ocoz$i}A$QTc=4M#FtCYXI-FHb^bRA z7*-tXZhPT4(+Tw)G)kGhOs72hvwj*UFMY%Lz|q4H;_qpX<0+Y_I{X^UMCm zMb7XDG6zt^Hr~YR2dCaeJkQt6I?rnOL11QrZgKoVnu%(Ra8P_mXWmDW|EB5}3~NMv z@e7}a-*qyYBN-|3C>BOk{yN{P*)C3uV^Cb(c+{9%5Pb+3u**D>Q$^^Ul*0LECf2=; zW^YVC(VJ_ZSoHC|Dw$jx3O%|KAWKM=%17H&9-F){de^rqgBNI zPYYnxH`1NY>*=_E!ni%^(i)fgZ$`tPn&x9oxhLUwSR=);R2eNbPUZ6qnL@}M!dYcM zDh@&w)q?XUTU`ha9n=~+cL2lG6=sF}{1=^a1QYl5VNd^*Q7tUgDLP{pFmkD~ZQ+ur?sNO$35UKO- ztmBRZHGyg+HMJNE*h+|~R5uj;$l+jsj@=-*O6o>aVY_p@8}Mehpz;BzUAqRJ7wEiy z-`;*7{scfNVjd|2KT_`X;j?^0KC1GlR&c+G$j>jkLKAFW!4-4H;r$t zfZmSG@%qQS$|XR4%rqx3Tz5)mR~4+7**bl-n!9m|)_G2t^3$(K>)!6<+I)A1Z$4oM z*xQ=leb-j67Tk3{U&!obyOGiN9C^ROwfH`lnyDAD5unH?Hnm>xHEbmvJ@E}Ek$-kG z#wz3pA{2Lfc27E?yYBKbC%ED__2;ovo_Mi2%Z}@IlzG{c_!cU%xqo2-i}IbGH~QOE zbR=EH@N0gYjer8Mu*vRN*R$xf?iC0hytYc_vDxQ4r*|S$B%3_R-gCx216?E#jL3A9 zOkHN!qSz*&95CzBW~?P#;NU;L=%Sn6NI2-_1fq2IfL!omZj6zKNSfB0pJ#u{X#aht za}g#XN+}8H=|+!kq!oc%5>njQGP~o0h^kuLO+xy#UoYj$_!T{E%4*}F!=v8s0;gH5 zx|nxj|2)fTz*qgDZ##Ui@W8n5=o{en%`R9ZH#ja((u4__8O$qHuD7K-(6RsJ+> zKg|T@PKI)SEuR~!{DziU1fPephL1>{ioxFZ&*>jw;+JmEzfHJ#H=m01GhiOC8beKh zc;s|0uNK@)Znaf4Tk^a%ncd&sV->JhZ$zecM{RNWrt^_|a+@Md@&)*~@5IJ7M#Ty) zKCG8NE5PT;%pNsbt?*i5U+BY)@^2|Z2R9w0WaTdA@6Qe7Y3Pc`s_7|9%KrW}JA29V zVaAuQ>EE-jIquMQ^&DS#_$YnuOFzlxQ%e7G1@(m7cdwW%%liBP$aA)}edryXcBag_ z@YHg`R0b88JxP{}ZWVro7b}AuW?^WDGMSci=gjTw<$YVd)=BLNFe4ZN=yU?i!uuZ# z-#4KBd7vWw3xRY2=YaI)-&SpSoZX9=wsZ43qW9;<4P@q)Ou;mbudQ~Lm6lTd&1Gn9 z-hb#NNIY;ae3a74nUNjFu)%|JF&3b+dMHBMlKOqfW>~^6(6C0b`3q@w#Kl`(lo6&6 zD2Df>_!@uQt9IB<;InxQPZ3}L{`95SyPmGR_WZ?Sv9<{W1l!e(M(j$;T8!S4UXZgeGnQ8oS8fK;s46?k!?Pu6J%$1ZB zv%e;&v)a}%%P!)!J1r^cY>gv%b&a9p$Q!*RD`-)+24U)wBh#& z#dB-69IrJRRk53mtIoFef!`HKh{5w2>yT<1&D4mFUp)4rglgA=j2>QHE?P>&oV3Y& zzY&|6mX^RD6-fnwZ~(Pq>U&z{0A~rkz13Q)gKOcc(k=)_%_Hxk2A6Df!iN#6pKOJf zS7r}34b5miQJVc&K zGXXjnfu904EV39^=ZaH0=&qS9CECql@^myzfh~b!JD5G)OPLpTz5N9p)E@)Tq%YBn?R0K2?<_v8vl}xnMJqkW!(sqfESIO&tfucps~p=`XBJi z%qz_C&D4)PuH7&`H__HrY<*BEUUKI;%@;Qg!|bWJIWj#ROl;6&QCkMHgC!kEI<@XC zCi3xdEBn*%5Q&%y#QVn4Iq0zs@gzkjXlDs*4{eE9&%D*M>xs7=T({R(wBcs;YqCzselx9};|kTLwU_xZI<~E0^wph>gyH$$;G0LJp6Zo%eMFYb z!}F}kZmr>c=A{lFrv+TK~f8nc8itgbof+!(^0{P%VK&>#8 zg$BRBbtnJD#0xMeZG$2Ix0ySr#wwqA$JJF}wi`+eOuF`jF)-Phx~4f4jS6;K&0fQGqqdUdfSc?y{bRY<6vE@^RZ z{(!nL z&}szhM_`5ABqcoIsSGdDZV2I0(4kY;tZqTLzUDrMUUK2BoTOo^onb|Q+me6J07^=U*ZA`OFhMm()Cab`yBW6kSke0cAI+yx zW0&H%4%BjK<2MS7>UPCSxO^y7j4rXn5E!CQk*- z6XBt31-u%BJy?YEK$*K~mrU)c={NiF!+FUiTu-O5U_DBb!G*S{(8(pIvCPzvzdv~m zt&yH~nN~fxTAv$3KH$2->WT0HnVnv+9crbMMQvlJSlZz=(EG^jJRW!Rp;8JLxd?YV zxekc}y@szJWe@}}%_&nL;t@`dGm4;NCD#$bu@Tlbv%8dv>vby*7taiQKU) z=vU=0|B!CT-rW*+Qe!Ssn#I6(DJ>#GH!sL;`G$brEQB7$hkbFBZz#5F*5Ib$(%Mjd zg#~gvlo8u7L;n7KQ60Przh<}_(B5^m6 zW>N#?xDEv$_*0_WdN)m>!ghGt87=Fr=EuvnCn+rn>0iuI&~8lS)X0dP{G^0G-utSr zxPMdSs@%<B?OJ-IPfF#ESx`aHNSKZ_Mq%NlZoP)o8LaC&4&mNp z@Hf!N?jUq!U$MZ1G2q)P~mX=(wCMcE z5L=E(V13E3UE1QqmG9!%6Kr@yW@pkHO`#2A-ovpldRdt`r40UAoE=u8qR=Aa|2}j--{1fB zx}Vo`KNrvCy3X@Fj^p$BycdIG<9eFk4d>;qBOQtPN;Dy{i(PY1lGMu$eDoY1RCFgC zCHLu}yMAX+Ypa>)+I`N|S3<5=?t16za7!Q=-X)7mdu$g%bwf}v&2c(1l+q!RJCSPR9{&n85 zW(YW{J!@^Be$zpkUmKUcZS3R!erzer=-WhJXl3@*jwxaAS<#~uGN#P4TjNQlTGab5 zwiJBfeN;VD%9%OQb6v{E_=V9W2Id4UK033iD%zV>-=su5g=!QHCqG@Dcvpa7r?-mptmX*=C=eI1h4J=ssTTnz|vS8)&IVk_%z+bG|8Fls-L1{QQ8D$=nvJrg$3} zolUFYwVp?e(Fl17)&*pJy|IN)7lx_+RH5e$Vs*`-ll;f8YU?MA|dSA@>A3EQEA+}g{2I2DM!<%?5ex9iBh?Vn}AyzD(+xLM? zH+a>k;_4w{52D{t3a^vb-%F8-%Fh0WCE}OBme8FF7e`d--@9zoy4?&i=bN35Cxs70 zs^vfJ$T7WP3~Q{;(O@&tJug;d&#ph)tfd&1>RPUc zQ=y_yZS(K&c$_`^M8=rZnN(cXp_e_fNreBtklp+REvD}|Ped0-ns}ybeHM(&bz;7< z&gvHr`iRBkGt8aSE6h_eTYZF=KY#~1juB7Y+LHGs=fT-vuT>ed<~;W#_R%id)WA1` zQ~hA`RQD~s?}Ijh5l7bQ;5=Nxt|wFrvB=k~NOOL%a$`RL?V4hj5txFVJwpxFi&9M! zw0pU5Rh|TOeq8+Xm3SUO@4lYZ61UKO=;twBrk9-+i*97JPo5e$de9Aj;ZHLv)&~iV z*rC8?4Z#BlV^9}4AI+9o7XZVp*(<4X@z^Cu>i6!Qp@V1#URymaJOO93kYK}wD?@P# z#5jle^(S7_^U(5)cFrHU{nb-&(9dJWtIRs^ID2-#^}|s@W%PYaH&;6UZ`I+Psh~Q> zbZyb95L1?(b*EPDVfcTGSuZHTEdvc~s;7 z6`&GW+0HJ*M&pUy(8+@;3Yhz#5pl?R3d=UwgZ1oWre9;EmZgz?uUeqR#2p)rp2(~Z z{7Mc@z3qtzzQ?z;BUlc>fzRzLGnvsxdB1aHeutSb0XH!HYys7fJaJ=vy-_RX3g`m zB9ytOrsISMVOV?;Xbc+BT#LFbII64iSJueAQ-8>w)G9oI<(I5reCLN@;2`unoNw~H1J2MAH=lx-$;O?8R8?n@ybLViAH?B*C4R-_%g zh$e(EG9{$>C1Tu@+z>lYeD_o9jYyvbU!HHo#sO9(kF>2@r6a)h2;18o>wXjB&a6Gb z&MG&7RjD)WP^*VPlbDlsv);Igxn)RHn$A(G$|~(Fy`*0cHNpIer3ld2k8wL%Z_!IEN7FYQ%J2(#DH4>c)wcmoUvtNfigIiGt!ZAmP|VE5nrF5u zC2D*&Ldp&ldLh||BI4OUspaqVnRn{RjsyIyCcluMa`@jiuGO>n)*si(|GrlDq-{G3 zOHN0UMW^{=3J#WQ%G{cH%^+483EpfxdEl8?OprrFNALRQ7^(?8ZBor(!JWjE#WKdN z7|P?MbDxa43YZkG?N#I|z!(z)59@#IvF2~>RV?)U$9c2DW<*j9>g%W5Mbs;Pnwf>= zkVsZ2ZJq#ggU_8nXw9)1D&z+cBX_XWQHBMLQ(KSQs&IdI(l{_a{Ai?~kQRdr?^$jK zpe(9v^*-O_Aon<#T2#z+WZPFbBAD9#Lut3it>XVt;{5i_sG6jk+~a7;0h6@H|C%an z;IJtLBdLt7=X4DJ&HTl=&Wdde3SW@xf}dG6L_g$TY4ev}C8*{sE{ zB+~decJ^a|Bc7a27F>9i&<Qj#B6r3rDV+;UW-IaH$P-wv(gx#mxT>b}3ci2S*wMLbQG|ZoP1I!G+GNz|2 ztzUEf1c#2Tf3gwWXC*0jpZm+)=lhg6f~}U68moUr?Oiu9F+rO(-+$e=?Z%7Qkz!a@ z^iMm}V8K+TYo_%Z4X234{0BMFohi`set1Q{I9}f8gGERN8cd zVr%(SZ*aTrlUVnZ0*p3or~Wk*4A|**Kxdoy8&{Z-<($&DI9^t;x<|w)&bXCcP&Y%{ zRx&?iHq?|gwZ;EGpHRQ`TK0LIqP$^P~T2|JAOo|MhWuZd10qLp9D@BHuiNEqT9#ONp$gi5_FcU`K&Z@$WerZc6dSg!bcD}O{t@3Q z{$)BUdcUOPM{ub5i;l>fMhD()M+H%t2$!C}uo&aC`{E*F31)h7jx z@VJQFjpi7GKI?T>s$7T?G77-e$el8<{inb5rBk^MSW9>>t&2-`S;aMvqsMfXmoENh zD&1D9DLLy+zJ4tk7eeTmEQF{q8>9IbX-H~U1{hJhMcA0!GG!mxTW=w@Et4d=U{v{g zkYmYOD-Ll{L={T}`hk(*TnCrG_dWp7IeVY3`bzipAC`>%64a}pc;F!Gc-;Sa%Hv|A zWG6|QNgb7W;hFFPJi_XiX6!%N_vg#~%ngN`Zz&Q+-)#D3@pl9H2G!r`D$ z+6g?n!8Lez@UT;E)H$(}Ebx!80LfQp$i4$-WXh=jGTaxqPNi)ZRcu#~LV3Z=1Q=B0 z6F?yQ4>k%k^w5N$TfTKI^<=4_c4WzEO`K#j&1>~}Zid6aaR-Q94%P~LHXCGGc3a*{ z^?fXr#G90!o<1svIX*%)o<#!wf$y@0LjLj{=Or+bGIcc14DA-aTr6?+ zTD=C5gb`xAf4scg%~piPH51GThXSj{SW8MmOkcX=@*H+RgA>Oteb;NrO9m&(Ony>JD3m*U>)!CK zqUPaTMa3y0%DbXU1XE`Ug>`dyu~KNp!xS4BOGbEnuOSaL0WNk$Ae9 zMi|iyN&(N{4Bg9+H*`N+ncG}oJX?q3GntE{cJMwC!VKqY5qb-~TNFyaXSwYJtZW6S zP?dpjM(cZ~!yO+7$Gl1#g(A8AO=9+p*bFFGPF*ftB5hX`6V+eYERJ3Q@oClgb<1CA zi@P1l#W-L`^=Rm>>^3MC23z;g9{k{F|BCX#xU&|cpwgZGQdey{-KGN{NO#QH zNg2LXI*9q!nkXapZZ5t4i`FHXPhb7d7r>ep^Kgl%U8xOZ9Xb83=f8IC8U-m zL|$8n!9s)m`6-W`K)ba+Jz^AGC;?7$o%yAr8(~A;b*Y(=h3k?H0W(yTz8*U#@a}jg zf&oUWPTL?#Wbg_g3Xs*pb#hlluL`m|BX5F{2}{wpoVQV9fk|gYGYvVBS*N4T-$_fT z>Fn&Vd%2~<#pf(W52~~B1O#S&M$tDukFDkV@iMmWug#wmGO!^?RL`vQb3Aomrm@DQ ze7~lhtlBFZGlhh&U}N1^<-D&Nm%k^57AP#fsFcbh(U`}dl`cz=C%aCn{;ct>GC-*hmD$OQ#je>fR@EvefwL4mQ_R?67Wk9|z z5c|zQoe7K|5N%Kz-#gUZ$@5mV0PLP_#*4R1>91q*3wC0+V)K1#OR?=}YfgnB9wT;L z8_H$vz`dnfro;$&Td)^o?D)nvcmt40zOUysI=oML3#VdOi2Wb?Meej19{rlsCR>0RRY;T_kd6O?uWChtHvbsa zp=R3P-!iOU*zXTqTwGk&f&+nIVQ5(F+CnV#bT@m&DA$Z06Pu9pkSft*O#~J(Gvw~8 z6B2o~yuM``@B2%QI~)xkYy?~mnYv~`|H-7VPYLynU($@VfMQsX`{q@mZYXpxf|vP! z0N46Pm{v$HNz~SP>H*Oyyo%8W)AQ$Cz zKgk#jP#C<|>U^28WS^IqvEYH4o2vWc1eNT>l1}oJOdL~CM#KtA`EghAy()_II)}tp}ZOeB<%Jv5+T-0 zni9a*$h}iB?qe!_;Q3*H>=%N2m3toqB@e$xS|;!q|IB`Tx4H{YwOjCi>=|n4USjNvb z@g+Ndus}Y;*@g~01_X$L)p0E@Ibv~$byQ^JHcgKDydY2=rSclGqHiSek`Lwn^+Pc7 z0kJ@q;V*fgavOPX&$PC9_nY}pr3WCm3z*|W435aq81<&gpD_n#R#CgCjareGqzQ)2 z_I~t!08Ml8{TpH>sriYNK+*z?Kh7ymeKL+_fDOwX^6S^XB{dwQ3ZN%gf|KgYYukv&}fx#A2W{HDl|A=Lqm zcO~(q#Z)CafCa=Ii>G=g)m_~6{~z9_nWp*?cdH0~94hLv%dX!MnLpsY*^dyR0_z>1 zQj&oBF%~0g-Hn5NH`*l_plw_Jj%`1~dDI5b!xaJWQ>h*0jt!?xns-KvJM` zk6OIcHISwIfi_9}(1li3M5=&aY&cOEp)E^`eM?o)*abOYHt6xS>=${OdcDRoQx{tq z(lkb^cPRgQE-;8}7vjMm>;Rx!%IiC?++0iOKx&+$*hC^&vP4mHRyiFV8$sUCrynR7 z2XHiuU!JO!Uu?;HZ{rqz zg%DW-^`Z`T_mz4+wR|2d&VcUIDvmG^YT9qCPJ@@=ljqDdORCrMFhht6-4@fd8rIrn8@h2uOeoq6a z7X=wATSV&n-rAdU-+1I_{qY`Up~TZqS# z3}#(`Q~mrkngOAx#VxDUYpCNlH_|drUD#9bn07S*)tC~Q)!L&QoO*BAZ1o;_*tYm_ z6YUz&!2o_}Lg>8JI-;tF%8614lhu2H8ZX?1OJ;>{g8a!VV)w?aNFyw$%)0~*p-X5q;yyZ;tZiD$n@V`DIw>r#CF#c@Exy9g~cwJ_bj zYba3|)z#bE?o>yZBo6^-?0#CC*I4Hk?c)Hh3&G^G3hG7oAZqW!m6=B0KX$QJEzWb= z0u>wAu33`SRT(U~KvDZHnb zgZA(!`As#Or>_?>ZnuBy-pyY-^E!l+seN+2qnespi~0AX>t=g;RZCYOdg-~xbM395 z?PnEy$q9U2#}!_8HfbwWh24a-=dD}Rb+dHR-5EA+G-wD&kKZJ}6dScS-J?@)`H#p_vHIs(t;a@#l1+5gC8HzU zOJCcS@}pcP|92GaawbUQavU>i5)AF12W4o4J1_jgw1P8eN<%?g+n@>_Y)+Z)3*%nN z>^pTQt}5%D{%rBf`ZD9wTixDdcAd*PC^L)Yubrm=Y zV2P{1Is9e1L%Pl(IvdSNWuCoya{c57zO;)+a$am{($EKXt4f#J_2VI9=DeKibOUdi zmqYQWwBU44QsPtl{g>544|&b~dwh?nz^{zAGe<&4RZ}!>2?_q;e2y zsai}SN_+B;0P~Se0ZkR$8q`MynN4jOcRn+&z?RU`VmjY|!5%13k75((TdSNXx1*)>_-FSBlZpK4W%*v7 z?0tx`sjJ@Ced<)TBcO=u=$T4$a3uxT{i1g0Keb{|jh9mY7JYL)vwo97u|D2SFgk7{ z4S^S_d(X*sHl(OtC@v!(r3PW9Ts|- zdqViu%Nf}akJ_xzrn{=VHmlcfS-&e_50FBIIc3z`D*#^>?>cC<1FU2GC`i*S(kJ$cU>pCJd=gby6b-~p>7iOS-jHO9OT>*RX!|# z;roc>rMn89W9HLSFPy5dReRuKIN}3<*dYJ~nvp_kzR(Fs9v_u59|ZqRF>SMJ&haPhH>562Q~&eZLRC=>C2P>d zW<24h$alo-KehVI#dp6@uv^gP2n6~pj`-AwH_Kk1=y?W%D-rtZ(k{dOkp_;Hn5hdg z9zLL7Tth+!5mI!Wi17&}BUc~;KA6O18bz6)_oT$jy`;^;MdxzGLywHl-U$ zj_xx15|JZ$*qU5lGcJt^kUGW9ifhs$2gF zexI1DE-vCE;CTMad3kY4e?XESfhjTfDpH`1xqMKyYe`b@`2F$r)TeN@q|D65-#wi` zZ^3u?;OtnxU6VcZP!jFACn9GYm*6bq%MmK4{B-j8==Ilq?u*yyUY3;`SABN~i+!`r zex<}Y&nv~rT+Qz0IsmtIGHUzGuXu>$=e>~R?3B`LKkZ;kfc1~(I@Ww9+|~0tt$DwSMi;G*Xx%1l3*xeShjO#VcA=jTTYUS9X$~l zTj4KUknPQ2GFz`pSo9vUj%>!`I(B(`sCm^v4)*r1h;A3vH3offS~g&WcdPE2JC2_| zC1h_Gx9acdTig$X3;@>y-hfQFYi1Qp|GEH3ohWwDfn%(#uUuv*cz{D>nt_id`q1V5 z1a-tufRWJTG*|G@9<97w`ewF1l*usX+=`u-zlh>A1teKhI8Y!b2M7GX(V1(^t6tr@ z9lUr(Y&$NV?R3!WM#hjq`lmvjvUWPLD`?6eZA8;o)pu>f(%Jd|?(}tkViwMFWjeb# ze3QKp?dGn(vrascl~c`*F|>7WF=|WLHnYe9Pgk-(bfc!NH(& z%c)~Y-=Z5t8g2wF&Bb5dlh0?>B}#8@=L`F|K^PLe$ThD8`$`m~0MHGZ#46d5f`oJr zcDwGFT@d5I&4L-snh?xf;g@I%-a@KB7%U(VBfP6(lyMGrirjn-n$E3CpeNC;I zUwiut&1*x!nCt=f7Ar=29@gRNKvvAJbcZQ$9IWEnTZI7qE8vD`Zu}hv1i@mr!&8M0m8SpuYuBFT2!cT40=roR=2GW z5h}~|kGKgni;|u-G~E4&!e^mZ*n#N*P_F_lkGEfEAh^&42vhi22VzTsZBIL#dxVCL zehPTMzyaQG@Ck=Rb&OD_9duZ4nZ9|`Rp#AGuV75(FJOriQm--tLtIK7EWyp|;a|QL^QUggF8T3>HgPlcahJy&B?K zn4%N~$@TWs9W=)R!@e>`An6G*qonGXvypC+8<<~?u!)xk3i4$C^`G2SUF!pFA=n+A z#u}0zB>5gz>*l#kn-qrbJQP68NF=wfBdrHq9|*=6M_+>e8eQ}#|MUBAN#NG+!O*y) zjB0?A0M4-?x=kKx(x8bL<;^ZTC==`Gf2WPhvT$9u$`EERc5C zo_$UIbuZs>80hhrsA+4T!Z>%+Ht?bkQoQsY8>#Zdp_gLc5LIwPD6Wxp!uj3pAtCD9 zg7}>{KmgJ3I&-Zp<9pIJ%KzS)Z{$eEZHt4AJ*jNgL&~3B1=E@(LI%$Odepgg%~fW? z_8X{UE!O!0f(xFLC%^TskWc|3xc2ezs%(jsi)ioA}{Lb&m zUv(tsQMI#Db(sE;+8xZZul}y$cz0p}^Ra=kw8X-_U)=SX_V^r?fP*>5!syAualhNQ zZ%?61KO6Ql^jVhzS9(VFNuy)ODgz&s=Wf<*N(kn+YCLLmlXE44wa|5geDGa;k!l52 zd{N}U=TxKgf}#HdFl9=LwNE1mCn+n-(U7qk_xdmXnZL0NNG2OwZNxEk;iM!swVTjE z0L8F)+kL0b0t{w>n+$|T29qcDsN6)=wB3qf4o-f(mt{B6KFG~=GBi0CZwsY6j3Pt$ z-$5yYdu>oDWrExe)81vjDiSVKh1RDVN5f9q&;cl!#_2s%0?s3h(*vqn_ zb!Dv+ri3^kP(>y2>ez3I�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

tOu6?dde&(fdH|ERp*vb+P|no46$2ke%<` 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 z z^6Jbl$a+swT0X7gvv#nfdcB$#O_l{Lb11v4O61+F=6;CQDvRl6mCa~#AXZI8Wub1B z>Z`XV^*tP0U2!gemsCFdk(wsWfeE3eAexExh-S55W#^YEVhyUTt!1jfLpN%8qoRO- z5KgGQdyro-75Qda@Fs|72>X8t=6_MYm(1r8CBk_en;8IX@-g$zTI7QEDF5O@S`S`v z$3c*D{DmYj$#dwn5P=>v`b$SRAn^bIwsIl#KKbp39P(33EO40ejbKAk+HDBdqPe%B z5^PgqgO`mJ_2Z=!TiYiR90|gNo8G zHKdMby|%6Haq+IVn%VD)TW9Ce)rzGV51s>hbp;t?*OxC9W-c?cu7Bzjb2F;kjG@1) zJ*t#@uPHQ3@R?d-vQ1vq8Tr2&e&OQQZHYR1cPTA!DN zNaTSV(WueL;vQH!|APO@39pdJ;4mIdf!t>Wam8ltCm9@`4BdwFhHp-sy@SE-C7gujX zOP3JXHULLb&t_?GAcquiFDEheRt-R90nQoyGRi)A;c|I?2paMFJ+EhKCrOVlEurdL z5Cj-Wpj)6n*|u&>;7?RwY*3s6y=!f**Ad1{yH!UqPSwMFSvn&~xZ-vubxZCoTjSf~ zE4?=XAz6@MrOMG=sW-yyD&M)h=WRrSLw61LN$Wod-bdG<$_0>#^zPBi2A-%39-2qPkId#E-n#PR*pi$KczE;yiLc1r6kW_3&Eu;yRh z71W=z*1f^o)w2whdUp0w&$xDOl3L!GOJ37=t+l=A=!|86Q?1f-M(1P$R1Ik`pc3bjjKT>(kqFJ4ryqi3jmbB zzoi42h>GBIs*8E5j|%$1%^jxP2<@55^4kjm@& zD4WgxPY?fl6CcLdM;d=ZaGDC)O01{UYHtwI(Lj8+2E5QHtX?(3k{8OV6qk11QyY`)%2 z=$@d(1BehdO85G=0#;G!E@jNnuwj&dyO zx%D994zjBQ30NDqY=zJOe9i|`FQ77okMNAWLy~$jUAwo&A zEYMCt62O{qTC)Ph!R8xax4kw}z)@Al_!##mtG+m{26uE7@x{iA{_UuOxuKi_i4@w9 z`g@%f#8Auv%slGOI_r=a z6MI%?8*q_Y7Q1wBdtIrQoe5qKg?q;yM?W=ceGtPLSbpWtkq~M);_lB#rUi&S>|%<~ zmPl{jMd!-VT%znO79NgV|C}6qE_fMpF2gwO`UEDcxsAFJ=vbB+Yr~&XTyliF6i2bC_Ias#PB6K;C8q zvMFRkkS;?m%P+aRNlNJvYt1zC|A(n70jF|pyP8YVgecLGB=cBE9A#IA6tUSGl`(Tj zLa3A>LdZ5ok$EW77K$Y8vW=O_kR(({XdvWYuXE1-|6Q)@JNbCq``yp`JomlUy4O0< zSUh`cVS~{c2MT=!tZ!@f^mBNb?Hj=^C!lxUCDHAq_BAtZz#QHmPx2QexUX=y>@4%4 zS7wCH=BQ@i*q&&ZFEpgeJaWX;F(%&Zk9w&R%dPs^l*QX0q_zK#J?XW)sS}k`ew3}| zY*%SZL~Xyl z>grlj$5cbPD{HF}bvQ{i@J^i$%in1Kee?NQkkPedbEbiPOKeho)y3}jj+xo{g=wuj zf;7Khl0=SjvTYYDN7+5zC`zQ@!?$901c_A<>p#)Qd?Tiz_f{z0P+XToa(xYZtlVo< zU4k0%9oIK6UlMWj{%GI@%wsfI|HYgv7D^Nj#_iO<5r*G3l0tByV3bC#47oqZZF!!T z{nvA@nskH6uSYN3&8BCM-rh*-xbxzUg247AEMl*8$Ts8QKZbAKM$1l4GyF?$+r94` z;EYH6wJbue*nYUoxx$&EZhP71z+RLoX`F?{!Wp8(`qIC-bA{*u)Bax;$!08kF?qC9 ztKah;-BKp1_D1z}on7SnC>EDBP3?`kIiP@@k3tiTwCsBQL4jSlsr%-Bpj>JjAVD_p zztGAfktn%%^dVF#YX529sw#5;hBZ%zr>b$pRBYhu>g`>JU(n^aC#*>-L3|^w%q&FU zB1SvnIP=QxKQzTQHr$k4S`t!kdyWBNDIrwH8HggB`qmj=#cPWt-z@y z_^LgI{Zxs!3O|q&G#WsZ5WBfU<8^K^Qz>BCvSpa>+_3zw&U{TfN|}~o*dh2zewdif zwQ1Ow>*DHZ?FmYbYyC2ouBfpxX$o7AtV#floYNJ|Ub&2y(SOT%^+7#?JjTY47htnd z{jXWckEUXQD{G$O513&YHiX%?tl5bbAEb5QPl6C6sep#9e&sHyk2E`bZ=`&zdlvGE zCgM;#pDxc|AT&7>wHuB~NUy7b&;@k?k{l3Xc=&~%mGEFypl!U=vCZ-6kkNsu$1{P{ zKAvNrf=igMi;5?^FQjSnc_v*HTT$AGt{3+XH3wR_>NB^LJeD9scf)eT?M-s)Xlo

U;eEB+s(?vI8EHj=(hNAqj?q<>LziU2xAsc_u@&$N3P<#yPB6S|HQkY z2uYerE__?h6nZ>&tNlwa>-O+qQ7ukBPA#uv#1pp`ctzAD`kghtRhPS@;T79Gmma5V z@4>UM$EAKL9?GDUiZ9;y{Ij$1oTle~5|@m=viXL(P7d$2<~*8hJZ@C8+&XBxtn58& zN6Ig*E#(Zu;euDGZ$QGBFR9SviW&FI!qM!7tpQgjCR{$1pQ7CxF%aDvI#g_3WD0~2 zz-IG>Ct`G^@>NCD$8j#-Tg7oQJID7FMM29nSRUYOCwpKTg?S?xo>xOnr3ZP{hd-PIKN=$PlY&Hin6 z_a|Num#`)_M^8s6cOXwh7M`xD>DZeW)OVj((yT)4(pqf^^bAQj8jE1%K2J`D%T z_vr~v&oHv*l%QKR>U$QbBUY)#Fy@N32BFaS!i)})vaO)Q%lG3C!+p^;-GlEGz zKPkp;c7mI#!3o(jciC~T+;ro5&aNtQQuV>SD+yyq+&PDCuNl3o zJAy<}8XHF_yE;j+)tvu+fH)*J$o;8EyUi|s!}Ko4;VNuP-WX?>q?UXnQUp*d4t>&h z>U7?sGkN65kqH=C_F8vP#%Jn8AH2^ieJ7&D%vMQg0vk+B;dj+5jU2c*{w@@;)C?E1 za>q{X9OjquuOb@m1@3p?_<$6(TNWCr>9)kEzB4Fk#z^$hmp*CF3Ug~r-eEQI!GY$; zWV61A|L!D@XD;G!cQD-N2pCLgl)&3h&wbd!o~JHwmH3aav_7YjT+N3wgopApUfEct zo1C=tRR-TBwgRJE^D!^n#E0jHbr^qIY&a12zA*SH*(s)$tAd{7^<_^WWfcq1Xu^7h zmwCpPBBoYf*GWm~PYMG9x@@7{4=!$Qpl zf?h2w9-3-+a_jWM@6MA>$q0ppI8*7AWCqp&MNiA1Jtg2#f{4056}SL$e&Stc5r_^X zzosBO;ftofP<;M~2Lz;G^&*a*8GrXAY=9aDEbRsO(fxxz2`zy0`zxtc72-`g#0R{% z!IY^5^e(+0d+ibueIjQ8#sbn%68b%8b4S^;@S_R@pc`F2T1TFC@cepX^KQ+rvMMTH zk4}ys&e1C?sB2g9`fl^er!nckh=OXgu%}P$yHBjY4+Dq0c<~~>pQt$Ck(a2Vio1`& znkMStcS2fVyEdM~{-Pok>pp=l=$Y1KHCQGFs{c6U9{~&T!eVybCdP3M%RUXsT)lLU zT-G%>I&7V+b*KKF{h+q_*TxBlA7z?Pj;H-@G_l*bTunPLA=7dnhw-1wdlm~(Kchzj zstxH}J8CBlU>+0GbA)CE=6}BuRgnriMv=1PK!5c^F33(urnlora7~6R_{a+CK5BGu zkIQ+s5YmNX7ugaL61I;sS#5E_ng}e3>$*UW)-N!c@6HY z#XOzM;~^n_3$qF?$y3UXOKxb|Vhoxi&+fpTj)PyPmKWRtL5;R8JG*iEY=HLVGPj?mw?|=$;AdTGvO8 zoo7{NDWkm=r8cKfA`qGr#>iU5dnNfJVN+g&wFhX*da!*y>&9AcV=7dtd! za{eT{9YMT}4s>j2I#(qeJUx0=H3W}y%BP<=;0XqLpetpys-F=zFphwLmAP1e4m(HN z{UpaFR{itnX`X~*e)R6+G*josF*GY|1UZF{OL68hUns&G`q zO);TCsdz6ezpEBzs~8sH2dtU3TsPDoV(t%qe#t%^knCq?l?hhBQk>5VN@dphLN^W)n0^nSCu*{t|>^MS)XRZUY##fzt`@G(%< zRD&PNLT4{*|0X2_3%zU^#^nc8#ilDd9X!MbSnfu$_)N8T--++^tfC+;(C^AOYryaCpACB7Yh{4g2O{xJy^Vh?(fX?>%_1Ub)Evf(%ka!!k?HN5_W7MkgK{JjB6heb{mQ`A!re@ zKl%FY@QD8iHr-8WOiBx&BG}?-&7p@=>B9Bi zn9|8uO*+>4erkqy7WH(G_f!MCYvWvJ%A)zJ#j~^h1{4CxC`E{H8#t*PX&;<(e5}ov z=g#R{iK@qYZh-#?OkdEtiKbZbeDJ42j78kFtKj*bn-`?ak_`-W1ups--36{kp}E`| z4oMFczHbqHo5xA9)I%EmT%rv&{te5eHA-t>|G5J}f$ zn-5zJ;^U*#P{A9~?o4XM&Yis(XMSK=z5hSVY1+h$_sNxoMwcICWn~3%FQ^`);;1qne)w?LT&9G zWy+Ua(by>-r+tuvWJm=j;c!y)bdGb@CFwlWq=jpfjHpgwe>F{^#9Ukci1nXZ0SL+} znbFmY7{#leLM2hx04vJ0cV$nZzT`&vR$B^lh4?^YwmwAzo6*K_2B86W#69}sXlrUa zV~O{bKSH;N?UT@mL~AhkYR}c|?6Sdv8Ah{GI{E_{S_b+J7-^gE9noS2PY!shWEiZm zkUuS2^;;Cm^W|n_EKL@M3tH`#d`%ADhhb)aWGqIejH!iU$L-BG6N`cPGSRqYcI2Z_ zZFzooB;?t98{=u|w)7wG;G9>~L5JdpIVI2EE#JvFVbE?8whRvhpuSO@;oao{^QchnH*&HsH#?0or< z00;i}D~P!oH}3y^WAz6azu^ChuqoE6zVM$vf9_duiWh<}2dUVv`hBA9|1R!m-l!$| z4%%c6D{7vHvdYeN|6MD{vv#sY*RVTH!AZwWZ{fFUEyj_6m`$g;_1Z0R)l(h%KY z0uKtdn%IkD@go*CG?$umd(W@4JAPdB+mZeusBhde`5&<9Xojg{RaGV5wpFW!)&J3k zyyaQw|24qE;$b3SoZq2R!=kt6cm=NiQRpcU9_6NMR+LZWVVL3vT7-`dbK*{BBKJ?0%S{9hG%+avhPD_ z56>OIe~vz>dQ@JvC;4>DbW@(FS>JH6r!fu1K^6s|(x`yrHC^CMJbcEfOtm<!U7iKNXwhYZ3 zZU8TP%moxmu>jv39N6#;4pz?&b4tgBkBMg7z!Q;*jmgxzjXE3F25EBJ%=~&(_WB=1 zt#_{E*Wm=3ql$XQ%xg2tqNC3Tfp z4}U~cK_m;ijnsmI7J6uQHbA=koz}S~X0`P<(2XvGRMbD+mhg&2XB2E#W=d0trftLF zgz9F*>IOOg;X&{hL+c81q z3QAr^-D{EE=6mCg-mQADzC3;KYXhpr2?Im5`u)C#u3Zb-BJFBSlYC%PdHlaEo=eE` zjpz6_`_Iz65cVqGqHwQL@_I4Jb)VC~mEAK7QOfoaLF&GNP{<~pt zM?@g3V}vzfi-*QQX%6s2iQ}YwoQ;#v^V*w%HG%5~y8Hg@H7_vwT0*$H5m6A3m^+Mb z3ul;0R*QDz6C@Obh;-640e}$JG3W~Ix>fkXD^B_CGvHG!H4-{eMunA#(w_myiHkVHDGZ*h{!VW=Wp#ZQX8Q&}iKU7AeOZ5bdYQ_vvZi}QMXfGuIg%y`X*h)M z0XX)ZO6Yr!C_%dIlj#p3i^vw1PB$HDe^eE@?$~q?ZMX?D^uJK$O6fgUszz zC)x|DzYc2&0qs1-@6tO7ga{#6ND?~6F23(@mBI4e{HC3YrizyreqDBaP=)tH1Q<+2 zgnK{#Sq4_culnw=Z=_Bds&u=Ac#zz3$7-?+I^S(oL=pB?{j#>wQh4_V z+K$!dEQ{VM8q>_VUnG(m^{z`0<-%>gsNsR>)2!4@m(~EF*NRWrn3dm1N?2ZFhQTBK zcY67w{>y_u_-AKz9N#5$-G5vfVtB-SC6HqLzXAt+@OUzK;GWEZTA6pBi;;!y0^YtG z>S^Lpz)db6Fn39iO?Qs$Lx40P3=JFfNVg>n@;s0b&5U0z#debH^yJ{OXU9I&nNwl5 z_LT4+Vz>a+gH!5KFp_$-4)5A*^Y|uW_LKm?3VL)64Cau!w68H)_1vWccXYOxZvA|C z1O{`P2@H$z2TwBr31W>qJg6|Geny!dFb)8L*Lu4YPs{I+({s-X)V+kL5SA9#*{DO2N+TI9~i9`sB)BFuX@{r%jw zx4C1L4)Z4}kNU+XT=FUyIk(q$NH63oKT(9~K6_mL@R?&}=)$gU?Tq=!k?S)<8(F5U zZP++lg}sG)o?N>4O4*d~}H|)6lgKRztOB z`ukOJlC3(r?fSuJ`qlO6zbak^16Kq>CdFt9{=pJ59{pxIpeL}DwYMg*93Us zw*}$b@}5aBodmg{*DMlC;5dsB>O*1Wc>j$(&-8g(E024zp4-rbG z&#c3P&*fk1&Rn>*hK0?dVyNh?m;(Qbtp7?(X{{+ErR6cJu$P0hX=K`3A9L6(BqSxH zeDl*AqgqxSj@Rw&29x6e<(-|IrDu}D%+ovEsLD$`#0}c=50?G(jtHcE(UPeD<7{*mqcAFvHuTr#fj%tS68P*Xx1grHgiCJ@Pe*XQ6 zCHEei=%KV3P7hfUAH5$_21GbM4+EvNoEY>Sdgj;@>k{Mj zw$655C=Tqg|XS#~c zHbGTyT3#$RU{k5*QR$JyK$w%u-1NkrUlh6nrR7q*A*{WwK(h*WuNP6Ygej~{$K)*F z@90HP1`5C3C(^Qhi{z=BXo-)=jk=AwT2yk{i9_%aoU$V>W}rxq@sQ({`qFF5mStw; zm5@|{wG1tNGW~pcWAcHJdsml;)rnqlQH)U40iik2Q+D1av;=I_%R)9?4pD19Ba5oE z_U`Twi1Lb3NE;y4YOyIE?TPm9)X1vjf%t9^O_;8_Ew~%$Z?K3oMMHC?M_=0H3SwT5<6<6564h_AQ z$GYYDD8~e&UIp7UtW4dxlRNxy!8AJJsOv zZ|>_m?UqbHaY_%jZEjNZ%W1jJ~w*tvWdTz-?N>|v_=flkGkC6|4WF7Zm#oo&b z2qB|QPGmF1UsF^2*9y~y^23w?A3=#lZQQffSpXgZSp0%%_8I+VMC2AeP>;LtYvr- zRWGt%J+q;`q@>k}fAz|ZZ2lrLK}|1W#W0szcVzqJ{pq|3bAc<}o-08rDWCf6Fh;B+ z1$iUF?lLdBeDpv6IC4!g`ZrA=T;rJ?}d=TeYyC$XtUVTDQ;}co)|oZ!kn>FS7+L#p3US`{<+*Wz zFnD5AVi%pdP(H?Ap1-A+uK&?kkxH9MR4p)t1$gDpk_Y{m*~=GKjfW!stjZLj8dt0j z@mH3nvxzK;xNBBIS(-;qtaf;Z@EhsD<#!)%uTspQl;R5%EkIp6BH-P6|w5EL6@m`+VcbULf={cW#)D2vI*7Lk9y!oOw z#B|$bF-EnRtB%Aj2-|2@yqnmUTxn3>c6-(N!wx44*Blv4HBx-M3D{Jt?^S(G`wSUM z+M}2elIp&hT_+Zm`{X-vs+Vr_Iq-D(9Tn80aj9{nX8()Q4n3Ird&5ITzKioap4fVD z3!fbEN&0pFA6&rpS-(_%i=0jC$H(sVX@!)h1Fw_=FcEPU?$*6 zt$gm1IJ`?9JrjJwfF#E#R~dSnFU8T3dCo!o(V3aEdls>#(VH=w?c)i>C*vNhd>6(S z=2fv)s!|Ih?!*625pQg)1x0)< zM6e*$lY$#>+drH|Hw%!0diylWMI1`uDZ*t3lbodM#7@A<{PpMW#iR)bs+Eep{`WOy zv2Wq$Mru(7pO(^AXdTO$Sd07K^k8adyVFj1bsf|?M;Pfsflj6jfFVKK5* zB`IeywD@WNMTsqIxWr#B;at5EIEIv*!fJko+HJvyysPA+s=qaF@KF0^ImroZ?0&0l zAP+-|t*fhx@GM`%d@KES?08?zLoa5XUBxW4Id_inI!((l!hPmw899wP1Eg>{t@5d!>hk_K)`{&iq;xAv>m`_*(AKCOWO%|4y2R3I{82v2~IEaBK@-QtzQn6SUPyl7|L# z##@C^8h}3615!O+jfL*6E?#CD1PA&C7fR|2rTkb~{;ibv*T*7_Vqop*X+QBzB6oC# z1qviqbosO2&lU*?77UCLv~?}J-xL_p-`}&ZRE#OGfh{FHKVM+;Hqqp}pmX|;Z@6Aq zuVdPIAi+3AI3+u~?!2+MVQ&acP$TT%7N-)MNDZhcu5Pk64f{{QedPYmH@DxapZ49r z>2F0bt_w16lJ(D8Usvt5GIs61Jk!9`Omla)@#OfarL~&XE+(%gl80w_Rs|c>KNOX# zVyh9h>say>a}X2g#kkMNO1aN0cfjLeIT%y-nd&@#ZG{?I+;=^X{jY z(w$1n08=U6!&1CS?iEKb$P2W$mn~gYRA70u^GBkspKO?oes_(RWMV*F{sZld#u|H^9o7YI>7xw*Cdq?ScLkyzoBqd?R82a$pjB;9uJwG)wos14-g7}sj$JD4k z?=1wKYnYag&wQ@!=W-{l*9yi|vVVJ7GXdb#@n8NAaeeeMH#*yObAf)ACdDb6sb?TT z{7a9N@0r|P1dIVKXP8SsZba`h%%jSWsfeR&?Ca$|=da{c471+z=ZnsY`^Ab22X055 z^uMZEX--brQP!9uH+Oe)4EvmPsxqrtNsPptI)Bo6=@m!Moh&&1^DX%bh}6h?Co;uw zkuanzwW{q{ZC;)FUAWaLN>pjd8Q2Br=5)M{U7Q)fDF#xmh!&+J)I}4#{Z0;c+Y?oW-x8u#^YyX3PdH={cU5jCcp!KSA z8&FOd(H-LQny>q(2p3T=L=)HM5@bl(z9_Msx0vNF#)yL?`TA}v?vh)A?w-+1X0aIREi;{xxQ$vuQx5Nq>?Wy%L5EsG}z@>#A{ zzwKSEB@78{4WIs8wL5i0yvT{!%%$IM&{D8dq!G~i#il6P`s7dKj7|S+c>2~Rjo*~z zjwNi)D{eBRlS%7Pz#?lwS=_N-fgLP%(q^4)0aq<$)=+4shA~COnOnC@Cy3oobdPh} zYNvEyH#J32?Uvw|GtVCn>l-3TO>N*qExog*YF>P6lSC*&m-=C3KAgTkFW}3|*0|QQVUHA%8X#Qf%#kszcf9CqOuBZ<=yj{w+BU<*) z=I3rrfk`j8bgwtbf#b@U=MLCIU7g3_C+s&hJ+t^(JMa5*X~J{4TC7})a@Zh?a`-}u z@F~84?NStP0btFM_ig!~?b0}?z$-Cpb^xN(iyOE2%zXITzboSC-JRW6Qzvzi z>-kPeQ6k;acw>f6$>#np=eK)y=1RU+vGQg`4FplPS!(%4mS+BurUN~4yAqnS+y(Tu z{8faxjw7t((~tgIeI~qb{e8WBdLJ|aq1Ubr+Qtpt@8I=$yIAh5y_$OU%C9?fzK?69 zl42M%**`Voj3q2b1(nD4ir(nS4RnX2N7)c}z!J=JE3hv*B0)qcjnQ;~{0c-nxmUc7 zGVHXpp72M)(F!~rCiY92g%G_3r`+ark&Z@%0AC~EtiS;PDi&p1{aB?HGVmyooR+>9 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 literal 0 HcmV?d00001 diff --git a/node_modules/i2c-bus/example/ds1621-pi.png b/node_modules/i2c-bus/example/ds1621-pi.png new file mode 100644 index 0000000000000000000000000000000000000000..46b6d4d2b59fe5064be5109a3f32bc89b7bb17f3 GIT binary patch literal 287814 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

j*;FZ{8s^{ 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�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

!KVOmb3$d2<8HBzVPAfH!wq=o8ULhgM4HT!@ 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�?>q0`_=TTZ#Qq-wk>se|6R!_ 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 z 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 tMCa!%b2JO_KsH{yw>)6?BD3c30 { + const halfDegrees = ((rawTemp & 0xff) << 1) + (rawTemp >> 15); + + if ((halfDegrees & 0x100) === 0) { + return halfDegrees / 2; // Temp +ve + } + + return -((~halfDegrees & 0xff) / 2); // Temp -ve +}; + +const displayTemperature = _ => { + const i2c1 = i2c.openSync(1); + + // Enter one shot mode (this is a non volatile setting) + i2c1.writeByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x01); + + // Wait while non volatile memory busy + while (i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG) & 0x10) { + } + + // Start temperature conversion + i2c1.sendByteSync(DS1621_ADDR, CMD_START_CONVERT); + + // Wait for temperature conversion to complete + while ((i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG) & 0x80) === 0) { + } + + // Display temperature + const rawTemp = i2c1.readWordSync(DS1621_ADDR, CMD_READ_TEMP); + console.log('temp: ' + toCelsius(rawTemp)); + + i2c1.closeSync(); +}; + +displayTemperature(); + diff --git a/node_modules/i2c-bus/example/i2c-list-busses.js b/node_modules/i2c-bus/example/i2c-list-busses.js new file mode 100644 index 0000000..9aeb872 --- /dev/null +++ b/node_modules/i2c-bus/example/i2c-list-busses.js @@ -0,0 +1,16 @@ +'use strict'; + +// Determine the bus numbers of the I2C busses available on the current +// machine and print those bus numbers to the screen. + +const glob = require('glob'); + +const busNumbers = glob.sync('/dev/i2c-*'). + filter(fileName => fileName.match(/\/i2c-\d+$/) !== null). + map(fileName => parseInt(fileName.match(/\d+$/)[0], 10)); + +console.log(busNumbers); + +// Here glob is used synchronously but it can also be used asynchronously. +// busNumbers is an array of numbers. + diff --git a/node_modules/i2c-bus/example/i2cdetect-quick.js b/node_modules/i2c-bus/example/i2cdetect-quick.js new file mode 100644 index 0000000..a14a5f3 --- /dev/null +++ b/node_modules/i2c-bus/example/i2cdetect-quick.js @@ -0,0 +1,48 @@ +'use strict'; + +// When run, this program will output the same information as the +// command 'i2cdetect -y -q 1' +// An error message will be printed on the BeagleBone as it doesn't +// support the SMBus quick command. +// This program is similar to i2cdetect.js, but it uses writeQuickSync +// rather than receiveByteSync to detect devices. +const fs = require('fs'); +const i2c = require('../'); +const i2c1 = i2c.openSync(1); + +const EBUSY = 16; /* Device or resource busy */ + +const scan = (first, last) => { + fs.writeSync(0, ' 0 1 2 3 4 5 6 7 8 9 a b c d e f'); + + for (let addr = 0; addr <= 127; addr += 1) { + if (addr % 16 === 0) { + fs.writeSync(0, '\n' + (addr === 0 ? '0' : '')); + fs.writeSync(0, addr.toString(16) + ':'); + } + + if (addr < first || addr > last) { + fs.writeSync(0, ' '); + } else { + try { + i2c1.writeQuickSync(addr, 0); + fs.writeSync(0, ' ' + addr.toString(16)); // device found, print addr + } catch (e) { + if (e.errno === EBUSY) { + fs.writeSync(0, ' UU'); + } else { + fs.writeSync(0, ' --'); + } + } + } + } + + fs.writeSync(0, '\n'); +}; + +if (!i2c1.i2cFuncsSync().smbusQuick) { + console.log('Error: Can\'t use SMBus Quick Write command on this bus#'); +} else { + scan(0x3, 0x77); +} + diff --git a/node_modules/i2c-bus/example/i2cdetect.js b/node_modules/i2c-bus/example/i2cdetect.js new file mode 100644 index 0000000..acd31c4 --- /dev/null +++ b/node_modules/i2c-bus/example/i2cdetect.js @@ -0,0 +1,40 @@ +'use strict'; + +// When run, this program will output the same information as the +// command 'i2cdetect -y -r 1' +const fs = require('fs'); +const i2c = require('../'); +const i2c1 = i2c.openSync(1); + +const EBUSY = 16; /* Device or resource busy */ + +const scan = (first, last) => { + fs.writeSync(0, ' 0 1 2 3 4 5 6 7 8 9 a b c d e f'); + + for (let addr = 0; addr <= 127; addr += 1) { + if (addr % 16 === 0) { + fs.writeSync(0, '\n' + (addr === 0 ? '0' : '')); + fs.writeSync(0, addr.toString(16) + ':'); + } + + if (addr < first || addr > last) { + fs.writeSync(0, ' '); + } else { + try { + i2c1.receiveByteSync(addr); + fs.writeSync(0, ' ' + addr.toString(16)); // device found, print addr + } catch (e) { + if (e.errno === EBUSY) { + fs.writeSync(0, ' UU'); + } else { + fs.writeSync(0, ' --'); + } + } + } + } + + fs.writeSync(0, '\n'); +}; + +scan(0x3, 0x77); + diff --git a/node_modules/i2c-bus/example/i2cfuncs.js b/node_modules/i2c-bus/example/i2cfuncs.js new file mode 100644 index 0000000..a52658c --- /dev/null +++ b/node_modules/i2c-bus/example/i2cfuncs.js @@ -0,0 +1,37 @@ +'use strict'; + +// When run, this program will output the same information as the +// command 'i2cdetect -F 1' +const i2c = require('../'); + +const i2c1 = i2c.open(1, err => { + if (err) { + throw err; + } + + i2c1.i2cFuncs((err, i2cFuncs) => { + const boolToYesNo = bool => bool ? 'yes' : 'no'; + + if (err) { + throw err; + } + + console.log('Functionalities implemented by /dev/i2c-1:'); + console.log('I2C ' + boolToYesNo(i2cFuncs.i2c)); + console.log('SMBus Quick Command ' + boolToYesNo(i2cFuncs.smbusQuick)); + console.log('SMBus Send Byte ' + boolToYesNo(i2cFuncs.smbusSendByte)); + console.log('SMBus Receive Byte ' + boolToYesNo(i2cFuncs.smbusReceiveByte)); + console.log('SMBus Write Byte ' + boolToYesNo(i2cFuncs.smbusWriteByte)); + console.log('SMBus Read Byte ' + boolToYesNo(i2cFuncs.smbusReadByte)); + console.log('SMBus Write Word ' + boolToYesNo(i2cFuncs.smbusWriteWord)); + console.log('SMBus Read Word ' + boolToYesNo(i2cFuncs.smbusReadWord)); + console.log('SMBus Process Call ' + boolToYesNo(i2cFuncs.smbusProcCall)); + console.log('SMBus Block Write ' + boolToYesNo(i2cFuncs.smbusWriteBlock)); + console.log('SMBus Block Read ' + boolToYesNo(i2cFuncs.smbusReadBlock)); + console.log('SMBus Block Process Call ' + boolToYesNo(i2cFuncs.smbusBlockProcCall)); + console.log('SMBus PEC ' + boolToYesNo(i2cFuncs.smbusPec)); + console.log('I2C Block Write ' + boolToYesNo(i2cFuncs.smbusWriteI2cBlock)); + console.log('I2C Block Read ' + boolToYesNo(i2cFuncs.smbusReadI2cBlock)); + }); +}); + diff --git a/node_modules/i2c-bus/example/mcp9808-async-callback.js b/node_modules/i2c-bus/example/mcp9808-async-callback.js new file mode 100644 index 0000000..01b1775 --- /dev/null +++ b/node_modules/i2c-bus/example/mcp9808-async-callback.js @@ -0,0 +1,36 @@ +'use strict'; + +const i2c = require('../'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + rawData = (rawData >> 8) + ((rawData & 0xff) << 8); + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +const i2c1 = i2c.open(1, err => { + if (err) { + throw err; + } + + i2c1.readWord(MCP9808_ADDR, TEMP_REG, (err, rawData) => { + if (err) { + throw err; + } + + console.log(toCelsius(rawData)); + + i2c1.close(err => { + if (err) { + throw err; + } + }); + }); +}); + diff --git a/node_modules/i2c-bus/example/mcp9808-pi.png b/node_modules/i2c-bus/example/mcp9808-pi.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c10831c6084cd06327e37ea0fa42afc478dac8 GIT binary patch literal 111555 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 literal 0 HcmV?d00001 diff --git a/node_modules/i2c-bus/example/mcp9808-promise-plain-i2c-buffer.js b/node_modules/i2c-bus/example/mcp9808-promise-plain-i2c-buffer.js new file mode 100644 index 0000000..c0ed5f7 --- /dev/null +++ b/node_modules/i2c-bus/example/mcp9808-promise-plain-i2c-buffer.js @@ -0,0 +1,25 @@ +'use strict'; + +const i2c = require('../'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +const wbuf = Buffer.from([TEMP_REG]); +const rbuf = Buffer.alloc(2); + +i2c.openPromisified(1). +then(i2c1 => i2c1.i2cWrite(MCP9808_ADDR, wbuf.length, wbuf). + then(_ => i2c1.i2cRead(MCP9808_ADDR, rbuf.length, rbuf)). + then(data => console.log(toCelsius(data.buffer.readUInt16BE()))). + then(_ => i2c1.close()) +).catch(console.log); + diff --git a/node_modules/i2c-bus/example/mcp9808-promise.js b/node_modules/i2c-bus/example/mcp9808-promise.js new file mode 100644 index 0000000..78507ad --- /dev/null +++ b/node_modules/i2c-bus/example/mcp9808-promise.js @@ -0,0 +1,22 @@ +'use strict'; + +const i2c = require('../'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + rawData = (rawData >> 8) + ((rawData & 0xff) << 8); + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +i2c.openPromisified(1). +then(i2c1 => i2c1.readWord(MCP9808_ADDR, TEMP_REG). + then(rawData => console.log(toCelsius(rawData))). + then(_ => i2c1.close()) +).catch(console.log); + diff --git a/node_modules/i2c-bus/example/mcp9808-sync.js b/node_modules/i2c-bus/example/mcp9808-sync.js new file mode 100644 index 0000000..d8dbbed --- /dev/null +++ b/node_modules/i2c-bus/example/mcp9808-sync.js @@ -0,0 +1,21 @@ +'use strict'; + +const i2c = require('../'); + +const MCP9808_ADDR = 0x18; +const TEMP_REG = 0x05; + +const toCelsius = rawData => { + rawData = (rawData >> 8) + ((rawData & 0xff) << 8); + let celsius = (rawData & 0x0fff) / 16; + if (rawData & 0x1000) { + celsius -= 256; + } + return celsius; +}; + +const i2c1 = i2c.openSync(1); +const rawData = i2c1.readWordSync(MCP9808_ADDR, TEMP_REG); +console.log(toCelsius(rawData)); +i2c1.closeSync(); + diff --git a/node_modules/i2c-bus/example/two-devices.js b/node_modules/i2c-bus/example/two-devices.js new file mode 100644 index 0000000..b85297f --- /dev/null +++ b/node_modules/i2c-bus/example/two-devices.js @@ -0,0 +1,40 @@ +'use strict'; + +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const DS1621_CMD_ACCESS_TH = 0xa1; + +const TSL2561_ADDR = 0x39; +const TSL2561_CMD = 0x80; +const TSL2561_REG_ID = 0x0a; + +const i2c1 = i2c.open(1, err => { + if (err) { + throw err; + } + + const readDs1621TempHigh = _ => { + i2c1.readWord(DS1621_ADDR, DS1621_CMD_ACCESS_TH, (err, tempHigh) => { + if (err) { + throw err; + } + console.log(tempHigh); + readDs1621TempHigh(); + }); + }; + + const readTsl2561Id = _ => { + i2c1.readByte(TSL2561_ADDR, TSL2561_CMD | TSL2561_REG_ID, (err, id) => { + if (err) { + throw err; + } + console.log(id); + readTsl2561Id(); + }); + }; + + readDs1621TempHigh(); + readTsl2561Id(); +}); + diff --git a/node_modules/i2c-bus/i2c-bus.js b/node_modules/i2c-bus/i2c-bus.js new file mode 100644 index 0000000..f6ac371 --- /dev/null +++ b/node_modules/i2c-bus/i2c-bus.js @@ -0,0 +1,821 @@ +'use strict'; + +const fs = require('fs'); +const i2c = require('bindings')('i2c.node'); + +const BUS_FILE_PREFIX = '/dev/i2c-'; +const FIRST_SCAN_ADDR = 0x03; +const LAST_SCAN_ADDR = 0x77; + +// Table 4. +// https://www.nxp.com/docs/en/user-guide/UM10204.pdf +const knownManufacturers = [ + { value: 0x000, name: 'NXP Semiconductors' }, + { value: 0x001, name: 'NXP Semiconductors (reserved)' }, + { value: 0x002, name: 'NXP Semiconductors (reserved)' }, + { value: 0x003, name: 'NXP Semiconductors (reserved)' }, + { value: 0x004, name: 'Ramtron International' }, + { value: 0x005, name: 'Analog Devices' }, + { value: 0x006, name: 'STMicroelectronics' }, + { value: 0x007, name: 'ON Semiconductor' }, + { value: 0x008, name: 'Sprintek Corporation' }, + { value: 0x009, name: 'ESPROS Photonics AG' }, + { value: 0x00a, name: 'Fujitsu Semiconductor' }, + { value: 0x00b, name: 'Flir' }, + { value: 0x00c, name: 'O\u2082Micro' }, + { value: 0x00d, name: 'Atmel' } +]; + +const open = (busNumber, options, cb) => { + if (typeof options === 'function') { + cb = options; + options = undefined; + } + + checkBusNumber(busNumber); + checkCallback(cb); + + const bus = new Bus(busNumber, options); + + setImmediate(cb, null); + + return bus; +}; + +const openSync = (busNumber, options) => { + checkBusNumber(busNumber); + + return new Bus(busNumber, options); +}; + +const openPromisified = (busNumber, options) => new Promise( + (resolve, reject) => { + const bus = open(busNumber, options, + err => err ? reject(err) : resolve(bus.promisifiedBus()) + ); + } +); + +const checkBusNumber = busNumber => { + if (!Number.isInteger(busNumber) || busNumber < 0) { + throw new Error('Invalid I2C bus number ' + busNumber); + } +}; + +const checkAddress = addr => { + if (!Number.isInteger(addr) || addr < 0 || addr > 0x7f) { + throw new Error('Invalid I2C address ' + addr); + } +}; + +const checkCommand = cmd => { + if (!Number.isInteger(cmd) || cmd < 0 || cmd > 0xff) { + throw new Error('Invalid I2C command ' + cmd); + } +}; + +const checkCallback = cb => { + if (typeof cb !== 'function') { + throw new Error('Invalid callback ' + cb); + } +}; + +const checkBuffer = buffer => { + if (!Buffer.isBuffer(buffer)) { + throw new Error('Invalid buffer ' + buffer); + } +}; + +const checkBufferAndLength = (length, buffer, maxLength) => { + if (!Number.isInteger(length) || + length < 0 || + (maxLength !== undefined && length > maxLength)) { + throw new Error('Invalid buffer length ' + length); + } + + checkBuffer(buffer); + + if (buffer.length < length) { + throw new Error('Buffer must contain at least ' + length + ' bytes'); + } +}; + +const checkByte = byte => { + if (!Number.isInteger(byte) || byte < 0 || byte > 0xff) { + throw new Error('Invalid byte ' + byte); + } +}; + +const checkWord = word => { + if (!Number.isInteger(word) || word < 0 || word > 0xffff) { + throw new Error('Invalid word ' + word); + } +}; + +const checkBit = bit => { + if (!Number.isInteger(bit) || bit < 0 || bit > 1) { + throw new Error('Invalid bit ' + bit); + } +}; + +const parseId = id => { + // Figure 20. UM10204 + const manufacturer = id >> 12 & 0x0fff; // high 12bit + const product = id & 0x0fff; // low 12bit + + const known = knownManufacturers.find(man => man.value === manufacturer); + const name = known !== undefined ? known.name : ('<0x' + manufacturer.toString(16) + '>'); + + return { + manufacturer: manufacturer, + product: product, + name: name + }; +}; + +const peripheral = (bus, addr, cb) => { + const device = bus._peripherals[addr]; + + if (device === undefined) { + fs.open(BUS_FILE_PREFIX + bus._busNumber, 'r+', (err, device) => { + if (err) { + return cb(err); + } + + bus._peripherals[addr] = device; + + i2c.setAddrAsync(device, addr, bus._forceAccess, err => { + if (err) { + return cb(err); + } + + cb(null, device); + }); + }); + } else { + setImmediate(cb, null, device); + } +}; + +const peripheralSync = (bus, addr) => { + let peripheral = bus._peripherals[addr]; + + if (peripheral === undefined) { + peripheral = fs.openSync(BUS_FILE_PREFIX + bus._busNumber, 'r+'); + bus._peripherals[addr] = peripheral; + i2c.setAddrSync(peripheral, addr, bus._forceAccess); + } + + return peripheral; +}; + +class I2cFuncs { + constructor(i2cFuncBits) { + this.i2c = !!(i2cFuncBits & i2c.I2C_FUNC_I2C); + this.tenBitAddr = !!(i2cFuncBits & i2c.I2C_FUNC_10BIT_ADDR); + this.protocolMangling = !!(i2cFuncBits & i2c.I2C_FUNC_PROTOCOL_MANGLING); + this.smbusPec = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_PEC); + this.smbusBlockProcCall = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_BLOCK_PROC_CALL); + this.smbusQuick = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_QUICK); + this.smbusReceiveByte = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_READ_BYTE); + this.smbusSendByte = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_WRITE_BYTE); + this.smbusReadByte = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_READ_BYTE_DATA); + this.smbusWriteByte = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_WRITE_BYTE_DATA); + this.smbusReadWord = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_READ_WORD_DATA); + this.smbusWriteWord = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_WRITE_WORD_DATA); + this.smbusProcCall = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_PROC_CALL); + this.smbusReadBlock = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_READ_BLOCK_DATA); + this.smbusWriteBlock = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_WRITE_BLOCK_DATA); + this.smbusReadI2cBlock = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_READ_I2C_BLOCK); + this.smbusWriteI2cBlock = !!(i2cFuncBits & i2c.I2C_FUNC_SMBUS_WRITE_I2C_BLOCK); + } +} + +class Bus { + constructor(busNumber, options) { + options = options || {}; + + this._busNumber = busNumber; + this._forceAccess = !!options.forceAccess || false; + this._peripherals = []; + this._promisifiedBus = new PromisifiedBus(this); + } + + promisifiedBus() { + return this._promisifiedBus; + } + + close(cb) { + checkCallback(cb); + + const peripherals = this._peripherals.filter(peripheral => { + return peripheral !== undefined; + }); + + const closePeripheral = _ => { + if (peripherals.length === 0) { + return setImmediate(cb, null); + } + + fs.close(peripherals.pop(), err => { + if (err) { + return cb(err); + } + closePeripheral(); + }); + }; + + closePeripheral(); + } + + closeSync() { + this._peripherals.forEach(peripheral => { + if (peripheral !== undefined) { + fs.closeSync(peripheral); + } + }); + + this._peripherals = []; + } + + i2cFuncs(cb) { + checkCallback(cb); + + if (!this.funcs) { + peripheral(this, 0, (err, device) => { + if (err) { + return cb(err); + } + + i2c.i2cFuncsAsync(device, (err, i2cFuncBits) => { + if (err) { + return cb(err); + } + this.funcs = Object.freeze(new I2cFuncs(i2cFuncBits)); + cb(null, this.funcs); + }); + }); + } else { + setImmediate(cb, null, this.funcs); + } + } + + i2cFuncsSync() { + if (!this.funcs) { + this.funcs = Object.freeze(new I2cFuncs(i2c.i2cFuncsSync(peripheralSync(this, 0)))); + } + + return this.funcs; + } + + readByte(addr, cmd, cb) { + checkAddress(addr); + checkCommand(cmd); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.readByteAsync(device, cmd, cb); + }); + } + + readByteSync(addr, cmd) { + checkAddress(addr); + checkCommand(cmd); + + return i2c.readByteSync(peripheralSync(this, addr), cmd); + } + + readWord(addr, cmd, cb) { + checkAddress(addr); + checkCommand(cmd); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.readWordAsync(device, cmd, cb); + }); + } + + readWordSync(addr, cmd) { + checkAddress(addr); + checkCommand(cmd); + + return i2c.readWordSync(peripheralSync(this, addr), cmd); + } + + // UNTESTED and undocumented due to lack of supporting hardware + readBlock(addr, cmd, buffer, cb) { + checkAddress(addr); + checkCommand(cmd); + checkBuffer(buffer); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.readBlockAsync(device, cmd, buffer, cb); + }); + } + + // UNTESTED and undocumented due to lack of supporting hardware + readBlockSync(addr, cmd, buffer) { + checkAddress(addr); + checkCommand(cmd); + checkBuffer(buffer); + + return i2c.readBlockSync(peripheralSync(this, addr), cmd, buffer); + } + + readI2cBlock(addr, cmd, length, buffer, cb) { + checkAddress(addr); + checkCommand(cmd); + checkBufferAndLength(length, buffer, 32); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.readI2cBlockAsync(device, cmd, length, buffer, cb); + }); + } + + readI2cBlockSync(addr, cmd, length, buffer) { + checkAddress(addr); + checkCommand(cmd); + checkBufferAndLength(length, buffer, 32); + + return i2c.readI2cBlockSync(peripheralSync(this, addr), cmd, length, buffer); + } + + receiveByte(addr, cb) { + checkAddress(addr); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.receiveByteAsync(device, cb); + }); + } + + receiveByteSync(addr) { + checkAddress(addr); + + return i2c.receiveByteSync(peripheralSync(this, addr)); + } + + sendByte(addr, byte, cb) { + checkAddress(addr); + checkByte(byte); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.sendByteAsync(device, byte, cb); + }); + } + + sendByteSync(addr, byte) { + checkAddress(addr); + checkByte(byte); + + i2c.sendByteSync(peripheralSync(this, addr), byte); + + return this; + } + + writeByte(addr, cmd, byte, cb) { + checkAddress(addr); + checkCommand(cmd); + checkByte(byte); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.writeByteAsync(device, cmd, byte, cb); + }); + } + + writeByteSync(addr, cmd, byte) { + checkAddress(addr); + checkCommand(cmd); + checkByte(byte); + + i2c.writeByteSync(peripheralSync(this, addr), cmd, byte); + + return this; + } + + writeWord(addr, cmd, word, cb) { + checkAddress(addr); + checkCommand(cmd); + checkWord(word); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.writeWordAsync(device, cmd, word, cb); + }); + } + + writeWordSync(addr, cmd, word) { + checkAddress(addr); + checkCommand(cmd); + checkWord(word); + + i2c.writeWordSync(peripheralSync(this, addr), cmd, word); + + return this; + } + + writeQuick(addr, bit, cb) { + checkAddress(addr); + checkBit(bit); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.writeQuickAsync(device, bit, cb); + }); + } + + writeQuickSync(addr, bit) { + checkAddress(addr); + checkBit(bit); + + i2c.writeQuickSync(peripheralSync(this, addr), bit); + + return this; + } + + // UNTESTED and undocumented due to lack of supporting hardware + writeBlock(addr, cmd, length, buffer, cb) { + checkAddress(addr); + checkCommand(cmd); + checkBufferAndLength(length, buffer); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.writeBlockAsync(device, cmd, length, buffer, cb); + }); + } + + // UNTESTED and undocumented due to lack of supporting hardware + writeBlockSync(addr, cmd, length, buffer) { + checkAddress(addr); + checkCommand(cmd); + checkBufferAndLength(length, buffer); + + i2c.writeBlockSync(peripheralSync(this, addr), cmd, length, buffer); + + return this; + } + + writeI2cBlock(addr, cmd, length, buffer, cb) { + checkAddress(addr); + checkCommand(cmd); + checkBufferAndLength(length, buffer, 32); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.writeI2cBlockAsync(device, cmd, length, buffer, cb); + }); + } + + writeI2cBlockSync(addr, cmd, length, buffer) { + checkAddress(addr); + checkCommand(cmd); + checkBufferAndLength(length, buffer, 32); + + i2c.writeI2cBlockSync(peripheralSync(this, addr), cmd, length, buffer); + + return this; + } + + i2cRead(addr, length, buffer, cb) { + checkAddress(addr); + checkBufferAndLength(length, buffer); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + fs.read(device, buffer, 0, length, 0, cb); + }); + } + + i2cReadSync(addr, length, buffer) { + checkAddress(addr); + checkBufferAndLength(length, buffer); + + return fs.readSync(peripheralSync(this, addr), buffer, 0, length, 0); + } + + i2cWrite(addr, length, buffer, cb) { + checkAddress(addr); + checkBufferAndLength(length, buffer); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + fs.write(device, buffer, 0, length, 0, cb); + }); + } + + i2cWriteSync(addr, length, buffer) { + checkAddress(addr); + checkBufferAndLength(length, buffer); + + return fs.writeSync(peripheralSync(this, addr), buffer, 0, length, 0); + } + + scan(startAddr, endAddr, cb) { + if (typeof startAddr === 'function') { + cb = startAddr; + startAddr = FIRST_SCAN_ADDR; + endAddr = LAST_SCAN_ADDR; + } else if (typeof endAddr === 'function') { + cb = endAddr; + endAddr = startAddr; + } + + checkCallback(cb); + checkAddress(startAddr); + checkAddress(endAddr); + + const scanBus = open(this._busNumber, {forceAccess: this._forceAccess}, err => { + const addresses = []; + if (err) { + return cb(err); + } + + const next = addr => { + if (addr > endAddr) { + return scanBus.close(err => { + if (err) { + return cb(err); + } + cb(null, addresses); + }); + } + + scanBus.receiveByte(addr, err => { + if (!err) { + addresses.push(addr); + } + + next(addr + 1); + }); + }; + + next(startAddr); + }); + } + + scanSync(startAddr, endAddr) { + if (typeof startAddr === 'undefined') { + startAddr = FIRST_SCAN_ADDR; + endAddr = LAST_SCAN_ADDR; + } else if (typeof endAddr === 'undefined') { + endAddr = startAddr; + } + + checkAddress(startAddr); + checkAddress(endAddr); + + const scanBus = openSync(this._busNumber, {forceAccess: this._forceAccess}); + const addresses = []; + + for (let addr = startAddr; addr <= endAddr; addr += 1) { + try { + scanBus.receiveByteSync(addr); + addresses.push(addr); + } catch (ignore) { + } + } + + scanBus.closeSync(); + + return addresses; + } + + deviceId(addr, cb) { + checkAddress(addr); + checkCallback(cb); + + peripheral(this, addr, (err, device) => { + if (err) { + return cb(err); + } + + i2c.deviceIdAsync(device, addr, (err, id) => { + if (err) { + return cb(err); + } + + cb(null, parseId(id)); + }); + }); + } + + deviceIdSync(addr) { + checkAddress(addr); + + const mp = i2c.deviceIdSync(peripheralSync(this, addr), addr); + + return parseId(mp); + } +} + +class PromisifiedBus { + constructor(bus) { + this._bus = bus; + } + + bus() { + return this._bus; + } + + close() { + return new Promise((resolve, reject) => + this._bus.close(err => err ? reject(err) : resolve()) + ); + } + + i2cFuncs() { + return new Promise((resolve, reject) => + this._bus.i2cFuncs((err, funcs) => err ? reject(err) : resolve(funcs)) + ); + } + + readByte(addr, cmd) { + return new Promise((resolve, reject) => + this._bus.readByte(addr, cmd, + (err, byte) => err ? reject(err) : resolve(byte) + ) + ); + } + + readWord(addr, cmd) { + return new Promise((resolve, reject) => + this._bus.readWord(addr, cmd, + (err, word) => err ? reject(err) : resolve(word) + ) + ); + } + + // UNTESTED and undocumented due to lack of supporting hardware + readBlock(addr, cmd, buffer) { + return new Promise((resolve, reject) => + this._bus.readBlock(addr, cmd, buffer, + (err, bytesRead, buffer) => + err ? reject(err) : resolve({bytesRead: bytesRead, buffer: buffer}) + ) + ); + } + + readI2cBlock(addr, cmd, length, buffer) { + return new Promise((resolve, reject) => + this._bus.readI2cBlock(addr, cmd, length, buffer, + (err, bytesRead, buffer) => + err ? reject(err) : resolve({bytesRead: bytesRead, buffer: buffer}) + ) + ); + } + + receiveByte(addr) { + return new Promise((resolve, reject) => + this._bus.receiveByte(addr, + (err, byte) => err ? reject(err) : resolve(byte) + ) + ); + } + + sendByte(addr, byte) { + return new Promise((resolve, reject) => + this._bus.sendByte(addr, byte, + err => err ? reject(err) : resolve() + ) + ); + } + + writeByte(addr, cmd, byte) { + return new Promise((resolve, reject) => + this._bus.writeByte(addr, cmd, byte, + err => err ? reject(err) : resolve() + ) + ); + } + + writeWord(addr, cmd, word) { + return new Promise((resolve, reject) => + this._bus.writeWord(addr, cmd, word, + err => err ? reject(err) : resolve() + ) + ); + } + + writeQuick(addr, bit) { + return new Promise((resolve, reject) => + this._bus.writeQuick(addr, bit, + err => err ? reject(err) : resolve() + ) + ); + } + + // UNTESTED and undocumented due to lack of supporting hardware + writeBlock(addr, cmd, length, buffer) { + return new Promise((resolve, reject) => + this._bus.writeBlock(addr, cmd, length, buffer, + (err, bytesWritten, buffer) => + err ? reject(err) : resolve({bytesWritten: bytesWritten, buffer: buffer}) + ) + ); + } + + writeI2cBlock(addr, cmd, length, buffer) { + return new Promise((resolve, reject) => + this._bus.writeI2cBlock(addr, cmd, length, buffer, + (err, bytesWritten, buffer) => + err ? reject(err) : resolve({bytesWritten: bytesWritten, buffer: buffer}) + ) + ); + } + + i2cRead(addr, length, buffer) { + return new Promise((resolve, reject) => + this._bus.i2cRead(addr, length, buffer, + (err, bytesRead, buffer) => + err ? reject(err) : resolve({bytesRead: bytesRead, buffer: buffer}) + ) + ); + } + + i2cWrite(addr, length, buffer) { + return new Promise((resolve, reject) => + this._bus.i2cWrite(addr, length, buffer, + (err, bytesWritten, buffer) => + err ? reject(err) : resolve({bytesWritten: bytesWritten, buffer: buffer}) + ) + ); + } + + scan(...args) { + return new Promise((resolve, reject) => + this._bus.scan(...args, + (err, devices) => err ? reject(err) : resolve(devices) + ) + ); + } + + deviceId(addr) { + return new Promise((resolve, reject) => + this._bus.deviceId(addr, (err, id) => err ? reject(err) : resolve(id)) + ); + } +} + +module.exports = { + open: open, + openSync: openSync, + openPromisified: openPromisified +}; + diff --git a/node_modules/i2c-bus/integration-test/async-brute-force-leak-check.js b/node_modules/i2c-bus/integration-test/async-brute-force-leak-check.js new file mode 100644 index 0000000..bc9d113 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/async-brute-force-leak-check.js @@ -0,0 +1,33 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_TL = 0xa2; + +const leakTest = testRuns => { + const tlbuf = Buffer.alloc(1000000); + + i2c1.readI2cBlock(DS1621_ADDR, CMD_ACCESS_TL, 2, tlbuf, (err, bytesRead, buffer) => { + assert(!err, 'can\'t read block data from tl'); + assert.strictEqual(bytesRead, 2, 'expected readI2cBlock to read 2 bytes'); + + if (testRuns % 1000 === 0) { + console.log(testRuns); + } + + testRuns -= 1; + if (testRuns === 0) { + i2c1.closeSync(); + } else { + leakTest(testRuns); + } + }); +}; + +const i2c1 = i2c.open(1, err => { + assert(!err, 'can\'t open i2c bus'); + leakTest(1000000); +}); + diff --git a/node_modules/i2c-bus/integration-test/async-performance.js b/node_modules/i2c-bus/integration-test/async-performance.js new file mode 100644 index 0000000..42074c1 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/async-performance.js @@ -0,0 +1,30 @@ +'use strict'; + +const i2c = require('../'); + +const ITERATIONS = 5000; + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_TL = 0xa2; + +let time; + +const performanceTest = testRuns => { + i2c1.readWord(DS1621_ADDR, CMD_ACCESS_TL, _ => { + testRuns -= 1; + if (testRuns === 0) { + time = process.hrtime(time); + const readsPerSec = Math.floor(ITERATIONS / (time[0] + time[1] / 1E9)); + i2c1.closeSync(); + console.log('ok - async-performance - ' + readsPerSec + ' reads per second'); + } else { + performanceTest(testRuns); + } + }); +}; + +const i2c1 = i2c.open(1, _ => { + time = process.hrtime(); + performanceTest(ITERATIONS); +}); + diff --git a/node_modules/i2c-bus/integration-test/async-promise-performance.js b/node_modules/i2c-bus/integration-test/async-promise-performance.js new file mode 100644 index 0000000..3164d99 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/async-promise-performance.js @@ -0,0 +1,31 @@ +'use strict'; + +const i2c = require('../'); + +const ITERATIONS = 5000; + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_TL = 0xa2; + +let time; + +const performanceTest = (i2c1, testRuns) => { + i2c1.readWord(DS1621_ADDR, CMD_ACCESS_TL).then(word => { + testRuns -= 1; + if (testRuns === 0) { + time = process.hrtime(time); + const readsPerSec = Math.floor(ITERATIONS / (time[0] + time[1] / 1E9)); + i2c1.close().then(_ => + console.log('ok - async-promise-performance - ' + readsPerSec + ' reads per second') + ); + } else { + performanceTest(i2c1, testRuns); + } + }); +}; + +i2c.openPromisified(1).then(i2c1 => { + time = process.hrtime(); + performanceTest(i2c1, ITERATIONS); +}); + diff --git a/node_modules/i2c-bus/integration-test/async-promise.js b/node_modules/i2c-bus/integration-test/async-promise.js new file mode 100644 index 0000000..c6522b4 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/async-promise.js @@ -0,0 +1,138 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_CONFIG = 0xac; +const CMD_ACCESS_TL = 0xa2; + +// Wait while non volatile memory busy +const waitForWrite = i2c1 => { + return new Promise((resolve, reject) => { + const checkWriteFlag = _ => { + i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG). + then(config => { + if (config & 0x10) { + checkWriteFlag(); + } else { + resolve(); + } + }). + catch(reject); + }; + + checkWriteFlag(); + }); +}; + +const finished = i2c1 => + i2c1.close(). + then(_ => console.log('ok - async-promise')); + +const i2cFuncs = i2c1 => + i2c1.i2cFuncs(). + then(i2cFuncs => assert(i2cFuncs.smbusReadByte, 'expected it to be possible to read a byte')); + +const scan = i2c1 => + i2c1.scan(). + then(devices => assert( + devices.includes(DS1621_ADDR), + 'expected scan to find a ds1621 at address 0x' + DS1621_ADDR.toString(16) + )); + +// Test i2cWrite & i2cRead +// Change value of tl to 25 and verify that tl has been changed +const i2cPlainReadWrite = i2c1 => { + const cmdSetTL = Buffer.from([CMD_ACCESS_TL, 25, 0]); + const cmdGetTL = Buffer.from([CMD_ACCESS_TL]); + const tl = Buffer.alloc(2); + + return i2c1.i2cWrite(DS1621_ADDR, cmdSetTL.length, cmdSetTL). + then(block => { + assert.strictEqual(block.bytesWritten, cmdSetTL.length, 'expected i2cWrite to write 3 bytes'); + assert.strictEqual(cmdSetTL, block.buffer, 'expected cmdSetTL to be block.buffer'); + }). + then(_ => waitForWrite(i2c1)). + then(_ => i2c1.i2cWrite(DS1621_ADDR, cmdGetTL.length, cmdGetTL)). + then(block => { + assert.strictEqual(block.bytesWritten, cmdGetTL.length, 'expected i2cWrite to write 1 byte'); + assert.strictEqual(cmdGetTL, block.buffer, 'expected cmdGetTL to be block.buffer'); + }). + then(_ => i2c1.i2cRead(DS1621_ADDR, 2, tl)). + then(block => { + assert.strictEqual(block.bytesRead, 2, 'expected i2cRead to read 2 bytes'); + assert.strictEqual(tl.readUInt16LE(0), 25, 'expected i2cRead to read value 25'); + assert.strictEqual(tl, block.buffer, 'expected tl to be block.buffer'); + }); +}; + +// Test writeI2cBlock & readI2cBlock +// Change value of tl to 22 and verify that tl has been changed +const readWriteI2cBlock = i2c1 => { + const newtl = Buffer.alloc(10); + newtl.writeUInt16LE(22, 0); + + return i2c1.writeI2cBlock(DS1621_ADDR, CMD_ACCESS_TL, 2, newtl). + then(block => { + assert.strictEqual(block.bytesWritten, 2, 'expected writeI2cBlock to write 2 bytes'); + assert.strictEqual(newtl, block.buffer, 'expected newtl to be block.buffer'); + }). + then(_ => waitForWrite(i2c1)). + then(_ => i2c1.readI2cBlock(DS1621_ADDR, CMD_ACCESS_TL, 2, newtl)). + then(block => { + assert.strictEqual(block.bytesRead, 2, 'expected readI2cBlock to read 2 bytes'); + assert.strictEqual(block.buffer.readUInt16LE(0), 22, 'expected readI2cBlock to read value 22'); + assert.strictEqual(newtl, block.buffer, 'expected newtl to be block.buffer'); + }); +}; + +// Test writeWord & readWord +// Change value of tl and verify that tl has been changed +const readWriteWord = i2c1 => + i2c1.readWord(DS1621_ADDR, CMD_ACCESS_TL). + then(oldtl => { + assert(typeof oldtl === 'number' && oldtl <= 0xffff, 'expeted readWord to read a word'); + const newtl = (oldtl === 24 ? 23 : 24); + return i2c1.writeWord(DS1621_ADDR, CMD_ACCESS_TL, newtl). + then(_ => i2c1.readWord(DS1621_ADDR, CMD_ACCESS_TL)). + then(newtl2 => { + assert(typeof newtl2 === 'number' && newtl2 <= 0xffff, 'expeted readWord to read a word'); + assert.strictEqual(newtl, newtl2, 'expected to read word written'); + }); + }); + +// Test sendByte & receiveByte +// Read config and verify that it's epectedConfig +const sendReceiveByte = (i2c1, epectedConfig) => + i2c1.sendByte(DS1621_ADDR, CMD_ACCESS_CONFIG). + then(_ => i2c1.receiveByte(DS1621_ADDR)). + then(config => { + assert(typeof config === 'number' && config <= 0xff, 'expeted receiveByte to receive a byte'); + assert.strictEqual(config, epectedConfig, '1st and 2nd config read differ'); + }); + +// Test writeByte & readByte +// Enter continuous mode and verify that continuous mode has been entered +const readWriteByte = i2c1 => + i2c1.writeByte(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x0). + then(_ => waitForWrite(i2c1)). + then(_ => i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG)). + then(config => { + assert(typeof config === 'number' && config <= 0xff, 'expeted readByte to read a byte'); + assert.strictEqual(config & 0x1, 0, 'continuous mode not eneterd'); + return config; + }); + +i2c.openPromisified(1). +then(i2c1 => readWriteByte(i2c1). + then(config => sendReceiveByte(i2c1, config)). + then(_ => readWriteWord(i2c1)). + then(_ => readWriteI2cBlock(i2c1)). + then(_ => i2cPlainReadWrite(i2c1)). + then(_ => scan(i2c1)). + then(_ => i2cFuncs(i2c1)). + then(_ => finished(i2c1)) +). +catch(console.log); + diff --git a/node_modules/i2c-bus/integration-test/async.js b/node_modules/i2c-bus/integration-test/async.js new file mode 100644 index 0000000..ec4de32 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/async.js @@ -0,0 +1,138 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_CONFIG = 0xac; +const CMD_ACCESS_TL = 0xa2; + +// Wait while non volatile memory busy +const waitForWrite = cb => { + i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG, (err, config) => { + assert(!err, 'can\'t read config to determine memory status'); + if (config & 0x10) { + return waitForWrite(cb); + } + cb(); + }); +}; + +const finished = _ => i2c1.close(_ => console.log('ok - async')); + +const i2cPlainReadWrite = _ => { + // Test i2cWrite & i2cRead + // Change value of tl to 25 and verify that tl has been changed + const cmdSetTL = Buffer.from([CMD_ACCESS_TL, 25, 0]); + const cmdGetTL = Buffer.from([CMD_ACCESS_TL]); + const tl = Buffer.alloc(2); + + i2c1.i2cWrite(DS1621_ADDR, cmdSetTL.length, cmdSetTL, (err, bytesWritten, buffer) => { + assert(!err, 'can\'t i2cWrite cmdSetTL'); + assert.strictEqual(bytesWritten, cmdSetTL.length, 'expected i2cWrite to write 3 bytes'); + assert.strictEqual(cmdSetTL, buffer, 'expected cmdSetTL to be passed to i2cWrite callback'); + + waitForWrite(_ => { + i2c1.i2cWrite(DS1621_ADDR, cmdGetTL.length, cmdGetTL, (err, bytesWritten, buffer) => { + assert(!err, 'can\'t i2cWrite cmdGetTL'); + assert.strictEqual(bytesWritten, cmdGetTL.length, 'expected i2cWrite to write 1 byte'); + assert.strictEqual(cmdGetTL, buffer, 'expected cmdGetTL to be passed to i2cWrite callback'); + + i2c1.i2cRead(DS1621_ADDR, 2, tl, (err, bytesRead, buffer) => { + assert(!err, 'can\'t i2cRead tl'); + assert.strictEqual(bytesRead, 2, 'expected i2cRead to read 2 bytes'); + assert.strictEqual(tl.readUInt16LE(0), 25, 'expected i2cRead to read value 25'); + assert.strictEqual(tl, buffer, 'expected tl to be passed to i2cRead callback'); + + finished(); + }); + }); + }); + }); +}; + +const readWriteI2cBlock = _ => { + // Test writeI2cBlock & readI2cBlock + // Change value of tl to 22 and verify that tl has been changed + const newtl = Buffer.alloc(10); + + newtl.writeUInt16LE(22, 0); + i2c1.writeI2cBlock(DS1621_ADDR, CMD_ACCESS_TL, 2, newtl, (err, bytesWritten, buffer) => { + assert(!err, 'can\'t writeI2cBlock to tl'); + assert.strictEqual(bytesWritten, 2, 'expected writeI2cBlock to write 2 bytes'); + assert.strictEqual(newtl, buffer, 'expected newtl to be passed to writeI2cBlock callback'); + + waitForWrite(_ => { + i2c1.readI2cBlock(DS1621_ADDR, CMD_ACCESS_TL, 2, newtl, (err, bytesRead, buffer) => { + assert(!err, 'can\'t readI2cBlock from tl'); + assert.strictEqual(bytesRead, 2, 'expected readI2cBlock to read 2 bytes'); + assert.strictEqual(buffer.readUInt16LE(0), 22, 'expected readI2cBlock to read value 22'); + assert.strictEqual(newtl, buffer, 'expected newtl to be passed to readI2cBlock callback'); + + i2cPlainReadWrite(); + }); + }); + }); +}; + +const readWriteWord = _ => { + // Test writeWord & readWord + // Change value of tl and verify that tl has been changed + i2c1.readWord(DS1621_ADDR, CMD_ACCESS_TL, (err, oldtl) => { + assert(!err, 'can\'t readWord from tl'); + assert(typeof oldtl === 'number' && oldtl <= 0xffff, 'expeted readWord to read a word'); + + const newtl = (oldtl === 24 ? 23 : 24); + i2c1.writeWord(DS1621_ADDR, CMD_ACCESS_TL, newtl, err => { + assert(!err, 'can\'t write word to tl'); + + i2c1.readWord(DS1621_ADDR, CMD_ACCESS_TL, (err, newtl2) => { + assert(!err, 'can\'t read new word from tl'); + assert(typeof newtl2 === 'number' && newtl2 <= 0xffff, 'expeted readWord to read a word'); + assert.strictEqual(newtl, newtl2, 'expected to read word written'); + + readWriteI2cBlock(); + }); + }); + }); +}; + +const sendReceiveByte = epectedConfig => { + // Test sendByte & receiveByte + // Read config and verify that it's epectedConfig + i2c1.sendByte(DS1621_ADDR, CMD_ACCESS_CONFIG, err => { + assert(!err, 'can\'t send byte to config'); + + i2c1.receiveByte(DS1621_ADDR, (err, config) => { + assert(!err, 'can\'t receive byte from config'); + assert(typeof config === 'number' && config <= 0xff, 'expeted receiveByte to receive a byte'); + assert.strictEqual(config, epectedConfig, '1st and 2nd config read differ'); + + readWriteWord(); + }); + }); +}; + +const readWriteByte = _ => { + // Test writeByte & readByte + // Enter continuous mode and verify that continuous mode has been entered + i2c1.writeByte(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x0, err => { + assert(!err, 'can\'t write byte to config'); + + waitForWrite(_ => { + i2c1.readByte(DS1621_ADDR, CMD_ACCESS_CONFIG, (err, config) => { + assert(!err, 'can\'t read byte from config'); + assert(typeof config === 'number' && config <= 0xff, 'expeted readByte to read a byte'); + assert.strictEqual(config & 0x1, 0, 'continuous mode not eneterd'); + + sendReceiveByte(config); + }); + }); + }); +}; + +const i2c1 = i2c.open(1, err => { + assert(!err, 'can\'t open i2c bus'); + readWriteByte(); +}); + diff --git a/node_modules/i2c-bus/integration-test/busses.js b/node_modules/i2c-bus/integration-test/busses.js new file mode 100644 index 0000000..abeceba --- /dev/null +++ b/node_modules/i2c-bus/integration-test/busses.js @@ -0,0 +1,45 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); + +const openPromisified = _ => + i2c.openPromisified(1). + then(promisifiedBus => { + assert.strictEqual( + promisifiedBus, promisifiedBus.bus().promisifiedBus(), + 'expected promisifiedBus.bus().promisifiedBus() to return promisifiedBus' + ); + + const bus = promisifiedBus.bus(); + assert.strictEqual( + bus, bus.promisifiedBus().bus(), + 'expected bus.promisifiedBus().bus() to return bus' + ); + + return promisifiedBus.close(); + }). + then(_ => console.log('ok - busses')). + catch(console.log); + +const open = _ => { + const bus = i2c.open(1, err => { + assert(!err, 'can\'t open i2c bus'); + + assert.strictEqual( + bus, bus.promisifiedBus().bus(), + 'expected bus.promisifiedBus().bus() to return bus' + ); + + const promisifiedBus = bus.promisifiedBus(); + assert.strictEqual( + promisifiedBus, promisifiedBus.bus().promisifiedBus(), + 'expected promisifiedBus.bus().promisifiedBus() to return promisifiedBus' + ); + + openPromisified(); + }); +}; + +open(); + diff --git a/node_modules/i2c-bus/integration-test/deviceid.js b/node_modules/i2c-bus/integration-test/deviceid.js new file mode 100644 index 0000000..e1a9ab5 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/deviceid.js @@ -0,0 +1,17 @@ +'use strict'; + +const i2c = require('../'); +const i2c1 = i2c.openSync(42); + +const address = 0x50; + +i2c1.deviceId(address, (err, id) => { + if (err) { + console.log('error', err); + } else { + console.log('id for address', '0x' + address.toString(16), id); + } + + i2c1.closeSync(); +}); + diff --git a/node_modules/i2c-bus/integration-test/errors.js b/node_modules/i2c-bus/integration-test/errors.js new file mode 100644 index 0000000..6902ddf --- /dev/null +++ b/node_modules/i2c-bus/integration-test/errors.js @@ -0,0 +1,338 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); +const i2c1 = i2c.openSync(1); + +//---------------------------------------------------------------------------- +// Methods +//---------------------------------------------------------------------------- + +// open(busNumber [, options], cb) +assert.throws(_ => i2c.open('not an integer'), /Invalid I2C bus number/, 'open'); +assert.throws(_ => i2c.open(-1), /Invalid I2C bus number/, 'open'); + +// openSync(busNumber [, options]) +assert.throws(_ => i2c.openSync('not an integer'), /Invalid I2C bus number/, 'openSync'); +assert.throws(_ => i2c.openSync(-1), /Invalid I2C bus number/, 'openSync'); + +//---------------------------------------------------------------------------- +// Free resources +//---------------------------------------------------------------------------- + +// close(cb) +assert.throws(_ => i2c1.close('not a cb'), /Invalid callback/, 'close'); + +//---------------------------------------------------------------------------- +// Information +//---------------------------------------------------------------------------- + +// i2cFuncs(cb) +assert.throws(_ => i2c1.i2cFuncs('not a cb'), /Invalid callback/, 'i2cFuncs'); + +// scan(cb) +assert.throws(_ => i2c1.scan('not a cb'), /Invalid callback/, 'scan'); +assert.throws(_ => i2c1.scan(0, 'not a cb'), /Invalid callback/, 'scan'); +assert.throws(_ => i2c1.scan(0, 0, 'not a cb'), /Invalid callback/, 'scan'); +assert.throws(_ => i2c1.scan('not an addr', 'not a cb'), /Invalid callback/, 'scan'); +assert.throws(_ => i2c1.scan('not an addr', 'not an addr', 'not a cb'), /Invalid callback/, 'scan'); + +assert.throws(_ => i2c1.scan('not an addr', _ => {}), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scan(-1, _ => {}), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scan(128, _ => {}), /Invalid I2C address/, 'scan'); + +assert.throws(_ => i2c1.scan(0, 'not an addr', _ => {}), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scan(0, -1, _ => {}), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scan(0, 128, _ => {}), /Invalid I2C address/, 'scan'); + +// scanSync(cb) +assert.throws(_ => i2c1.scanSync('not an addr'), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scanSync(-1), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scanSync(128), /Invalid I2C address/, 'scan'); + +assert.throws(_ => i2c1.scanSync(0, 'not an addr'), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scanSync(0, -1), /Invalid I2C address/, 'scan'); +assert.throws(_ => i2c1.scanSync(0, 128), /Invalid I2C address/, 'scan'); + +//---------------------------------------------------------------------------- +// Plain I2C +//---------------------------------------------------------------------------- + +// i2cRead(addr, length, buffer, cb) +assert.throws(_ => i2c1.i2cRead('not an addr', 100, Buffer.alloc(100), _ => {}), /Invalid I2C address/, 'i2cRead'); +assert.throws(_ => i2c1.i2cRead(-1, 100, Buffer.alloc(100), _ => {}), /Invalid I2C address/, 'i2cRead'); +assert.throws(_ => i2c1.i2cRead(128, 100, Buffer.alloc(100), _ => {}), /Invalid I2C address/, 'i2cRead'); + +assert.throws(_ => i2c1.i2cRead(0, 'not a length', Buffer.alloc(100), _ => {}), /Invalid buffer length/, 'i2cRead'); +assert.throws(_ => i2c1.i2cRead(0, -1, Buffer.alloc(100), _ => {}), /Invalid buffer length/, 'i2cRead'); + +assert.throws(_ => i2c1.i2cRead(0, 100, 'not a buffer', _ => {}), /Invalid buffer/, 'i2cRead'); + +assert.throws(_ => i2c1.i2cRead(0, 101, Buffer.alloc(100), _ => {}), /Buffer must contain at least/, 'i2cRead'); + +assert.throws(_ => i2c1.i2cRead(0, 100, Buffer.alloc(100), 'not a cb'), /Invalid callback/, 'i2cRead'); + +// i2cReadSync(addr, length, buffer) +assert.throws(_ => i2c1.i2cReadSync('not an addr', 0), /Invalid I2C address/, 'i2cReadSync'); +assert.throws(_ => i2c1.i2cReadSync(-1, 0), /Invalid I2C address/, 'i2cReadSync'); +assert.throws(_ => i2c1.i2cReadSync(128, 0), /Invalid I2C address/, 'i2cReadSync'); + +assert.throws(_ => i2c1.i2cReadSync(0, 'not a length', Buffer.alloc(100)), /Invalid buffer length/, 'i2cReadSync'); +assert.throws(_ => i2c1.i2cReadSync(0, -1, Buffer.alloc(100)), /Invalid buffer length/, 'i2cReadSync'); + +assert.throws(_ => i2c1.i2cReadSync(0, 100, 'not a buffer'), /Invalid buffer/, 'i2cReadSync'); + +assert.throws(_ => i2c1.i2cReadSync(0, 101, Buffer.alloc(100)), /Buffer must contain at least/, 'i2cReadSync'); + +// i2cWrite(addr, length, buffer, cb) +assert.throws(_ => i2c1.i2cWrite('not an addr', 0, _ => {}), /Invalid I2C address/, 'i2cWrite'); +assert.throws(_ => i2c1.i2cWrite(-1, 0, _ => {}), /Invalid I2C address/, 'i2cWrite'); +assert.throws(_ => i2c1.i2cWrite(128, 0, _ => {}), /Invalid I2C address/, 'i2cWrite'); + +assert.throws(_ => i2c1.i2cWrite(0, 'not a length', Buffer.alloc(100), _ => {}), /Invalid buffer length/, 'i2cWrite'); +assert.throws(_ => i2c1.i2cWrite(0, -1, Buffer.alloc(100), _ => {}), /Invalid buffer length/, 'i2cWrite'); + +assert.throws(_ => i2c1.i2cWrite(0, 100, 'not a buffer', _ => {}), /Invalid buffer/, 'i2cWrite'); + +assert.throws(_ => i2c1.i2cWrite(0, 101, Buffer.alloc(100), _ => {}), /Buffer must contain at least/, 'i2cWrite'); + +assert.throws(_ => i2c1.i2cWrite(0, 100, Buffer.alloc(100), 'not a cb'), /Invalid callback/, 'i2cWrite'); + +// i2cWriteSync(addr, length, buffer) +assert.throws(_ => i2c1.i2cWriteSync('not an addr', 0), /Invalid I2C address/, 'i2cWriteSync'); +assert.throws(_ => i2c1.i2cWriteSync(-1, 0), /Invalid I2C address/, 'i2cWriteSync'); +assert.throws(_ => i2c1.i2cWriteSync(128, 0), /Invalid I2C address/, 'i2cWriteSync'); + +assert.throws(_ => i2c1.i2cWriteSync(0, 'not a length', Buffer.alloc(100)), /Invalid buffer length/, 'i2cWriteSync'); +assert.throws(_ => i2c1.i2cWriteSync(0, -1, Buffer.alloc(100)), /Invalid buffer length/, 'i2cWriteSync'); + +assert.throws(_ => i2c1.i2cWriteSync(0, 100, 'not a buffer'), /Invalid buffer/, 'i2cWriteSync'); + +assert.throws(_ => i2c1.i2cWriteSync(0, 101, Buffer.alloc(100)), /Buffer must contain at least/, 'i2cWriteSync'); + +//---------------------------------------------------------------------------- +// SMBus +//---------------------------------------------------------------------------- + +// readByte(addr, cmd, cb) +assert.throws(_ => i2c1.readByte('not an addr', 0, _ => {}), /Invalid I2C address/, 'readByte'); +assert.throws(_ => i2c1.readByte(-1, 0, _ => {}), /Invalid I2C address/, 'readByte'); +assert.throws(_ => i2c1.readByte(128, 0, _ => {}), /Invalid I2C address/, 'readByte'); + +assert.throws(_ => i2c1.readByte(0, 'not a command', _ => {}), /Invalid I2C command/, 'readByte'); +assert.throws(_ => i2c1.readByte(0, -1, _ => {}), /Invalid I2C command/, 'readByte'); +assert.throws(_ => i2c1.readByte(0, 256, _ => {}), /Invalid I2C command/, 'readByte'); + +assert.throws(_ => i2c1.readByte(0, 0, 'not a cb'), /Invalid callback/, 'readByte'); + +// readByteSync(addr, cmd) +assert.throws(_ => i2c1.readByteSync('not an addr', 0), /Invalid I2C address/, 'readByteSync'); +assert.throws(_ => i2c1.readByteSync(-1, 0), /Invalid I2C address/, 'readByteSync'); +assert.throws(_ => i2c1.readByteSync(128, 0), /Invalid I2C address/, 'readByteSync'); + +assert.throws(_ => i2c1.readByteSync(0, 'not a command'), /Invalid I2C command/, 'readByteSync'); +assert.throws(_ => i2c1.readByteSync(0, -1), /Invalid I2C command/, 'readByteSync'); +assert.throws(_ => i2c1.readByteSync(0, 256), /Invalid I2C command/, 'readByteSync'); + +// readWord(addr, cmd, cb) +assert.throws(_ => i2c1.readWord('not an addr', 0, _ => {}), /Invalid I2C address/, 'readWord'); +assert.throws(_ => i2c1.readWord(-1, 0, _ => {}), /Invalid I2C address/, 'readWord'); +assert.throws(_ => i2c1.readWord(128, 0, _ => {}), /Invalid I2C address/, 'readWord'); + +assert.throws(_ => i2c1.readWord(0, 'not a command', _ => {}), /Invalid I2C command/, 'readWord'); +assert.throws(_ => i2c1.readWord(0, -1, _ => {}), /Invalid I2C command/, 'readWord'); +assert.throws(_ => i2c1.readWord(0, 256, _ => {}), /Invalid I2C command/, 'readWord'); + +assert.throws(_ => i2c1.readWord(0, 0, 'not a cb'), /Invalid callback/, 'readWord'); + +// readWordSync(addr, cmd) +assert.throws(_ => i2c1.readWordSync('not an addr', 0), /Invalid I2C address/, 'readWordSync'); +assert.throws(_ => i2c1.readWordSync(-1, 0), /Invalid I2C address/, 'readWordSync'); +assert.throws(_ => i2c1.readWordSync(128, 0), /Invalid I2C address/, 'readWordSync'); + +assert.throws(_ => i2c1.readWordSync(0, 'not a command'), /Invalid I2C command/, 'readWordSync'); +assert.throws(_ => i2c1.readWordSync(0, -1), /Invalid I2C command/, 'readWordSync'); +assert.throws(_ => i2c1.readWordSync(0, 256), /Invalid I2C command/, 'readWordSync'); + +// readI2cBlock(addr, cmd, length, buffer, cb) +assert.throws(_ => i2c1.readI2cBlock('not an addr', 0, 10, Buffer.alloc(10), _ => {}), /Invalid I2C address/, 'readI2cBlock'); +assert.throws(_ => i2c1.readI2cBlock(-1, 0, 10, Buffer.alloc(10), _ => {}), /Invalid I2C address/, 'readI2cBlock'); +assert.throws(_ => i2c1.readI2cBlock(128, 0, 10, Buffer.alloc(10), _ => {}), /Invalid I2C address/, 'readI2cBlock'); + +assert.throws(_ => i2c1.readI2cBlock(0, 'not a command', 10, Buffer.alloc(10), _ => {}), /Invalid I2C command/, 'readI2cBlock'); +assert.throws(_ => i2c1.readI2cBlock(0, -1, 10, Buffer.alloc(10), _ => {}), /Invalid I2C command/, 'readI2cBlock'); +assert.throws(_ => i2c1.readI2cBlock(0, 256, 10, Buffer.alloc(10), _ => {}), /Invalid I2C command/, 'readI2cBlock'); + +assert.throws(_ => i2c1.readI2cBlock(0, 0, 'not a length', Buffer.alloc(10), _ => {}), /Invalid buffer length/, 'readI2cBlock'); +assert.throws(_ => i2c1.readI2cBlock(0, 0, -1, Buffer.alloc(10), _ => {}), /Invalid buffer length/, 'readI2cBlock'); +assert.throws(_ => i2c1.readI2cBlock(0, 0, 33, Buffer.alloc(33), _ => {}), /Invalid buffer length/, 'readI2cBlock'); + +assert.throws(_ => i2c1.readI2cBlock(0, 0, 10, 'not a buffer', _ => {}), /Invalid buffer/, 'readI2cBlock'); + +assert.throws(_ => i2c1.readI2cBlock(0, 0, 11, Buffer.alloc(10), _ => {}), /Buffer must contain at least/, 'readI2cBlock'); + +assert.throws(_ => i2c1.readI2cBlock(0, 0, 10, Buffer.alloc(10), 'not a cb'), /Invalid callback/, 'readI2cBlock'); + +// readI2cBlockSync(addr, cmd, length, buffer) +assert.throws(_ => i2c1.readI2cBlockSync('not an addr', 0, 10, Buffer.alloc(10)), /Invalid I2C address/, 'readI2cBlockSync'); +assert.throws(_ => i2c1.readI2cBlockSync(-1, 0, 10, Buffer.alloc(10)), /Invalid I2C address/, 'readI2cBlockSync'); +assert.throws(_ => i2c1.readI2cBlockSync(128, 0, 10, Buffer.alloc(10)), /Invalid I2C address/, 'readI2cBlockSync'); + +assert.throws(_ => i2c1.readI2cBlockSync(0, 'not a command', 10, Buffer.alloc(10)), /Invalid I2C command/, 'readI2cBlockSync'); +assert.throws(_ => i2c1.readI2cBlockSync(0, -1, 10, Buffer.alloc(10)), /Invalid I2C command/, 'readI2cBlockSync'); +assert.throws(_ => i2c1.readI2cBlockSync(0, 256, 10, Buffer.alloc(10)), /Invalid I2C command/, 'readI2cBlockSync'); + +assert.throws(_ => i2c1.readI2cBlockSync(0, 0, 'not a length', Buffer.alloc(10)), /Invalid buffer length/, 'readI2cBlockSync'); +assert.throws(_ => i2c1.readI2cBlockSync(0, 0, -1, Buffer.alloc(10)), /Invalid buffer length/, 'readI2cBlockSync'); +assert.throws(_ => i2c1.readI2cBlockSync(0, 0, 33, Buffer.alloc(33)), /Invalid buffer length/, 'readI2cBlockSync'); + +assert.throws(_ => i2c1.readI2cBlockSync(0, 0, 10, 'not a buffer'), /Invalid buffer/, 'readI2cBlockSync'); + +assert.throws(_ => i2c1.readI2cBlockSync(0, 0, 11, Buffer.alloc(10)), /Buffer must contain at least/, 'readI2cBlockSync'); + +// receiveByte(addr, cb) +assert.throws(_ => i2c1.receiveByte('not an addr', _ => {}), /Invalid I2C address/, 'receiveByte'); +assert.throws(_ => i2c1.receiveByte(-1, _ => {}), /Invalid I2C address/, 'receiveByte'); +assert.throws(_ => i2c1.receiveByte(128, _ => {}), /Invalid I2C address/, 'receiveByte'); + +assert.throws(_ => i2c1.receiveByte(0, 'not a cb'), /Invalid callback/, 'receiveByte'); + +// receiveByteSync(addr) +assert.throws(_ => i2c1.receiveByteSync('not an addr'), /Invalid I2C address/, 'receiveByteSync'); +assert.throws(_ => i2c1.receiveByteSync(-1), /Invalid I2C address/, 'receiveByteSync'); +assert.throws(_ => i2c1.receiveByteSync(128), /Invalid I2C address/, 'receiveByteSync'); + +// sendByte(addr, byte, cb) +assert.throws(_ => i2c1.sendByte('not an addr', 0, _ => {}), /Invalid I2C address/, 'sendByte'); +assert.throws(_ => i2c1.sendByte(-1, 0, _ => {}), /Invalid I2C address/, 'sendByte'); +assert.throws(_ => i2c1.sendByte(128, 0, _ => {}), /Invalid I2C address/, 'sendByte'); + +assert.throws(_ => i2c1.sendByte(0, 'not a byte', _ => {}), /Invalid byte/, 'sendByte'); +assert.throws(_ => i2c1.sendByte(0, -1, _ => {}), /Invalid byte/, 'sendByte'); +assert.throws(_ => i2c1.sendByte(0, 256, _ => {}), /Invalid byte/, 'sendByte'); + +assert.throws(_ => i2c1.sendByte(0, 0, 'not a cb'), /Invalid callback/, 'sendByte'); + +// sendByteSync(addr, byte) +assert.throws(_ => i2c1.sendByteSync('not an addr', 0), /Invalid I2C address/, 'sendByteSync'); +assert.throws(_ => i2c1.sendByteSync(-1, 0), /Invalid I2C address/, 'sendByteSync'); +assert.throws(_ => i2c1.sendByteSync(128, 0), /Invalid I2C address/, 'sendByteSync'); + +assert.throws(_ => i2c1.sendByteSync(0, 'not a byte'), /Invalid byte/, 'sendByteSync'); +assert.throws(_ => i2c1.sendByteSync(0, -1), /Invalid byte/, 'sendByteSync'); +assert.throws(_ => i2c1.sendByteSync(0, 256), /Invalid byte/, 'sendByteSync'); + +// writeByte(addr, cmd, byte, cb) +assert.throws(_ => i2c1.writeByte('not an addr', 0, 0, _ => {}), /Invalid I2C address/, 'writeByte'); +assert.throws(_ => i2c1.writeByte(-1, 0, 0, _ => {}), /Invalid I2C address/, 'writeByte'); +assert.throws(_ => i2c1.writeByte(128, 0, 0, _ => {}), /Invalid I2C address/, 'writeByte'); + +assert.throws(_ => i2c1.writeByte(0, 'not a command', 0, _ => {}), /Invalid I2C command/, 'writeByte'); +assert.throws(_ => i2c1.writeByte(0, -1, 0, _ => {}), /Invalid I2C command/, 'writeByte'); +assert.throws(_ => i2c1.writeByte(0, 256, 0, _ => {}), /Invalid I2C command/, 'writeByte'); + +assert.throws(_ => i2c1.writeByte(0, 0, 'not a byte', _ => {}), /Invalid byte/, 'writeByte'); +assert.throws(_ => i2c1.writeByte(0, 0, -1, _ => {}), /Invalid byte/, 'writeByte'); +assert.throws(_ => i2c1.writeByte(0, 0, 256, _ => {}), /Invalid byte/, 'writeByte'); + +assert.throws(_ => i2c1.writeByte(0, 0, 0, 'not a cb'), /Invalid callback/, 'writeByte'); + +// writeByteSync(addr, cmd, byte) +assert.throws(_ => i2c1.writeByteSync('not an addr', 0, 0), /Invalid I2C address/, 'writeByteSync'); +assert.throws(_ => i2c1.writeByteSync(-1, 0, 0), /Invalid I2C address/, 'writeByteSync'); +assert.throws(_ => i2c1.writeByteSync(128, 0, 0), /Invalid I2C address/, 'writeByteSync'); + +assert.throws(_ => i2c1.writeByteSync(0, 'not a command', 0), /Invalid I2C command/, 'writeByteSync'); +assert.throws(_ => i2c1.writeByteSync(0, -1, 0), /Invalid I2C command/, 'writeByteSync'); +assert.throws(_ => i2c1.writeByteSync(0, 256, 0), /Invalid I2C command/, 'writeByteSync'); + +assert.throws(_ => i2c1.writeByteSync(0, 0, 'not a byte'), /Invalid byte/, 'writeByteSync'); +assert.throws(_ => i2c1.writeByteSync(0, 0, -1), /Invalid byte/, 'writeByteSync'); +assert.throws(_ => i2c1.writeByteSync(0, 0, 256), /Invalid byte/, 'writeByteSync'); + +// writeWord(addr, cmd, word, cb) +assert.throws(_ => i2c1.writeWord('not an addr', 0, 0, _ => {}), /Invalid I2C address/, 'writeWord'); +assert.throws(_ => i2c1.writeWord(-1, 0, 0, _ => {}), /Invalid I2C address/, 'writeWord'); +assert.throws(_ => i2c1.writeWord(128, 0, 0, _ => {}), /Invalid I2C address/, 'writeWord'); + +assert.throws(_ => i2c1.writeWord(0, 'not a command', 0, _ => {}), /Invalid I2C command/, 'writeWord'); +assert.throws(_ => i2c1.writeWord(0, -1, 0, _ => {}), /Invalid I2C command/, 'writeWord'); +assert.throws(_ => i2c1.writeWord(0, 256, 0, _ => {}), /Invalid I2C command/, 'writeWord'); + +assert.throws(_ => i2c1.writeWord(0, 0, 'not a word', _ => {}), /Invalid word/, 'writeWord'); +assert.throws(_ => i2c1.writeWord(0, 0, -1, _ => {}), /Invalid word/, 'writeWord'); +assert.throws(_ => i2c1.writeWord(0, 0, 0xffff+1, _ => {}), /Invalid word/, 'writeWord'); + +assert.throws(_ => i2c1.writeWord(0, 0, 0, 'not a cb'), /Invalid callback/, 'writeWord'); + +// writeWordSync(addr, cmd, word) +assert.throws(_ => i2c1.writeWordSync('not an addr', 0, 0), /Invalid I2C address/, 'writeWordSync'); +assert.throws(_ => i2c1.writeWordSync(-1, 0, 0), /Invalid I2C address/, 'writeWordSync'); +assert.throws(_ => i2c1.writeWordSync(128, 0, 0), /Invalid I2C address/, 'writeWordSync'); + +assert.throws(_ => i2c1.writeWordSync(0, 'not a command', 0), /Invalid I2C command/, 'writeWordSync'); +assert.throws(_ => i2c1.writeWordSync(0, -1, 0), /Invalid I2C command/, 'writeWordSync'); +assert.throws(_ => i2c1.writeWordSync(0, 256, 0), /Invalid I2C command/, 'writeWordSync'); + +assert.throws(_ => i2c1.writeWordSync(0, 0, 'not a word'), /Invalid word/, 'writeWordSync'); +assert.throws(_ => i2c1.writeWordSync(0, 0, -1), /Invalid word/, 'writeWordSync'); +assert.throws(_ => i2c1.writeWordSync(0, 0, 0xffff+1), /Invalid word/, 'writeWordSync'); + +// writeQuick(addr, bit, cb) +assert.throws(_ => i2c1.writeQuick('not an addr', 0, _ => {}), /Invalid I2C address/, 'writeQuick'); +assert.throws(_ => i2c1.writeQuick(-1, 0, _ => {}), /Invalid I2C address/, 'writeQuick'); +assert.throws(_ => i2c1.writeQuick(128, 0, _ => {}), /Invalid I2C address/, 'writeQuick'); + +assert.throws(_ => i2c1.writeQuick(0, 'not a word', _ => {}), /Invalid bit/, 'writeQuick'); +assert.throws(_ => i2c1.writeQuick(0, -1, _ => {}), /Invalid bit/, 'writeQuick'); +assert.throws(_ => i2c1.writeQuick(0, 2, _ => {}), /Invalid bit/, 'writeQuick'); + +assert.throws(_ => i2c1.writeQuick(0, 0, 'not a cb'), /Invalid callback/, 'writeQuick'); + +// writeQuickSync(addr, bit) +assert.throws(_ => i2c1.writeQuickSync('not an addr', 0), /Invalid I2C address/, 'writeQuickSync'); +assert.throws(_ => i2c1.writeQuickSync(-1, 0), /Invalid I2C address/, 'writeQuickSync'); +assert.throws(_ => i2c1.writeQuickSync(128, 0), /Invalid I2C address/, 'writeQuickSync'); + +assert.throws(_ => i2c1.writeQuickSync(0, 'not a word'), /Invalid bit/, 'writeQuickSync'); +assert.throws(_ => i2c1.writeQuickSync(0, -1), /Invalid bit/, 'writeQuickSync'); +assert.throws(_ => i2c1.writeQuickSync(0, 2), /Invalid bit/, 'writeQuickSync'); + +// writeI2cBlock(addr, cmd, length, buffer, cb) +assert.throws(_ => i2c1.writeI2cBlock('not an addr', 0, 10, Buffer.alloc(10), _ => {}), /Invalid I2C address/, 'writeI2cBlock'); +assert.throws(_ => i2c1.writeI2cBlock(-1, 0, 10, Buffer.alloc(10), _ => {}), /Invalid I2C address/, 'writeI2cBlock'); +assert.throws(_ => i2c1.writeI2cBlock(128, 0, 10, Buffer.alloc(10), _ => {}), /Invalid I2C address/, 'writeI2cBlock'); + +assert.throws(_ => i2c1.writeI2cBlock(0, 'not a command', 10, Buffer.alloc(10), _ => {}), /Invalid I2C command/, 'writeI2cBlock'); +assert.throws(_ => i2c1.writeI2cBlock(0, -1, 10, Buffer.alloc(10), _ => {}), /Invalid I2C command/, 'writeI2cBlock'); +assert.throws(_ => i2c1.writeI2cBlock(0, 256, 10, Buffer.alloc(10), _ => {}), /Invalid I2C command/, 'writeI2cBlock'); + +assert.throws(_ => i2c1.writeI2cBlock(0, 0, 'not a length', Buffer.alloc(10), _ => {}), /Invalid buffer length/, 'writeI2cBlock'); +assert.throws(_ => i2c1.writeI2cBlock(0, 0, -1, Buffer.alloc(10), _ => {}), /Invalid buffer length/, 'writeI2cBlock'); +assert.throws(_ => i2c1.writeI2cBlock(0, 0, 33, Buffer.alloc(33), _ => {}), /Invalid buffer length/, 'writeI2cBlock'); + +assert.throws(_ => i2c1.writeI2cBlock(0, 0, 10, 'not a buffer', _ => {}), /Invalid buffer/, 'writeI2cBlock'); + +assert.throws(_ => i2c1.writeI2cBlock(0, 0, 11, Buffer.alloc(10), _ => {}), /Buffer must contain at least/, 'writeI2cBlock'); + +assert.throws(_ => i2c1.writeI2cBlock(0, 0, 10, Buffer.alloc(10), 'not a cb'), /Invalid callback/, 'writeI2cBlock'); + +// writeI2cBlockSync(addr, cmd, length, buffer) +assert.throws(_ => i2c1.writeI2cBlockSync('not an addr', 0, 10, Buffer.alloc(10)), /Invalid I2C address/, 'writeI2cBlockSync'); +assert.throws(_ => i2c1.writeI2cBlockSync(-1, 0, 10, Buffer.alloc(10)), /Invalid I2C address/, 'writeI2cBlockSync'); +assert.throws(_ => i2c1.writeI2cBlockSync(128, 0, 10, Buffer.alloc(10)), /Invalid I2C address/, 'writeI2cBlockSync'); + +assert.throws(_ => i2c1.writeI2cBlockSync(0, 'not a command', 10, Buffer.alloc(10)), /Invalid I2C command/, 'writeI2cBlockSync'); +assert.throws(_ => i2c1.writeI2cBlockSync(0, -1, 10, Buffer.alloc(10)), /Invalid I2C command/, 'writeI2cBlockSync'); +assert.throws(_ => i2c1.writeI2cBlockSync(0, 256, 10, Buffer.alloc(10)), /Invalid I2C command/, 'writeI2cBlockSync'); + +assert.throws(_ => i2c1.writeI2cBlockSync(0, 0, 'not a length', Buffer.alloc(10)), /Invalid buffer length/, 'writeI2cBlockSync'); +assert.throws(_ => i2c1.writeI2cBlockSync(0, 0, -1, Buffer.alloc(10)), /Invalid buffer length/, 'writeI2cBlockSync'); +assert.throws(_ => i2c1.writeI2cBlockSync(0, 0, 33, Buffer.alloc(33)), /Invalid buffer length/, 'writeI2cBlockSync'); + +assert.throws(_ => i2c1.writeI2cBlockSync(0, 0, 10, 'not a buffer'), /Invalid buffer/, 'writeI2cBlockSync'); + +assert.throws(_ => i2c1.writeI2cBlockSync(0, 0, 11, Buffer.alloc(10)), /Buffer must contain at least/, 'writeI2cBlockSync'); + +console.log('ok - errors'); + diff --git a/node_modules/i2c-bus/integration-test/i2c-functionality-available.js b/node_modules/i2c-bus/integration-test/i2c-functionality-available.js new file mode 100644 index 0000000..2f7fd58 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/i2c-functionality-available.js @@ -0,0 +1,11 @@ +'use strict'; + +const i2c = require('../'); +const i2c1 = i2c.openSync(1); +const i2cfuncs = i2c1.i2cFuncsSync(); +const platform = i2cfuncs.smbusQuick ? 'Raspberry Pi?' : 'BeagleBone?'; + +i2c1.closeSync(); + +console.log('ok - i2c-functionality-available - ' + platform); + diff --git a/node_modules/i2c-bus/integration-test/run-tests b/node_modules/i2c-bus/integration-test/run-tests new file mode 100755 index 0000000..b0e07a4 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/run-tests @@ -0,0 +1,14 @@ +#!/bin/sh +node async +node async-performance +node async-promise +node async-promise-performance +node busses +node errors +node i2c-functionality-available +node scan +node sync +node sync-many-instances +node sync-performance +node sync-plain-i2c-performance + diff --git a/node_modules/i2c-bus/integration-test/scan-leak-check.js b/node_modules/i2c-bus/integration-test/scan-leak-check.js new file mode 100644 index 0000000..f1c68ec --- /dev/null +++ b/node_modules/i2c-bus/integration-test/scan-leak-check.js @@ -0,0 +1,27 @@ +'use strict'; + +const lodash = require('lodash'); +const assert = require('assert'); +const i2c = require('../'); + +const bus = i2c.openSync(1); +let count = 0; + +const next = _ => { + const addresses = bus.scanSync(); + + bus.scan((err, devices) => { + assert(!err, 'can\'t scan for devices'); + assert(lodash.isEqual(addresses, devices), 'sync and async scan differ'); + + count += 1; + if (count % 10 === 0) { + console.log(count); + } + + next(); + }); +}; + +next(); + diff --git a/node_modules/i2c-bus/integration-test/scan.js b/node_modules/i2c-bus/integration-test/scan.js new file mode 100644 index 0000000..841d105 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/scan.js @@ -0,0 +1,82 @@ +'use strict'; + +const lodash = require('lodash'); +const assert = require('assert'); +const i2c = require('../'); + +const TSL2561_ADDR = 0x39; +const DS1621_ADDR = 0x48; + +const bus = i2c.openSync(1); + +const scanSyncRange = _ => { + const devices = bus.scanSync(TSL2561_ADDR, DS1621_ADDR); + + assert(devices.length === 2, 'expected 2 devices'); + assert( + devices[0] === TSL2561_ADDR, + 'expected device at address 0x' + TSL2561_ADDR.toString(16) + ); + assert( + devices[1] === DS1621_ADDR, + 'expected device at address 0x' + DS1621_ADDR.toString(16) + ); + + console.log('ok - scan'); +}; + +const scanSyncForSingleDevice = _ => { + const devices = bus.scanSync(DS1621_ADDR); + + assert(devices.length === 1, 'expected 1 device'); + assert( + devices[0] === DS1621_ADDR, + 'expected device at address 0x' + DS1621_ADDR.toString(16) + ); + + scanSyncRange(); +}; + +const scanRange = _ => { + bus.scan(TSL2561_ADDR, DS1621_ADDR, (err, devices) => { + assert(!err, 'can\'t scan range'); + assert(devices.length === 2, 'expected 2 devices'); + assert( + devices[0] === TSL2561_ADDR, + 'expected device at address 0x' + TSL2561_ADDR.toString(16) + ); + assert( + devices[1] === DS1621_ADDR, + 'expected device at address 0x' + DS1621_ADDR.toString(16) + ); + + scanSyncForSingleDevice(); + }); +}; + +const scanForSingleDevice = _ => { + bus.scan(DS1621_ADDR, (err, devices) => { + assert(!err, 'can\'t scan for single device'); + assert(devices.length === 1, 'expected 1 device'); + assert( + devices[0] === DS1621_ADDR, + 'expected device at address 0x' + DS1621_ADDR.toString(16) + ); + + scanRange(); + }); +}; + +const scanDefaultRange = _ => { + const addresses = bus.scanSync(); + + bus.scan((err, devices) => { + assert(!err, 'can\'t scan default range'); + assert(lodash.isEqual(addresses, devices), 'sync and async scan differ'); + + scanForSingleDevice(); + }); +}; + +scanDefaultRange(); + diff --git a/node_modules/i2c-bus/integration-test/sync-brute-force-leak-check.js b/node_modules/i2c-bus/integration-test/sync-brute-force-leak-check.js new file mode 100644 index 0000000..02545c8 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/sync-brute-force-leak-check.js @@ -0,0 +1,21 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_TL = 0xa2; + +const i2c1 = i2c.openSync(1); + +for (let i = 1; i <= 1000000; i += 1) { + const tlbuf = Buffer.alloc(1000000); + const bytesRead = i2c1.readI2cBlockSync(DS1621_ADDR, CMD_ACCESS_TL, 2, tlbuf); + assert.strictEqual(bytesRead, 2, 'expected readI2cBlockSync to read 2 bytes'); + if (i % 1000 === 0) { + console.log(i); + } +} + +i2c1.closeSync(); + diff --git a/node_modules/i2c-bus/integration-test/sync-deviceid.js b/node_modules/i2c-bus/integration-test/sync-deviceid.js new file mode 100644 index 0000000..ab2d485 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/sync-deviceid.js @@ -0,0 +1,26 @@ +'use strict'; + +const i2c = require('../'); + +const address = 0x50; +const invalid = 0x42; + +const readDeviceId = _ => { + const i2c1 = i2c.openSync(42); + const id = i2c1.deviceIdSync(address); + + console.log('id for address', '0x' + address.toString(16), id); + + // + try { + i2c1.deviceIdSync(invalid); + } catch(e) { + i2c1.closeSync(); + return; + } + + throw Error('should have exited though catch'); +}; + +readDeviceId(); + diff --git a/node_modules/i2c-bus/integration-test/sync-many-instances.js b/node_modules/i2c-bus/integration-test/sync-many-instances.js new file mode 100644 index 0000000..9a9f44c --- /dev/null +++ b/node_modules/i2c-bus/integration-test/sync-many-instances.js @@ -0,0 +1,51 @@ +'use strict'; + +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const DS1621_CMD_ACCESS_TH = 0xa1; +const DS1621_CMD_ACCESS_TL = 0xa2; + +const TSL2561_ADDR = 0x39; +const TSL2561_CMD = 0x80; +const TSL2561_REG_ID = 0x0a; + +const useBusMoreThanMaxFdTimes = _ => { + // Assuming that less than 2000 files can be opened at the same time, + // open and close /dev/i2c-1 2000 times to make sure it works and to ensure + // that file descriptors are being freed. + for (let i = 1; i <= 2000; i += 1) { + const i2c1 = i2c.openSync(1); + i2c1.readWordSync(DS1621_ADDR, DS1621_CMD_ACCESS_TL); + i2c1.closeSync(); + } +}; + +const useMultipleObjectsForSameBusConcurrently = _ => { + const buses = []; + + // Make sure many Bus objects can be opened and used for the same I2C bus at + // the same time. + for (let i = 1; i <= 128; i += 1) { + buses.push(i2c.openSync(1)); + } + buses.forEach(bus => bus.readWordSync(DS1621_ADDR, DS1621_CMD_ACCESS_TL)); + buses.forEach(bus => bus.closeSync()); +}; + +const useTwoObjectsForSameBusConcurrently = _ => { + const ds1621 = i2c.openSync(1); + const tsl2561 = i2c.openSync(1); + const ds1621TempHigh = ds1621.readWordSync(DS1621_ADDR, DS1621_CMD_ACCESS_TH); + const tsl2561Id = tsl2561.readByteSync(TSL2561_ADDR, TSL2561_CMD | TSL2561_REG_ID); + + console.log(' ds1621TempHigh: ' + ds1621TempHigh); + console.log(' tsl2561Id: ' + tsl2561Id); +}; + +useBusMoreThanMaxFdTimes(); +useMultipleObjectsForSameBusConcurrently(); +useTwoObjectsForSameBusConcurrently(); + +console.log('ok - sync-many-instances'); + diff --git a/node_modules/i2c-bus/integration-test/sync-performance.js b/node_modules/i2c-bus/integration-test/sync-performance.js new file mode 100644 index 0000000..d4c3ba5 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/sync-performance.js @@ -0,0 +1,24 @@ +'use strict'; + +const i2c = require('../'); + +const ITERATIONS = 5000; + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_TL = 0xa2; + +const i2c1 = i2c.openSync(1); + +let time = process.hrtime(); + +for (let reads = 1; reads <= ITERATIONS; reads += 1) { + i2c1.readWordSync(DS1621_ADDR, CMD_ACCESS_TL); +} + +time = process.hrtime(time); +const readsPerSec = Math.floor(ITERATIONS / (time[0] + time[1] / 1E9)); + +i2c1.closeSync(); + +console.log('ok - sync-performance - ' + readsPerSec + ' reads per second'); + diff --git a/node_modules/i2c-bus/integration-test/sync-plain-i2c-performance.js b/node_modules/i2c-bus/integration-test/sync-plain-i2c-performance.js new file mode 100644 index 0000000..cf25d98 --- /dev/null +++ b/node_modules/i2c-bus/integration-test/sync-plain-i2c-performance.js @@ -0,0 +1,28 @@ +'use strict'; + +const i2c = require('../'); + +const ITERATIONS = 5000; + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_TL = 0xa2; + +const i2c1 = i2c.openSync(1); +const cmdGetTL = Buffer.from([CMD_ACCESS_TL]); +const tl = Buffer.alloc(2); + +let time = process.hrtime(); + +// one operation is an i2cWriteSync and an i2cReadSync, i.e., two calls +for (let operations = 1; operations <= ITERATIONS; operations += 1) { + i2c1.i2cWriteSync(DS1621_ADDR, cmdGetTL.length, cmdGetTL); + i2c1.i2cReadSync(DS1621_ADDR, 2, tl); +} + +time = process.hrtime(time); +const opsPerSec = Math.floor(ITERATIONS / (time[0] + time[1] / 1E9)); + +i2c1.closeSync(); + +console.log('ok - sync-plain-i2c-performance - ' + opsPerSec + ' (x 2) operations per second'); + diff --git a/node_modules/i2c-bus/integration-test/sync.js b/node_modules/i2c-bus/integration-test/sync.js new file mode 100644 index 0000000..ae98d8d --- /dev/null +++ b/node_modules/i2c-bus/integration-test/sync.js @@ -0,0 +1,103 @@ +'use strict'; + +const assert = require('assert'); +const i2c = require('../'); + +const DS1621_ADDR = 0x48; +const CMD_ACCESS_CONFIG = 0xac; +const CMD_ACCESS_TL = 0xa2; + +const i2c1 = i2c.openSync(1); + +// Wait while non volatile memory busy +const waitForWrite = _ => { + while (i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG) & 0x10) { + } +}; + +// Test writeByteSync & readByteSync +// Enter one shot mode and verify that one shot mode has been entered +const readWriteByte = _ => { + const self = i2c1.writeByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG, 0x01); + assert.strictEqual(self, i2c1, 'expected writeByteSync to return this'); + waitForWrite(); + const config = i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG); + assert(typeof config === 'number' && config <= 0xff, 'expeted readByteSync to read a byte'); + assert.strictEqual(config & 0x1, 1, 'one shot mode not eneterd'); +}; + +// Test sendByteSync & receiveByteSync +// Read config using different techniques and verify that 1st and 2nd read +// are identical +const sendReceiveByte = _ => { + const expectedConfig = i2c1.readByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG); + assert(typeof expectedConfig === 'number' && expectedConfig <= 0xff, 'expeted readByteSync to read a byte'); + + const self = i2c1.sendByteSync(DS1621_ADDR, CMD_ACCESS_CONFIG); + assert.strictEqual(self, i2c1, 'expected sendByteSync to return this'); + + const config = i2c1.receiveByteSync(DS1621_ADDR); + assert(typeof config === 'number' && config <= 0xff, 'expeted receiveByteSync to receive a byte'); + assert.strictEqual(config, expectedConfig, '1st and 2nd config read differ'); +}; + +// Test writeWordSync & readWordSync +// Change value of tl and verify that tl has been changed +const readWriteWord = _ => { + const oldtl = i2c1.readWordSync(DS1621_ADDR, CMD_ACCESS_TL); + assert(typeof oldtl === 'number' && oldtl <= 0xffff, 'expeted readWordSync to read a word'); + + const tl = (oldtl === 24 ? 23 : 24); + + const self = i2c1.writeWordSync(DS1621_ADDR, CMD_ACCESS_TL, tl); + assert.strictEqual(self, i2c1, 'expected writeWordSync to return this'); + waitForWrite(); + + const newtl = i2c1.readWordSync(DS1621_ADDR, CMD_ACCESS_TL); + assert(typeof newtl === 'number' && newtl <= 0xffff, 'expeted readWordSync to read a word'); + assert.strictEqual(tl, newtl, 'expected to read word written'); +}; + +// Test writeI2cBlockSync & readI2cBlockSync +// Change value of tl to 22 and verify that tl has been changed +const readWriteI2cBlock = _ => { + const tlbuf = Buffer.alloc(10); + tlbuf.writeUInt16LE(22, 0); + const self = i2c1.writeI2cBlockSync(DS1621_ADDR, CMD_ACCESS_TL, 2, tlbuf); + assert.strictEqual(self, i2c1, 'expected writeI2cBlockSync to return this'); + waitForWrite(); + + const newtl = Buffer.alloc(10); + const bytesRead = i2c1.readI2cBlockSync(DS1621_ADDR, CMD_ACCESS_TL, 2, newtl); + assert.strictEqual(bytesRead, 2, 'expected readI2cBlockSync to read 2 bytes'); + assert.strictEqual(newtl.readUInt16LE(0), 22, 'expected readI2cBlockSync to read value 22'); +}; + +// Test i2cWriteSync & i2cReadSync +// Change value of tl to 25 and verify that tl has been changed +const i2cPlainReadWrite = _ => { + const cmdSetTL = Buffer.from([CMD_ACCESS_TL, 25, 0]); + let bytesWritten = i2c1.i2cWriteSync(DS1621_ADDR, cmdSetTL.length, cmdSetTL); + assert.strictEqual(bytesWritten, 3, 'expected i2cWriteSync to write 3 bytes'); + waitForWrite(); + + const cmdGetTL = Buffer.from([CMD_ACCESS_TL]); + bytesWritten = i2c1.i2cWriteSync(DS1621_ADDR, cmdGetTL.length, cmdGetTL); + assert.strictEqual(bytesWritten, 1, 'expected i2cWriteSync to write 1 byte'); + + const tl = Buffer.alloc(2); + const bytesRead = i2c1.i2cReadSync(DS1621_ADDR, 2, tl); + assert.strictEqual(bytesRead, 2, 'expected i2cReadSync to read 2 bytes'); + assert.strictEqual(tl.readUInt16LE(0), 25, 'expected i2cReadSync to read value 25'); +}; + +readWriteByte(); +sendReceiveByte(); +readWriteWord(); +readWriteI2cBlock(); +i2cPlainReadWrite(); + +i2c1.closeSync(); + +console.log('ok - sync'); + diff --git a/node_modules/i2c-bus/package.json b/node_modules/i2c-bus/package.json new file mode 100644 index 0000000..ce03405 --- /dev/null +++ b/node_modules/i2c-bus/package.json @@ -0,0 +1,55 @@ +{ + "name": "i2c-bus", + "version": "5.2.3", + "description": "I2C serial bus access with Node.js", + "main": "i2c-bus.js", + "directories": { + "example": "example", + "test": "test" + }, + "scripts": { + "coverage-report": "nyc report --reporter=html", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "install": "node-gyp rebuild", + "integration-test": "cd integration-test && ./run-tests && cd ..", + "lint": "jshint i2c-bus.js example/*.js integration-test/*.js test/*.js test/*/*.js", + "test": "nyc mocha" + }, + "repository": { + "type": "git", + "url": "https://github.com/fivdi/i2c-bus.git" + }, + "engines": { + "node": ">=10.0.0" + }, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.17.0" + }, + "devDependencies": { + "async": "^3.2.4", + "coveralls": "^3.1.1", + "glob": "^10.3.3", + "jshint": "^2.13.6", + "lodash": "^4.17.21", + "mocha": "^10.2.0", + "mock-fs": "^5.2.0", + "mock-require": "^3.0.3", + "nyc": "^15.1.0", + "sinon": "^15.2.0" + }, + "keywords": [ + "i2c", + "iot", + "raspberry", + "raspi", + "rpi", + "pi", + "beaglebone", + "smbus", + "linux" + ], + "author": "fivdi", + "license": "MIT", + "gypfile": true +} diff --git a/node_modules/i2c-bus/src/deviceid.cc b/node_modules/i2c-bus/src/deviceid.cc new file mode 100644 index 0000000..accabc2 --- /dev/null +++ b/node_modules/i2c-bus/src/deviceid.cc @@ -0,0 +1,72 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./deviceid.h" +#include "./util.h" + +static __s32 DeviceId(int fd, __u16 address) { + return i2c_smbus_deviceid(fd, address); +} + +class DeviceIdWorker : public I2cAsyncWorker { +public: + DeviceIdWorker(Nan::Callback *callback, int fd, __u16 address) + : I2cAsyncWorker(callback), fd(fd), address(address) {} + ~DeviceIdWorker() {} + + void Execute() { + id = DeviceId(fd, address); + if (id == -1) { + SetErrorNo(errno); + SetErrorSyscall("deviceId"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null(), + Nan::New(id) + }; + + callback->Call(2, argv, async_resource); + } + +private: + int fd; + __u16 address; + __s32 id; +}; + +NAN_METHOD(DeviceIdAsync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "deviceId", + "incorrect arguments passed to deviceId(int fd, int address, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u16 address = Nan::To(info[1]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[2].As()); + + Nan::AsyncQueueWorker(new DeviceIdWorker(callback, fd, address)); +} + +NAN_METHOD(DeviceIdSync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "deviceIdSync", + "incorrect arguments passed to deviceIdSync(int fd, int address)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u16 address = Nan::To(info[1]).FromJust(); + + __s32 ret = DeviceId(fd, address); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "deviceIdSync", "")); + } + + info.GetReturnValue().Set(Nan::New(ret)); +} + diff --git a/node_modules/i2c-bus/src/deviceid.h b/node_modules/i2c-bus/src/deviceid.h new file mode 100644 index 0000000..d252c97 --- /dev/null +++ b/node_modules/i2c-bus/src/deviceid.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_DEVICEID_H_ +#define I2C_BUS_DEVICEID_H_ +NAN_METHOD(DeviceIdAsync); +NAN_METHOD(DeviceIdSync); +#endif // I2C_BUS_DEVICEID_H_ + diff --git a/node_modules/i2c-bus/src/i2c-dev.h b/node_modules/i2c-bus/src/i2c-dev.h new file mode 100644 index 0000000..6ecd324 --- /dev/null +++ b/node_modules/i2c-bus/src/i2c-dev.h @@ -0,0 +1,364 @@ +/* + i2c-dev.h - i2c-bus driver, char device interface + + Copyright (C) 1995-97 Simon G. Vogl + Copyright (C) 1998-99 Frodo Looijaard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301 USA. +*/ + +#ifndef _LINUX_I2C_DEV_H +#define _LINUX_I2C_DEV_H + +#include +#include +#include + + +/* -- i2c.h -- */ + + +/* + * I2C Message - used for pure i2c transaction, also from /dev interface + */ +struct i2c_msg { + __u16 addr; /* slave address */ + unsigned short flags; +#define I2C_M_TEN 0x10 /* we have a ten bit chip address */ +#define I2C_M_RD 0x01 +#define I2C_M_NOSTART 0x4000 +#define I2C_M_REV_DIR_ADDR 0x2000 +#define I2C_M_IGNORE_NAK 0x1000 +#define I2C_M_NO_RD_ACK 0x0800 + short len; /* msg length */ + char *buf; /* pointer to msg data */ +}; + +/* To determine what functionality is present */ + +#define I2C_FUNC_I2C 0x00000001 +#define I2C_FUNC_10BIT_ADDR 0x00000002 +#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */ +#define I2C_FUNC_SMBUS_PEC 0x00000008 +#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */ +#define I2C_FUNC_SMBUS_QUICK 0x00010000 +#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000 +#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000 +#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000 +#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000 +#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000 +#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000 +#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000 +#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000 +#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000 +#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */ +#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */ + +#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \ + I2C_FUNC_SMBUS_WRITE_BYTE) +#define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | \ + I2C_FUNC_SMBUS_WRITE_BYTE_DATA) +#define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | \ + I2C_FUNC_SMBUS_WRITE_WORD_DATA) +#define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | \ + I2C_FUNC_SMBUS_WRITE_BLOCK_DATA) +#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \ + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK) + +/* Old name, for compatibility */ +#define I2C_FUNC_SMBUS_HWPEC_CALC I2C_FUNC_SMBUS_PEC + +/* + * Data for SMBus Messages + */ +#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ +#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */ + /* and one more for PEC */ +}; + +/* smbus_access read or write markers */ +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +/* SMBus transaction types (size parameter in the above functions) + Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + + +/* /dev/i2c-X ioctl commands. The ioctl's parameter is always an + * unsigned long, except for: + * - I2C_FUNCS, takes pointer to an unsigned long + * - I2C_RDWR, takes pointer to struct i2c_rdwr_ioctl_data + * - I2C_SMBUS, takes pointer to struct i2c_smbus_ioctl_data + */ +#define I2C_RETRIES 0x0701 /* number of times a device address should + be polled when not acknowledging */ +#define I2C_TIMEOUT 0x0702 /* set timeout in units of 10 ms */ + +/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses + * are NOT supported! (due to code brokenness) + */ +#define I2C_SLAVE 0x0703 /* Use this slave address */ +#define I2C_SLAVE_FORCE 0x0706 /* Use this slave address, even if it + is already in use by a driver! */ +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ + +#define I2C_FUNCS 0x0705 /* Get the adapter functionality mask */ + +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */ + +#define I2C_PEC 0x0708 /* != 0 to use PEC with SMBus */ +#define I2C_SMBUS 0x0720 /* SMBus transfer */ + + +/* This is the structure as used in the I2C_SMBUS ioctl call */ +struct i2c_smbus_ioctl_data { + __u8 read_write; + __u8 command; + __u32 size; + union i2c_smbus_data *data; +}; + +/* This is the structure as used in the I2C_RDWR ioctl call */ +struct i2c_rdwr_ioctl_data { + struct i2c_msg *msgs; /* pointers to i2c_msgs */ + __u32 nmsgs; /* number of i2c_msgs */ +}; + +#define I2C_RDRW_IOCTL_MAX_MSGS 42 + + +static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, + int size, union i2c_smbus_data *data) +{ + struct i2c_smbus_ioctl_data args; + + args.read_write = read_write; + args.command = command; + args.size = size; + args.data = data; + return ioctl(file,I2C_SMBUS,&args); +} + +#define I2C_RESERVED_DEVICE_ID_ADDRESS 0x7C +#define I2C_DEVICE_ID_LENGTH 3 + +static inline __s32 i2c_smbus_deviceid(int file, __u16 address) +{ + struct i2c_rdwr_ioctl_data rdwr_data; + char out[I2C_DEVICE_ID_LENGTH]; + struct i2c_msg parts[2]; + + // dump into char and shift up to account for R/W bit + char addr = address << 1; + + // pack messages parts + parts[0].addr = I2C_RESERVED_DEVICE_ID_ADDRESS; + parts[0].flags = 0; + parts[0].len = 1; + parts[0].buf = &addr; + + parts[1].addr = I2C_RESERVED_DEVICE_ID_ADDRESS; + parts[1].flags = I2C_M_RD; + parts[1].len = I2C_DEVICE_ID_LENGTH; + parts[1].buf = out; + + rdwr_data.msgs = parts; + rdwr_data.nmsgs = 2; + + __s32 ret = ioctl(file,I2C_RDWR,&rdwr_data); + if(ret < 0) { + return -1; + } else { + // shift bytes into single 24bit int + return out[0] << 16 | out[1] << 8 | out[2]; + } +} + +static inline __s32 i2c_smbus_write_quick(int file, __u8 value) +{ + return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL); +} + +static inline __s32 i2c_smbus_read_byte(int file) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,0,I2C_SMBUS_BYTE,&data)) + return -1; + else + return 0x0FF & data.byte; +} + +static inline __s32 i2c_smbus_write_byte(int file, __u8 value) +{ + return i2c_smbus_access(file,I2C_SMBUS_WRITE,value, + I2C_SMBUS_BYTE,NULL); +} + +static inline __s32 i2c_smbus_read_byte_data(int file, __u8 command) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_BYTE_DATA,&data)) + return -1; + else + return 0x0FF & data.byte; +} + +static inline __s32 i2c_smbus_write_byte_data(int file, __u8 command, + __u8 value) +{ + union i2c_smbus_data data; + data.byte = value; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BYTE_DATA, &data); +} + +static inline __s32 i2c_smbus_read_word_data(int file, __u8 command) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_WORD_DATA,&data)) + return -1; + else + return 0x0FFFF & data.word; +} + +static inline __s32 i2c_smbus_write_word_data(int file, __u8 command, + __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_WORD_DATA, &data); +} + +static inline __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_PROC_CALL,&data)) + return -1; + else + return 0x0FFFF & data.word; +} + + +/* Returns the number of read bytes */ +static inline __s32 i2c_smbus_read_block_data(int file, __u8 command, + __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_BLOCK_DATA,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + +static inline __s32 i2c_smbus_write_block_data(int file, __u8 command, + __u8 length, const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BLOCK_DATA, &data); +} + +/* Returns the number of read bytes */ +/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you + ask for less than 32 bytes, your code will only work with kernels + 2.6.23 and later. */ +static inline __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, + __u8 length, __u8 *values) +{ + union i2c_smbus_data data; + int i; + + if (length > 32) + length = 32; + data.block[0] = length; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : + I2C_SMBUS_I2C_BLOCK_DATA,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + +static inline __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, + __u8 length, + const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_I2C_BLOCK_BROKEN, &data); +} + +/* Returns the number of read bytes */ +static inline __s32 i2c_smbus_block_process_call(int file, __u8 command, + __u8 length, __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BLOCK_PROC_CALL,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + + +#endif /* _LINUX_I2C_DEV_H */ diff --git a/node_modules/i2c-bus/src/i2c.cc b/node_modules/i2c-bus/src/i2c.cc new file mode 100644 index 0000000..b7196eb --- /dev/null +++ b/node_modules/i2c-bus/src/i2c.cc @@ -0,0 +1,113 @@ +#include +#include +#include "./i2cfuncs.h" +#include "./deviceid.h" +#include "./readbyte.h" +#include "./readword.h" +#include "./readblock.h" +#include "./readi2cblock.h" +#include "./receivebyte.h" +#include "./sendbyte.h" +#include "./setaddr.h" +#include "./writebyte.h" +#include "./writeword.h" +#include "./writeblock.h" +#include "./writei2cblock.h" +#include "./writequick.h" +#include "./i2c-dev.h" + +static void ExportInt( + Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target, + const char* name, + int value +) { + Nan::Set(target, + Nan::New(name).ToLocalChecked(), + Nan::New(value) + ); +} + +NAN_MODULE_INIT(InitAll) { + Nan::Export(target, "i2cFuncsAsync", I2cFuncsAsync); + Nan::Export(target, "i2cFuncsSync", I2cFuncsSync); + + Nan::Export(target, "deviceIdAsync", DeviceIdAsync); + Nan::Export(target, "deviceIdSync", DeviceIdSync); + + Nan::Export(target, "readByteAsync", ReadByteAsync); + Nan::Export(target, "readByteSync", ReadByteSync); + + Nan::Export(target, "readWordAsync", ReadWordAsync); + Nan::Export(target, "readWordSync", ReadWordSync); + + Nan::Export(target, "readBlockAsync", ReadBlockAsync); + Nan::Export(target, "readBlockSync", ReadBlockSync); + + Nan::Export(target, "readI2cBlockAsync", ReadI2cBlockAsync); + Nan::Export(target, "readI2cBlockSync", ReadI2cBlockSync); + + Nan::Export(target, "receiveByteAsync", ReceiveByteAsync); + Nan::Export(target, "receiveByteSync", ReceiveByteSync); + + Nan::Export(target, "sendByteAsync", SendByteAsync); + Nan::Export(target, "sendByteSync", SendByteSync); + + Nan::Export(target, "setAddrAsync", SetAddrAsync); + Nan::Export(target, "setAddrSync", SetAddrSync); + + Nan::Export(target, "writeByteAsync", WriteByteAsync); + Nan::Export(target, "writeByteSync", WriteByteSync); + + Nan::Export(target, "writeWordAsync", WriteWordAsync); + Nan::Export(target, "writeWordSync", WriteWordSync); + + Nan::Export(target, "writeBlockAsync", WriteBlockAsync); + Nan::Export(target, "writeBlockSync", WriteBlockSync); + + Nan::Export(target, "writeI2cBlockAsync", WriteI2cBlockAsync); + Nan::Export(target, "writeI2cBlockSync", WriteI2cBlockSync); + + Nan::Export(target, "writeQuickAsync", WriteQuickAsync); + Nan::Export(target, "writeQuickSync", WriteQuickSync); + + ExportInt(target, "I2C_FUNC_I2C", I2C_FUNC_I2C); + ExportInt(target, "I2C_FUNC_10BIT_ADDR", I2C_FUNC_10BIT_ADDR); + ExportInt(target, "I2C_FUNC_PROTOCOL_MANGLING", I2C_FUNC_PROTOCOL_MANGLING); + ExportInt(target, "I2C_FUNC_SMBUS_PEC", I2C_FUNC_SMBUS_PEC); + ExportInt(target, "I2C_FUNC_SMBUS_BLOCK_PROC_CALL", I2C_FUNC_SMBUS_BLOCK_PROC_CALL); + ExportInt(target, "I2C_FUNC_SMBUS_QUICK", I2C_FUNC_SMBUS_QUICK); + ExportInt(target, "I2C_FUNC_SMBUS_READ_BYTE", I2C_FUNC_SMBUS_READ_BYTE); + ExportInt(target, "I2C_FUNC_SMBUS_WRITE_BYTE", I2C_FUNC_SMBUS_WRITE_BYTE); + ExportInt(target, "I2C_FUNC_SMBUS_READ_BYTE_DATA", I2C_FUNC_SMBUS_READ_BYTE_DATA); + ExportInt(target, "I2C_FUNC_SMBUS_WRITE_BYTE_DATA", I2C_FUNC_SMBUS_WRITE_BYTE_DATA); + ExportInt(target, "I2C_FUNC_SMBUS_READ_WORD_DATA", I2C_FUNC_SMBUS_READ_WORD_DATA); + ExportInt(target, "I2C_FUNC_SMBUS_WRITE_WORD_DATA", I2C_FUNC_SMBUS_WRITE_WORD_DATA); + ExportInt(target, "I2C_FUNC_SMBUS_PROC_CALL", I2C_FUNC_SMBUS_PROC_CALL); + ExportInt(target, "I2C_FUNC_SMBUS_READ_BLOCK_DATA", I2C_FUNC_SMBUS_READ_BLOCK_DATA); + ExportInt(target, "I2C_FUNC_SMBUS_WRITE_BLOCK_DATA", I2C_FUNC_SMBUS_WRITE_BLOCK_DATA); + ExportInt(target, "I2C_FUNC_SMBUS_READ_I2C_BLOCK", I2C_FUNC_SMBUS_READ_I2C_BLOCK); + ExportInt(target, "I2C_FUNC_SMBUS_WRITE_I2C_BLOCK", I2C_FUNC_SMBUS_WRITE_I2C_BLOCK); +} + +NODE_MODULE(i2c, InitAll) + +// Hack to speed up compilation. +// Originally all the cc files included below were listed in the sources +// section of binding.gyp. Including them here rather than compiling them +// individually, which is what happens if they're listed in binding.gyp, +// reduces the build time from 36s to 15s on a BBB. +#include "./i2cfuncs.cc" +#include "./deviceid.cc" +#include "./readbyte.cc" +#include "./readword.cc" +#include "./readblock.cc" +#include "./readi2cblock.cc" +#include "./receivebyte.cc" +#include "./sendbyte.cc" +#include "./setaddr.cc" +#include "./writebyte.cc" +#include "./writeword.cc" +#include "./writeblock.cc" +#include "./writei2cblock.cc" +#include "./writequick.cc" + diff --git a/node_modules/i2c-bus/src/i2cfuncs.cc b/node_modules/i2c-bus/src/i2cfuncs.cc new file mode 100644 index 0000000..dbab2dd --- /dev/null +++ b/node_modules/i2c-bus/src/i2cfuncs.cc @@ -0,0 +1,70 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./i2cfuncs.h" +#include "./util.h" + +static __s32 I2cFuncs(int fd, unsigned long *i2cfuncs) { + return ioctl(fd, I2C_FUNCS, i2cfuncs); +} + +class I2cFuncsWorker : public I2cAsyncWorker { +public: + I2cFuncsWorker(Nan::Callback *callback, int fd) + : I2cAsyncWorker(callback), fd(fd) {} + ~I2cFuncsWorker() {} + + void Execute() { + __s32 ret = I2cFuncs(fd, &i2cfuncs); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("i2cFuncs"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null(), + Nan::New(static_cast(i2cfuncs)) + }; + + callback->Call(2, argv, async_resource); + } + +private: + int fd; + unsigned long i2cfuncs; +}; + +NAN_METHOD(I2cFuncsAsync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "i2cFuncs", + "incorrect arguments passed to i2cFuncs(int fd, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[1].As()); + + Nan::AsyncQueueWorker(new I2cFuncsWorker(callback, fd)); +} + +NAN_METHOD(I2cFuncsSync) { + if (info.Length() < 1 || !info[0]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "i2cFuncsSync", + "incorrect arguments passed to i2cFuncsSync(int fd)")); + } + + int fd = Nan::To(info[0]).FromJust(); + + unsigned long i2cfuncs; + __s32 ret = I2cFuncs(fd, &i2cfuncs); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "i2cFuncsSync", "")); + } + + info.GetReturnValue().Set(Nan::New(static_cast(i2cfuncs))); +} + diff --git a/node_modules/i2c-bus/src/i2cfuncs.h b/node_modules/i2c-bus/src/i2cfuncs.h new file mode 100644 index 0000000..1fee99d --- /dev/null +++ b/node_modules/i2c-bus/src/i2cfuncs.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_I2CFUNCS_H_ +#define I2C_BUS_I2CFUNCS_H_ +NAN_METHOD(I2cFuncsAsync); +NAN_METHOD(I2cFuncsSync); +#endif // I2C_BUS_I2CFUNCS_H_ + diff --git a/node_modules/i2c-bus/src/readblock.cc b/node_modules/i2c-bus/src/readblock.cc new file mode 100644 index 0000000..73a892c --- /dev/null +++ b/node_modules/i2c-bus/src/readblock.cc @@ -0,0 +1,117 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./readblock.h" +#include "./util.h" + +static __s32 ReadBlock(int fd, __u8 cmd, __u8 *block) { + return i2c_smbus_read_block_data(fd, cmd, block); +} + +class ReadBlockWorker : public I2cAsyncWorker { +public: + ReadBlockWorker( + Nan::Callback *callback, + int fd, + __u8 cmd, + __u8* block, + v8::Local &bufferHandle + ) : I2cAsyncWorker(callback), fd(fd), cmd(cmd), block(block), bytesRead(0) { + SaveToPersistent("buffer", bufferHandle); + } + + ~ReadBlockWorker() {} + + void Execute() { + bytesRead = ReadBlock(fd, cmd, block); + if (bytesRead == -1) { + SetErrorNo(errno); + SetErrorSyscall("readBlock"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local bufferHandle = GetFromPersistent("buffer"); + + v8::Local argv[] = { + Nan::Null(), + Nan::New(bytesRead), + bufferHandle + }; + + callback->Call(3, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __u8* block; + __s32 bytesRead; +}; + +NAN_METHOD(ReadBlockAsync) { + if (info.Length() < 4 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsObject() || + !info[3]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readBlock", + "incorrect arguments passed to readBlock" + "(int fd, int cmd, Buffer buffer, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + v8::Local bufferHandle = info[2].As(); + Nan::Callback *callback = new Nan::Callback(info[3].As()); + + __u8* bufferData = (__u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (bufferLength < 1) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readBlock", + "buffer passed to readBlock has no space for reading data")); + } + + Nan::AsyncQueueWorker(new ReadBlockWorker( + callback, + fd, + cmd, + bufferData, + bufferHandle + )); +} + +NAN_METHOD(ReadBlockSync) { + if (info.Length() < 3 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsObject()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readBlockSync", + "incorrect arguments passed to readBlockSync" + "(int fd, int cmd, Buffer buffer)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + v8::Local bufferHandle = info[2].As(); + + __u8* bufferData = (__u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (bufferLength < 1) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readBlockSync", + "buffer passed to readBlockSync has no space for reading data")); + } + + __s32 bytesRead = ReadBlock(fd, cmd, bufferData); + if (bytesRead == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "readBlockSync", "")); + } + + info.GetReturnValue().Set(Nan::New(bytesRead)); +} + diff --git a/node_modules/i2c-bus/src/readblock.h b/node_modules/i2c-bus/src/readblock.h new file mode 100644 index 0000000..e0eda98 --- /dev/null +++ b/node_modules/i2c-bus/src/readblock.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_READBLOCK_H_ +#define I2C_BUS_READBLOCK_H_ +NAN_METHOD(ReadBlockAsync); +NAN_METHOD(ReadBlockSync); +#endif // I2C_BUS_READBLOCK_H_ + diff --git a/node_modules/i2c-bus/src/readbyte.cc b/node_modules/i2c-bus/src/readbyte.cc new file mode 100644 index 0000000..82215f0 --- /dev/null +++ b/node_modules/i2c-bus/src/readbyte.cc @@ -0,0 +1,72 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./readbyte.h" +#include "./util.h" + +static __s32 ReadByte(int fd, __u8 cmd) { + return i2c_smbus_read_byte_data(fd, cmd); +} + +class ReadByteWorker : public I2cAsyncWorker { +public: + ReadByteWorker(Nan::Callback *callback, int fd, __u8 cmd) + : I2cAsyncWorker(callback), fd(fd), cmd(cmd) {} + ~ReadByteWorker() {} + + void Execute() { + byte = ReadByte(fd, cmd); + if (byte == -1) { + SetErrorNo(errno); + SetErrorSyscall("readByte"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null(), + Nan::New(byte) + }; + + callback->Call(2, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __s32 byte; +}; + +NAN_METHOD(ReadByteAsync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readByte", + "incorrect arguments passed to readByte(int fd, int cmd, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[2].As()); + + Nan::AsyncQueueWorker(new ReadByteWorker(callback, fd, cmd)); +} + +NAN_METHOD(ReadByteSync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readByteSync", + "incorrect arguments passed to readByteSync(int fd, int cmd)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + + __s32 byte = ReadByte(fd, cmd); + if (byte == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "readByteSync", "")); + } + + info.GetReturnValue().Set(Nan::New(byte)); +} + diff --git a/node_modules/i2c-bus/src/readbyte.h b/node_modules/i2c-bus/src/readbyte.h new file mode 100644 index 0000000..286834f --- /dev/null +++ b/node_modules/i2c-bus/src/readbyte.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_READBYTE_H_ +#define I2C_BUS_READBYTE_H_ +NAN_METHOD(ReadByteAsync); +NAN_METHOD(ReadByteSync); +#endif // I2C_BUS_READBYTE_H_ + diff --git a/node_modules/i2c-bus/src/readi2cblock.cc b/node_modules/i2c-bus/src/readi2cblock.cc new file mode 100644 index 0000000..0ceda32 --- /dev/null +++ b/node_modules/i2c-bus/src/readi2cblock.cc @@ -0,0 +1,134 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./readi2cblock.h" +#include "./util.h" + +static __s32 ReadI2cBlock(int fd, __u8 cmd, __u8 length, __u8 *block) { + return i2c_smbus_read_i2c_block_data(fd, cmd, length, block); +} + +class ReadI2cBlockWorker : public I2cAsyncWorker { +public: + ReadI2cBlockWorker( + Nan::Callback *callback, + int fd, + __u8 cmd, + __u32 length, + __u8* block, + v8::Local &bufferHandle + ) : I2cAsyncWorker(callback), fd(fd), cmd(cmd), length(length), block(block), bytesRead(0) { + SaveToPersistent("buffer", bufferHandle); + } + + ~ReadI2cBlockWorker() {} + + void Execute() { + bytesRead = ReadI2cBlock(fd, cmd, length, block); + if (bytesRead == -1) { + SetErrorNo(errno); + SetErrorSyscall("readI2cBlock"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local bufferHandle = GetFromPersistent("buffer"); + + v8::Local argv[] = { + Nan::Null(), + Nan::New(bytesRead), + bufferHandle + }; + + callback->Call(3, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __u32 length; + __u8* block; + __s32 bytesRead; +}; + +NAN_METHOD(ReadI2cBlockAsync) { + if (info.Length() < 5 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsUint32() || + !info[3]->IsObject() || + !info[4]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readI2cBlock", + "incorrect arguments passed to readI2cBlock" + "(int fd, int cmd, int length, Buffer buffer, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u32 length = Nan::To(info[2]).FromJust(); + v8::Local bufferHandle = info[3].As(); + Nan::Callback *callback = new Nan::Callback(info[4].As()); + + __u8* bufferData = (__u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (length > I2C_SMBUS_I2C_BLOCK_MAX) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readI2cBlock", + "readI2cBlock can't read blocks with more than 32 bytes")); + } + + if (length > bufferLength) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readI2cBlock", + "buffer passed to readI2cBlock contains less than 'length' bytes")); + } + + Nan::AsyncQueueWorker(new ReadI2cBlockWorker( + callback, + fd, + cmd, + length, + bufferData, + bufferHandle + )); +} + +NAN_METHOD(ReadI2cBlockSync) { + if (info.Length() < 4 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsUint32() || + !info[3]->IsObject()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readI2cBlockSync", + "incorrect arguments passed to readI2cBlockSync" + "(int fd, int cmd, int length, Buffer buffer)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u32 length = Nan::To(info[2]).FromJust(); + v8::Local bufferHandle = info[3].As(); + + __u8* bufferData = (__u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (length > I2C_SMBUS_I2C_BLOCK_MAX) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readI2cBlockSync", + "readI2cBlockSync can't read blocks with more than 32 bytes")); + } + + if (length > bufferLength) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readI2cBlockSync", + "buffer passed to readI2cBlockSync contains less than 'length' bytes")); + } + + __s32 bytesRead = ReadI2cBlock(fd, cmd, length, bufferData); + if (bytesRead == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "readI2cBlockSync", "")); + } + + info.GetReturnValue().Set(Nan::New(bytesRead)); +} + diff --git a/node_modules/i2c-bus/src/readi2cblock.h b/node_modules/i2c-bus/src/readi2cblock.h new file mode 100644 index 0000000..adc3403 --- /dev/null +++ b/node_modules/i2c-bus/src/readi2cblock.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_READI2CBLOCK_H_ +#define I2C_BUS_READI2CBLOCK_H_ +NAN_METHOD(ReadI2cBlockAsync); +NAN_METHOD(ReadI2cBlockSync); +#endif // I2C_BUS_READI2CBLOCK_H_ + diff --git a/node_modules/i2c-bus/src/readword.cc b/node_modules/i2c-bus/src/readword.cc new file mode 100644 index 0000000..07b7fbc --- /dev/null +++ b/node_modules/i2c-bus/src/readword.cc @@ -0,0 +1,72 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./readword.h" +#include "./util.h" + +static __s32 ReadWord(int fd, __u8 cmd) { + return i2c_smbus_read_word_data(fd, cmd); +} + +class ReadWordWorker : public I2cAsyncWorker { +public: + ReadWordWorker(Nan::Callback *callback, int fd, __u8 cmd) + : I2cAsyncWorker(callback), fd(fd), cmd(cmd) {} + ~ReadWordWorker() {} + + void Execute() { + word = ReadWord(fd, cmd); + if (word == -1) { + SetErrorNo(errno); + SetErrorSyscall("readWord"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null(), + Nan::New(word) + }; + + callback->Call(2, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __s32 word; +}; + +NAN_METHOD(ReadWordAsync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readWord", + "incorrect arguments passed to readWord(int fd, int cmd, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[2].As()); + + Nan::AsyncQueueWorker(new ReadWordWorker(callback, fd, cmd)); +} + +NAN_METHOD(ReadWordSync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "readWordSync", + "incorrect arguments passed to readWordSync(int fd, int cmd)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + + __s32 word = ReadWord(fd, cmd); + if (word == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "readWordSync", "")); + } + + info.GetReturnValue().Set(Nan::New(word)); +} + diff --git a/node_modules/i2c-bus/src/readword.h b/node_modules/i2c-bus/src/readword.h new file mode 100644 index 0000000..6d1427b --- /dev/null +++ b/node_modules/i2c-bus/src/readword.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_READWORD_H_ +#define I2C_BUS_READWORD_H_ +NAN_METHOD(ReadWordAsync); +NAN_METHOD(ReadWordSync); +#endif // I2C_BUS_READWORD_H_ + diff --git a/node_modules/i2c-bus/src/receivebyte.cc b/node_modules/i2c-bus/src/receivebyte.cc new file mode 100644 index 0000000..6967ef9 --- /dev/null +++ b/node_modules/i2c-bus/src/receivebyte.cc @@ -0,0 +1,69 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./receivebyte.h" +#include "./util.h" + +static __s32 ReceiveByte(int fd) { + return i2c_smbus_read_byte(fd); +} + +class ReceiveByteWorker : public I2cAsyncWorker { +public: + ReceiveByteWorker(Nan::Callback *callback, int fd) + : I2cAsyncWorker(callback), fd(fd) {} + ~ReceiveByteWorker() {} + + void Execute() { + byte = ReceiveByte(fd); + if (byte == -1) { + SetErrorNo(errno); + SetErrorSyscall("receiveByte"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null(), + Nan::New(byte) + }; + + callback->Call(2, argv, async_resource); + } + +private: + int fd; + __s32 byte; +}; + +NAN_METHOD(ReceiveByteAsync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "receiveByte", + "incorrect arguments passed to receiveByte(int fd, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[1].As()); + + Nan::AsyncQueueWorker(new ReceiveByteWorker(callback, fd)); +} + +NAN_METHOD(ReceiveByteSync) { + if (info.Length() < 1 || !info[0]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "receiveByteSync", + "incorrect arguments passed to receiveByteSync(int fd)")); + } + + int fd = Nan::To(info[0]).FromJust(); + + __s32 byte = ReceiveByte(fd); + if (byte == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "receiveByteSync", "")); + } + + info.GetReturnValue().Set(Nan::New(byte)); +} + diff --git a/node_modules/i2c-bus/src/receivebyte.h b/node_modules/i2c-bus/src/receivebyte.h new file mode 100644 index 0000000..cd736d3 --- /dev/null +++ b/node_modules/i2c-bus/src/receivebyte.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_RECEIVEBYTE_H_ +#define I2C_BUS_RECEIVEBYTE_H_ +NAN_METHOD(ReceiveByteAsync); +NAN_METHOD(ReceiveByteSync); +#endif // I2C_BUS_RECEIVEBYTE_H_ + diff --git a/node_modules/i2c-bus/src/sendbyte.cc b/node_modules/i2c-bus/src/sendbyte.cc new file mode 100644 index 0000000..477e9e1 --- /dev/null +++ b/node_modules/i2c-bus/src/sendbyte.cc @@ -0,0 +1,68 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./sendbyte.h" +#include "./util.h" + +static __s32 SendByte(int fd, __u8 byte) { + return i2c_smbus_write_byte(fd, byte); +} + +class SendByteWorker : public I2cAsyncWorker { +public: + SendByteWorker(Nan::Callback *callback, int fd, __u8 byte) + : I2cAsyncWorker(callback), fd(fd), byte(byte) {} + ~SendByteWorker() {} + + void Execute() { + __s32 ret = SendByte(fd, byte); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("sendByte"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null() + }; + + callback->Call(1, argv, async_resource); + } + +private: + int fd; + __u8 byte; +}; + +NAN_METHOD(SendByteAsync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "sendByte", + "incorrect arguments passed to sendByte(int fd, int byte, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 byte = Nan::To(info[1]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[2].As()); + + Nan::AsyncQueueWorker(new SendByteWorker(callback, fd, byte)); +} + +NAN_METHOD(SendByteSync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "sendByteSync", + "incorrect arguments passed to sendByteSync(int fd, int byte)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 byte = Nan::To(info[1]).FromJust(); + + __s32 ret = SendByte(fd, byte); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "sendByteSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/sendbyte.h b/node_modules/i2c-bus/src/sendbyte.h new file mode 100644 index 0000000..1897ae0 --- /dev/null +++ b/node_modules/i2c-bus/src/sendbyte.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_SENDBYTE_H_ +#define I2C_BUS_SENDBYTE_H_ +NAN_METHOD(SendByteAsync); +NAN_METHOD(SendByteSync); +#endif // I2C_BUS_SENDBYTE_H_ + diff --git a/node_modules/i2c-bus/src/setaddr.cc b/node_modules/i2c-bus/src/setaddr.cc new file mode 100644 index 0000000..a170550 --- /dev/null +++ b/node_modules/i2c-bus/src/setaddr.cc @@ -0,0 +1,69 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./setaddr.h" +#include "./util.h" + +static int SetAddr(int fd, int addr, bool forceAccess) { + return ioctl(fd, forceAccess ? I2C_SLAVE_FORCE : I2C_SLAVE, addr); +} + +class SetAddrWorker : public I2cAsyncWorker { +public: + SetAddrWorker(Nan::Callback *callback, int fd, int addr, bool forceAccess) + : I2cAsyncWorker(callback), fd(fd), addr(addr), forceAccess(forceAccess) {} + ~SetAddrWorker() {} + + void Execute() { + if (SetAddr(fd, addr, forceAccess) == -1) { + SetErrorNo(errno); + SetErrorSyscall("setAddr"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null() + }; + + callback->Call(1, argv, async_resource); + } + +private: + int fd; + int addr; + bool forceAccess; +}; + +NAN_METHOD(SetAddrAsync) { + if (info.Length() < 4 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsBoolean() || !info[3]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "setAddr", + "incorrect arguments passed to setAddr(int fd, int addr, bool forceAccess, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + int addr = Nan::To(info[1]).FromJust(); + bool forceAccess = Nan::To(info[2]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[3].As()); + + Nan::AsyncQueueWorker(new SetAddrWorker(callback, fd, addr, forceAccess)); +} + +NAN_METHOD(SetAddrSync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsBoolean()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "setAddrSync", + "incorrect arguments passed to setAddrSync(int fd, int addr, bool forceAccess)")); + } + + int fd = Nan::To(info[0]).FromJust(); + int addr = Nan::To(info[1]).FromJust(); + bool forceAccess = Nan::To(info[2]).FromJust(); + + if (SetAddr(fd, addr, forceAccess) != 0) { + return Nan::ThrowError(Nan::ErrnoException(errno, "setAddrSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/setaddr.h b/node_modules/i2c-bus/src/setaddr.h new file mode 100644 index 0000000..e1e3f12 --- /dev/null +++ b/node_modules/i2c-bus/src/setaddr.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_SETADDR_H_ +#define I2C_BUS_SETADDR_H_ +NAN_METHOD(SetAddrAsync); +NAN_METHOD(SetAddrSync); +#endif // I2C_BUS_SETADDR_H_ + diff --git a/node_modules/i2c-bus/src/util.h b/node_modules/i2c-bus/src/util.h new file mode 100644 index 0000000..e9f5bcf --- /dev/null +++ b/node_modules/i2c-bus/src/util.h @@ -0,0 +1,67 @@ +#ifndef I2C_BUS_UTIL_H_ +#define I2C_BUS_UTIL_H_ + +class I2cAsyncWorker : public Nan::AsyncWorker { +public: + explicit I2cAsyncWorker(Nan::Callback *callback) + : Nan::AsyncWorker(callback), errorNo_(0), errorSyscall_(0) {} + + virtual ~I2cAsyncWorker() { + if (errorSyscall_) { + delete[] errorSyscall_; + } + } + + virtual void WorkComplete() { + Nan::HandleScope scope; + + if (errorNo_ == 0) { + HandleOKCallback(); + } else { + HandleErrorCallback(); + } + + delete callback; + callback = 0; + } + +protected: + virtual void HandleErrorCallback() { + Nan::HandleScope scope; + + v8::Local argv[1] = { + Nan::ErrnoException(ErrorNo(), ErrorSyscall(), "") + }; + + callback->Call(1, argv, async_resource); + } + + void SetErrorNo(int errorNo) { + errorNo_ = errorNo; + } + + int ErrorNo() { + return errorNo_; + } + + void SetErrorSyscall(const char *errorSyscall) { + if (errorSyscall_) { + delete[] errorSyscall_; + } + + size_t size = strlen(errorSyscall) + 1; + errorSyscall_ = new char[size]; + memcpy(errorSyscall_, errorSyscall, size); + } + + const char *ErrorSyscall() { + return errorSyscall_; + } + +private: + int errorNo_; + char *errorSyscall_; +}; + +#endif // I2C_BUS_UTIL_H_ + diff --git a/node_modules/i2c-bus/src/writeblock.cc b/node_modules/i2c-bus/src/writeblock.cc new file mode 100644 index 0000000..66d327f --- /dev/null +++ b/node_modules/i2c-bus/src/writeblock.cc @@ -0,0 +1,133 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./writeblock.h" +#include "./util.h" + +#include + +static __s32 WriteBlock(int fd, __u8 cmd, __u8 length, const __u8 *block) { + return i2c_smbus_write_block_data(fd, cmd, length, block); +} + +class WriteBlockWorker : public I2cAsyncWorker { +public: + WriteBlockWorker( + Nan::Callback *callback, + int fd, + __u8 cmd, + __u32 length, + const __u8* block, + v8::Local &bufferHandle + ) : I2cAsyncWorker(callback), fd(fd), cmd(cmd), length(length), block(block) { + SaveToPersistent("buffer", bufferHandle); + } + + ~WriteBlockWorker() {} + + void Execute() { + __s32 ret = WriteBlock(fd, cmd, length, block); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("writeBlock"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local bufferHandle = GetFromPersistent("buffer"); + + v8::Local argv[] = { + Nan::Null(), + Nan::New(length), + bufferHandle + }; + + callback->Call(3, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __u32 length; + const __u8* block; +}; + +NAN_METHOD(WriteBlockAsync) { + if (info.Length() < 5 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsUint32() || + !info[3]->IsObject() || + !info[4]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeBlock", + "incorrect arguments passed to writeBlock" + "(int fd, int cmd, int length, Buffer buffer, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u32 length = Nan::To(info[2]).FromJust(); + v8::Local bufferHandle = info[3].As(); + Nan::Callback *callback = new Nan::Callback(info[4].As()); + + const __u8* bufferData = (const __u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (length > I2C_SMBUS_I2C_BLOCK_MAX) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeBlock", + "writeBlock can't write blocks with more than 32 bytes")); + } + + if (length > bufferLength) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeBlock", + "buffer passed to writeBlock contains less than 'length' bytes")); + } + + Nan::AsyncQueueWorker(new WriteBlockWorker( + callback, + fd, + cmd, + length, + bufferData, + bufferHandle + )); +} + +NAN_METHOD(WriteBlockSync) { + if (info.Length() < 4 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsUint32() || + !info[3]->IsObject()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeBlockSync", + "incorrect arguments passed to writeBlockSync" + "(int fd, int cmd, int length, Buffer buffer)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u32 length = Nan::To(info[2]).FromJust(); + v8::Local bufferHandle = info[3].As(); + + const __u8* bufferData = (const __u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (length > I2C_SMBUS_I2C_BLOCK_MAX) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeBlockSync", + "writeBlockSync can't write blocks with more than 32 bytes")); + } + + if (length > bufferLength) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeBlockSync", + "buffer passed to writeBlockSync contains less than 'length' bytes")); + } + + __s32 ret = WriteBlock(fd, cmd, length, bufferData); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "writeBlockSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/writeblock.h b/node_modules/i2c-bus/src/writeblock.h new file mode 100644 index 0000000..5f348e7 --- /dev/null +++ b/node_modules/i2c-bus/src/writeblock.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_WRITEBLOCK_H_ +#define I2C_BUS_WRITEBLOCK_H_ +NAN_METHOD(WriteBlockAsync); +NAN_METHOD(WriteBlockSync); +#endif // I2C_BUS_WRITEBLOCK_H_ + diff --git a/node_modules/i2c-bus/src/writebyte.cc b/node_modules/i2c-bus/src/writebyte.cc new file mode 100644 index 0000000..c11560f --- /dev/null +++ b/node_modules/i2c-bus/src/writebyte.cc @@ -0,0 +1,72 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./writebyte.h" +#include "./util.h" + +static __s32 WriteByte(int fd, __u8 cmd, __u8 byte) { + return i2c_smbus_write_byte_data(fd, cmd, byte); +} + +class WriteByteWorker : public I2cAsyncWorker { +public: + WriteByteWorker(Nan::Callback *callback, int fd, __u8 cmd, __u8 byte) + : I2cAsyncWorker(callback), fd(fd), cmd(cmd), byte(byte) {} + ~WriteByteWorker() {} + + void Execute() { + __s32 ret = WriteByte(fd, cmd, byte); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("writeByte"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null() + }; + + callback->Call(1, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __u8 byte; +}; + +NAN_METHOD(WriteByteAsync) { + if (info.Length() < 4 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsInt32() || !info[3]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeByte", + "incorrect arguments passed to writeByte" + "(int fd, int cmd, int byte, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u8 byte = Nan::To(info[2]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[3].As()); + + Nan::AsyncQueueWorker(new WriteByteWorker(callback, fd, cmd, byte)); +} + +NAN_METHOD(WriteByteSync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeByteSync", + "incorrect arguments passed to writeByteSync(int fd, int cmd, int byte)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u8 byte = Nan::To(info[2]).FromJust(); + + __s32 ret = WriteByte(fd, cmd, byte); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "writeByteSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/writebyte.h b/node_modules/i2c-bus/src/writebyte.h new file mode 100644 index 0000000..f809fa9 --- /dev/null +++ b/node_modules/i2c-bus/src/writebyte.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_WRITEBYTE_H_ +#define I2C_BUS_WRITEBYTE_H_ +NAN_METHOD(WriteByteAsync); +NAN_METHOD(WriteByteSync); +#endif // I2C_BUS_WRITEBYTE_H_ + diff --git a/node_modules/i2c-bus/src/writei2cblock.cc b/node_modules/i2c-bus/src/writei2cblock.cc new file mode 100644 index 0000000..bf6e3ea --- /dev/null +++ b/node_modules/i2c-bus/src/writei2cblock.cc @@ -0,0 +1,131 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./writei2cblock.h" +#include "./util.h" + +static __s32 WriteI2cBlock(int fd, __u8 cmd, __u8 length, const __u8 *block) { + return i2c_smbus_write_i2c_block_data(fd, cmd, length, block); +} + +class WriteI2cBlockWorker : public I2cAsyncWorker { +public: + WriteI2cBlockWorker( + Nan::Callback *callback, + int fd, + __u8 cmd, + __u32 length, + const __u8* block, + v8::Local &bufferHandle + ) : I2cAsyncWorker(callback), fd(fd), cmd(cmd), length(length), block(block) { + SaveToPersistent("buffer", bufferHandle); + } + + ~WriteI2cBlockWorker() {} + + void Execute() { + __s32 ret = WriteI2cBlock(fd, cmd, length, block); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("writeI2cBlock"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local bufferHandle = GetFromPersistent("buffer"); + + v8::Local argv[] = { + Nan::Null(), + Nan::New(length), + bufferHandle + }; + + callback->Call(3, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __u32 length; + const __u8* block; +}; + +NAN_METHOD(WriteI2cBlockAsync) { + if (info.Length() < 5 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsUint32() || + !info[3]->IsObject() || + !info[4]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeI2cBlock", + "incorrect arguments passed to writeI2cBlock" + "(int fd, int cmd, int length, Buffer buffer, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u32 length = Nan::To(info[2]).FromJust(); + v8::Local bufferHandle = info[3].As(); + Nan::Callback *callback = new Nan::Callback(info[4].As()); + + const __u8* bufferData = (const __u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (length > I2C_SMBUS_I2C_BLOCK_MAX) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeI2cBlock", + "writeI2cBlock can't write blocks with more than 32 bytes")); + } + + if (length > bufferLength) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeI2cBlock", + "buffer passed to writeI2cBlock contains less than 'length' bytes")); + } + + Nan::AsyncQueueWorker(new WriteI2cBlockWorker( + callback, + fd, + cmd, + length, + bufferData, + bufferHandle + )); +} + +NAN_METHOD(WriteI2cBlockSync) { + if (info.Length() < 4 || + !info[0]->IsInt32() || + !info[1]->IsInt32() || + !info[2]->IsUint32() || + !info[3]->IsObject()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeI2cBlockSync", + "incorrect arguments passed to writeI2cBlockSync" + "(int fd, int cmd, int length, Buffer buffer)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u32 length = Nan::To(info[2]).FromJust(); + v8::Local bufferHandle = info[3].As(); + + const __u8* bufferData = (const __u8*) node::Buffer::Data(bufferHandle); + size_t bufferLength = node::Buffer::Length(bufferHandle); + + if (length > I2C_SMBUS_I2C_BLOCK_MAX) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeI2cBlockSync", + "writeI2cBlockSync can't write blocks with more than 32 bytes")); + } + + if (length > bufferLength) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeI2cBlockSync", + "buffer passed to writeI2cBlockSync contains less than 'length' bytes")); + } + + __s32 ret = WriteI2cBlock(fd, cmd, length, bufferData); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "writeI2cBlockSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/writei2cblock.h b/node_modules/i2c-bus/src/writei2cblock.h new file mode 100644 index 0000000..49a1ed4 --- /dev/null +++ b/node_modules/i2c-bus/src/writei2cblock.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_WRITEI2CBLOCK_H_ +#define I2C_BUS_WRITEI2CBLOCK_H_ +NAN_METHOD(WriteI2cBlockAsync); +NAN_METHOD(WriteI2cBlockSync); +#endif // I2C_BUS_WRITEI2CBLOCK_H_ + diff --git a/node_modules/i2c-bus/src/writequick.cc b/node_modules/i2c-bus/src/writequick.cc new file mode 100644 index 0000000..4cdbce9 --- /dev/null +++ b/node_modules/i2c-bus/src/writequick.cc @@ -0,0 +1,68 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./writequick.h" +#include "./util.h" + +static __s32 WriteQuick(int fd, __u8 bit) { + return i2c_smbus_write_quick(fd, bit); +} + +class WriteQuickWorker : public I2cAsyncWorker { +public: + WriteQuickWorker(Nan::Callback *callback, int fd, __u8 bit) + : I2cAsyncWorker(callback), fd(fd), bit(bit) {} + ~WriteQuickWorker() {} + + void Execute() { + __s32 ret = WriteQuick(fd, bit); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("writeQuick"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null() + }; + + callback->Call(1, argv, async_resource); + } + +private: + int fd; + __u8 bit; +}; + +NAN_METHOD(WriteQuickAsync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeQuick", + "incorrect arguments passed to writeQuick(int fd, int bit, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 bit = Nan::To(info[1]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[2].As()); + + Nan::AsyncQueueWorker(new WriteQuickWorker(callback, fd, bit)); +} + +NAN_METHOD(WriteQuickSync) { + if (info.Length() < 2 || !info[0]->IsInt32() || !info[1]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeQuickSync", + "incorrect arguments passed to writeQuickSync(int fd, int bit)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 bit = Nan::To(info[1]).FromJust(); + + __s32 ret = WriteQuick(fd, bit); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "writeQuickSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/writequick.h b/node_modules/i2c-bus/src/writequick.h new file mode 100644 index 0000000..f6b2b93 --- /dev/null +++ b/node_modules/i2c-bus/src/writequick.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_WRITEQUICK_H_ +#define I2C_BUS_WRITEQUICK_H_ +NAN_METHOD(WriteQuickAsync); +NAN_METHOD(WriteQuickSync); +#endif // I2C_BUS_WRITEQUICK_H_ + diff --git a/node_modules/i2c-bus/src/writeword.cc b/node_modules/i2c-bus/src/writeword.cc new file mode 100644 index 0000000..ba1ca48 --- /dev/null +++ b/node_modules/i2c-bus/src/writeword.cc @@ -0,0 +1,73 @@ +#include +#include +#include +#include "./i2c-dev.h" +#include "./writeword.h" +#include "./util.h" + +static __s32 WriteWord(int fd, __u8 cmd, __u16 word) { + return i2c_smbus_write_word_data(fd, cmd, word); +} + +class WriteWordWorker : public I2cAsyncWorker { +public: + WriteWordWorker(Nan::Callback *callback, int fd, __u8 cmd, __u16 word) + : I2cAsyncWorker(callback), fd(fd), cmd(cmd), word(word) {} + ~WriteWordWorker() {} + + void Execute() { + __s32 ret = WriteWord(fd, cmd, word); + if (ret == -1) { + SetErrorNo(errno); + SetErrorSyscall("writeWord"); + } + } + + void HandleOKCallback() { + Nan::HandleScope scope; + + v8::Local argv[] = { + Nan::Null() + }; + + callback->Call(1, argv, async_resource); + } + +private: + int fd; + __u8 cmd; + __u16 word; +}; + +NAN_METHOD(WriteWordAsync) { + if (info.Length() < 4 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsInt32() || !info[3]->IsFunction()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeWord", + "incorrect arguments passed to writeWord" + "(int fd, int cmd, int word, function cb)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u16 word = Nan::To(info[2]).FromJust(); + Nan::Callback *callback = new Nan::Callback(info[3].As()); + + Nan::AsyncQueueWorker(new WriteWordWorker(callback, fd, cmd, word)); +} + +NAN_METHOD(WriteWordSync) { + if (info.Length() < 3 || !info[0]->IsInt32() || !info[1]->IsInt32() || !info[2]->IsInt32()) { + return Nan::ThrowError(Nan::ErrnoException(EINVAL, "writeWordSync", + "incorrect arguments passed to writeWordSync" + "(int fd, int cmd, int word)")); + } + + int fd = Nan::To(info[0]).FromJust(); + __u8 cmd = Nan::To(info[1]).FromJust(); + __u16 word = Nan::To(info[2]).FromJust(); + + __s32 ret = WriteWord(fd, cmd, word); + if (ret == -1) { + return Nan::ThrowError(Nan::ErrnoException(errno, "writeWordSync", "")); + } +} + diff --git a/node_modules/i2c-bus/src/writeword.h b/node_modules/i2c-bus/src/writeword.h new file mode 100644 index 0000000..fac793b --- /dev/null +++ b/node_modules/i2c-bus/src/writeword.h @@ -0,0 +1,6 @@ +#ifndef I2C_BUS_WRITEWORD_H_ +#define I2C_BUS_WRITEWORD_H_ +NAN_METHOD(WriteWordAsync); +NAN_METHOD(WriteWordSync); +#endif // I2C_BUS_WRITEWORD_H_ + diff --git a/node_modules/nan/.github/workflows/ci.yml b/node_modules/nan/.github/workflows/ci.yml new file mode 100644 index 0000000..4481a6e --- /dev/null +++ b/node_modules/nan/.github/workflows/ci.yml @@ -0,0 +1,52 @@ +# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs +# https://github.com/actions/setup-node +# https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories + +name: ci +on: + push: + # branches: [main] + pull_request: + # branches: [main] + workflow_dispatch: +permissions: + contents: read +jobs: + ci: + strategy: + fail-fast: false + matrix: # TODO: Enable 23.x after nodejs/nan#979 or similar. + node-version: [22.x, 21.x, 20.x, 19.x, 18.x, 17.x, 16.x] + os: [windows-latest] + include: + - node-version: lts/* + os: macos-13 # macOS on Intel + - node-version: lts/* + os: macos-latest # macOS on arm64 + - node-version: lts/* + os: ubuntu-latest # Linux on x64 + - node-version: lts/* + os: ubuntu-24.04-arm # Linux on arm64 + - node-version: lts/* + os: windows-2025 + - node-version: 14.x + os: windows-2019 + - node-version: 12.x + os: windows-2019 + - node-version: 10.x + os: windows-2019 + - node-version: 8.x + os: windows-2019 + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + # TODO: On Windows Node.js v11 these will fail but `make test` will succeed + - if: matrix.node-version != '11.x' + run: | + npm run-script rebuild-tests + npm test + - run: make test diff --git a/node_modules/nan/CHANGELOG.md b/node_modules/nan/CHANGELOG.md new file mode 100644 index 0000000..56f187c --- /dev/null +++ b/node_modules/nan/CHANGELOG.md @@ -0,0 +1,577 @@ +# NAN ChangeLog + +**Version 2.22.2: current Node 22.14.0, Node 0.12: 0.12.18, Node 0.10: 0.10.48, iojs: 3.3.1** + +### 2.22.2 Feb 26 2025 + + - Bugfix: Fix version guard for `ScriptOrigin` constructors (#989) 053239d73702ac11fa0c3c438f85c1409f960f89 + +### 2.22.1 Feb 21 2025 + + - Build: Fix compatibility with Python >= 3.12 (#987) b5d90f15730b620fb6cc4fed079674740424539a + +### 2.22.0 Oct 11 2024 + + - Feature: replace SetAccessor -> SetNativeDataProperty (#977) 6bd62c9a0004339d5d1e18a945c84929d0f6b808 + +### 2.21.0 Oct 10 2024 + + - Feature: Support for node version 20.17.0 (#976) a7df36eda8a7fe8581c00a18590f5e4faafca7ae + +### 2.20.0 Jun 12 2024 + + - Feature: fix removal of v8::CopyablePersistent (#970) 5805ca5c4c2eef9a65316b68741e29f4825c511f + +### 2.19.0 Mar 6 2024 + + - Feature: Fix builds for Electron 29 (#966) 1b630ddb3412cde35b64513662b440f9fd71e1ff + +### 2.18.0 Sep 12 2023 + + - Feature: Cast v8::Object::GetInternalField() return value to v8::Value (#956) bdfee1788239f735b67fe6b46b1439da755e9b62 + +### 2.17.0 Oct 10 2022 + + - Feature: overload deprecated AccessorSignatures (#943) 7f9ceb80fbc45c9ba1a10e6591ccbef9e8dee6b4 + +### 2.16.0 May 25 2022 + + - Feature: Add support for Node 18 (#937) 16fa32231e2ccd89d2804b3f765319128b20c4ac + +### 2.15.0 Aug 4 2021 + + - Feature: add ScriptOrigin (#918) d09debf9eeedcb7ca4073e84ffe5fbb455ecb709 + +### 2.14.2 Oct 13 2020 + + - Bugfix: fix gcc 8 function cast warning (#899) 35f0fab205574b2cbda04e6347c8b2db755e124f + +### 2.14.1 Apr 21 2020 + + - Bugfix: use GetBackingStore() instead of GetContents() (#888) 2c023bd447661a61071da318b0ff4003c3858d39 + +### 2.14.0 May 16 2019 + + - Feature: Add missing methods to Nan::Maybe (#852) 4e962489fb84a184035b9fa74f245f650249aca6 + +### 2.13.2 Mar 24 2019 + + - Bugfix: remove usage of deprecated `IsNearDeath` (#842) fbaf42252af279c3d867c6b193571f9711c39847 + +### 2.13.1 Mar 14 2019 + + - Bugfix: check V8 version directly instead of inferring from NMV (#840) 12f9df9f393285de8fb4a8cd01478dc4fe3b089d + +### 2.13.0 Mar 13 2019 + + - Feature: add support for node master (#831) 113c0282072e7ff4f9dfc98b432fd894b798c2c + +### 2.12.1 Dec 18 2018 + + - Bugfix: Fix build breakage with Node.js 10.0.0-10.9.0. (#833) 625e90e8fef8d39ffa7247250a76a100b2487474 + +### 2.12.0 Dec 16 2018 + + - Bugfix: Add scope.Escape() to Call() (#817) 2e5ed4fc3a8ac80a6ef1f2a55099ab3ac8800dc6 + - Bugfix: Fix Node.js v10.12.0 deprecation warnings. 509859cc23b1770376b56550a027840a2ce0f73d + - Feature: Allow SetWeak() for non-object persistent handles. (#824) e6ef6a48e7e671fe3e4b7dddaa8912a3f8262ecd + +### 2.11.1 Sep 29 2018 + + - Fix: adapt to V8 7.0 24a22c3b25eeeec2016c6ec239bdd6169e985447 + +### 2.11.0 Aug 25 2018 + + - Removal: remove `FunctionCallbackInfo::Callee` for nodejs `>= 10` 1a56c0a6efd4fac944cb46c30912a8e023bda7d4 + - Bugfix: Fix `AsyncProgressWorkerBase::WorkProgress` sends invalid data b0c764d1dab11e9f8b37ffb81e2560a4498aad5e + - Feature: Introduce `GetCurrentEventLoop` b4911b0bb1f6d47d860e10ec014d941c51efac5e + - Feature: Add `NAN_MODULE_WORKER_ENABLED` macro as a replacement for `NAN_MODULE` b058fb047d18a58250e66ae831444441c1f2ac7a + +### 2.10.0 Mar 16 2018 + + - Deprecation: Deprecate `MakeCallback` 5e92b19a59e194241d6a658bd6ff7bfbda372950 + - Feature: add `Nan::Call` overload 4482e1242fe124d166fc1a5b2be3c1cc849fe452 + - Feature: add more `Nan::Call` overloads 8584e63e6d04c7d2eb8c4a664e4ef57d70bf672b + - Feature: Fix deprecation warnings for Node 10 1caf258243b0602ed56922bde74f1c91b0cbcb6a + +### 2.9.2 Feb 22 2018 + + - Bugfix: Bandaid for async hooks 212bd2f849be14ef1b02fc85010b053daa24252b + +### 2.9.1 Feb 22 2018 + + - Bugfix: Avoid deprecation warnings in deprecated `Nan::Callback::operator()` 372b14d91289df4604b0f81780709708c45a9aa4 + - Bugfix: Avoid deprecation warnings in `Nan::JSON` 3bc294bce0b7d0a3ee4559926303e5ed4866fda2 + +### 2.9.0 Feb 22 2018 + + - Deprecation: Deprecate legacy `Callback::Call` 6dd5fa690af61ca3523004b433304c581b3ea309 + - Feature: introduce `AsyncResource` class 90c0a179c0d8cb5fd26f1a7d2b1d6231eb402d48o + - Feature: Add context aware `Nan::Callback::Call` functions 7169e09fb088418b6e388222e88b4c13f07ebaee + - Feature: Make `AsyncWorker` context aware 066ba21a6fb9e2b5230c9ed3a6fc51f1211736a4 + - Feature: add `Callback` overload to `Nan::Call` 5328daf66e202658c1dc0d916c3aaba99b3cc606 + - Bugfix: fix warning: suggest parentheses around `&&` within `||` b2bb63d68b8ae623a526b542764e1ac82319cb2c + - Bugfix: Fix compilation on io.js 3 d06114dba0a522fb436f0c5f47b994210968cd7b + +### 2.8.0 Nov 15 2017 + + - Deprecation: Deprecate `Nan::ForceSet` in favor of `Nan::DefineOwnProperty()` 95cbb976d6fbbba88ba0f86dd188223a8591b4e7 + - Feature: Add `Nan::AsyncProgressQueueWorker` a976636ecc2ef617d1b061ce4a6edf39923691cb + - Feature: Add `Nan::DefineOwnProperty()` 95cbb976d6fbbba88ba0f86dd188223a8591b4e7 + - Bugfix: Fix compiling on io.js 1 & 2 82705a64503ce60c62e98df5bd02972bba090900 + - Bugfix: Use DefineOwnProperty instead of ForceSet 95cbb976d6fbbba88ba0f86dd188223a8591b4e7 + +### 2.7.0 Aug 30 2017 + + - Feature: Add `Nan::To()` overload. b93280670c9f6da42ed4cf6cbf085ffdd87bd65b + - Bugfix: Fix ternary in `Nan::MaybeLocal::FromMaybe()`. 79a26f7d362e756a9524e672a82c3d603b542867 + +### 2.6.2 Apr 12 2017 + + - Bugfix: Fix v8::JSON::Parse() deprecation warning. 87f6a3c65815fa062296a994cc863e2fa124867d + +### 2.6.1 Apr 6 2017 + + - Bugfix: nan_json.h: fix build breakage in Node 6 ac8d47dc3c10bfbf3f15a6b951633120c0ee6d51 + +### 2.6.0 Apr 6 2017 + + - Feature: nan: add support for JSON::Parse & Stringify b533226c629cce70e1932a873bb6f849044a56c5 + +### 2.5.1 Jan 23 2017 + + - Bugfix: Fix disappearing handle for private value 6a80995694f162ef63dbc9948fbefd45d4485aa0 + - Bugfix: Add missing scopes a93b8bae6bc7d32a170db6e89228b7f60ee57112 + - Bugfix: Use string::data instead of string::front in NewOneByteString d5f920371e67e1f3b268295daee6e83af86b6e50 + +### 2.5.0 Dec 21 2016 + + - Feature: Support Private accessors a86255cb357e8ad8ccbf1f6a4a901c921e39a178 + - Bugfix: Abort in delete operators that shouldn't be called 0fe38215ff8581703967dfd26c12793feb960018 + +### 2.4.0 Jul 10 2016 + + - Feature: Rewrite Callback to add Callback::Reset c4cf44d61f8275cd5f7b0c911d7a806d4004f649 + - Feature: AsyncProgressWorker: add template types for .send 1242c9a11a7ed481c8f08ec06316385cacc513d0 + - Bugfix: Add constness to old Persistent comparison operators bd43cb9982c7639605d60fd073efe8cae165d9b2 + +### 2.3.5 May 31 2016 + + - Bugfix: Replace NAN_INLINE with 'inline' keyword. 71819d8725f822990f439479c9aba3b240804909 + +### 2.3.4 May 31 2016 + + - Bugfix: Remove V8 deprecation warnings 0592fb0a47f3a1c7763087ebea8e1138829f24f9 + - Bugfix: Fix new versions not to use WeakCallbackInfo::IsFirstPass 615c19d9e03d4be2049c10db0151edbc3b229246 + - Bugfix: Make ObjectWrap::handle() const d19af99595587fe7a26bd850af6595c2a7145afc + - Bugfix: Fix compilation errors related to 0592fb0a47f3a1c7763087ebea8e1138829f24f9 e9191c525b94f652718325e28610a1adcf90fed8 + +### 2.3.3 May 4 2016 + + - Bugfix: Refactor SetMethod() to deal with v8::Templates (#566) b9083cf6d5de6ebe6bcb49c7502fbb7c0d9ddda8 + +### 2.3.2 Apr 27 2016 + + - Bugfix: Fix compilation on outdated versions due to Handle removal f8b7c875d04d425a41dfd4f3f8345bc3a11e6c52 + +### 2.3.1 Apr 27 2016 + + - Bugfix: Don't use deprecated v8::Template::Set() in SetMethod a90951e9ea70fa1b3836af4b925322919159100e + +### 2.3.0 Apr 27 2016 + + - Feature: added Signal() for invoking async callbacks without sending data from AsyncProgressWorker d8adba45f20e077d00561b20199133620c990b38 + - Bugfix: Don't use deprecated v8::Template::Set() 00dacf0a4b86027415867fa7f1059acc499dcece + +### 2.2.1 Mar 29 2016 + + - Bugfix: Use NewFromUnsigned in ReturnValue::Set(uint32_t i) for pre_12 3a18f9bdce29826e0e4c217854bc476918241a58 + - Performance: Remove unneeeded nullptr checks b715ef44887931c94f0d1605b3b1a4156eebece9 + +### 2.2.0 Jan 9 2016 + + - Feature: Add Function::Call wrapper 4c157474dacf284d125c324177b45aa5dabc08c6 + - Feature: Rename GC*logueCallback to GCCallback for > 4.0 3603435109f981606d300eb88004ca101283acec + - Bugfix: Fix Global::Pass for old versions 367e82a60fbaa52716232cc89db1cc3f685d77d9 + - Bugfix: Remove weird MaybeLocal wrapping of what already is a MaybeLocal 23b4590db10c2ba66aee2338aebe9751c4cb190b + +### 2.1.0 Oct 8 2015 + + - Deprecation: Deprecate NanErrnoException in favor of ErrnoException 0af1ca4cf8b3f0f65ed31bc63a663ab3319da55c + - Feature: added helper class for accessing contents of typedarrays 17b51294c801e534479d5463697a73462d0ca555 + - Feature: [Maybe types] Add MakeMaybe(...) 48d7b53d9702b0c7a060e69ea10fea8fb48d814d + - Feature: new: allow utf16 string with length 66ac6e65c8ab9394ef588adfc59131b3b9d8347b + - Feature: Introduce SetCallHandler and SetCallAsFunctionHandler 7764a9a115d60ba10dc24d86feb0fbc9b4f75537 + - Bugfix: Enable creating Locals from Globals under Node 0.10. 9bf9b8b190821af889790fdc18ace57257e4f9ff + - Bugfix: Fix issue #462 where PropertyCallbackInfo data is not stored safely. 55f50adedd543098526c7b9f4fffd607d3f9861f + +### 2.0.9 Sep 8 2015 + + - Bugfix: EscapableHandleScope in Nan::NewBuffer for Node 0.8 and 0.10 b1654d7 + +### 2.0.8 Aug 28 2015 + + - Work around duplicate linking bug in clang 11902da + +### 2.0.7 Aug 26 2015 + + - Build: Repackage + +### 2.0.6 Aug 26 2015 + + - Bugfix: Properly handle null callback in FunctionTemplate factory 6e99cb1 + - Bugfix: Remove unused static std::map instances 525bddc + - Bugfix: Make better use of maybe versions of APIs bfba85b + - Bugfix: Fix shadowing issues with handle in ObjectWrap 0a9072d + +### 2.0.5 Aug 10 2015 + + - Bugfix: Reimplement weak callback in ObjectWrap 98d38c1 + - Bugfix: Make sure callback classes are not assignable, copyable or movable 81f9b1d + +### 2.0.4 Aug 6 2015 + + - Build: Repackage + +### 2.0.3 Aug 6 2015 + + - Bugfix: Don't use clang++ / g++ syntax extension. 231450e + +### 2.0.2 Aug 6 2015 + + - Build: Repackage + +### 2.0.1 Aug 6 2015 + + - Bugfix: Add workaround for missing REPLACE_INVALID_UTF8 60d6687 + - Bugfix: Reimplement ObjectWrap from scratch to prevent memory leaks 6484601 + - Bugfix: Fix Persistent leak in FunctionCallbackInfo and PropertyCallbackInfo 641ef5f + - Bugfix: Add missing overload for Nan::NewInstance that takes argc/argv 29450ed + +### 2.0.0 Jul 31 2015 + + - Change: Renamed identifiers with leading underscores b5932b4 + - Change: Replaced NanObjectWrapHandle with class NanObjectWrap 464f1e1 + - Change: Replace NanScope and NanEscpableScope macros with classes 47751c4 + - Change: Rename NanNewBufferHandle to NanNewBuffer 6745f99 + - Change: Rename NanBufferUse to NanNewBuffer 3e8b0a5 + - Change: Rename NanNewBuffer to NanCopyBuffer d6af78d + - Change: Remove Nan prefix from all names 72d1f67 + - Change: Update Buffer API for new upstream changes d5d3291 + - Change: Rename Scope and EscapableScope to HandleScope and EscapableHandleScope 21a7a6a + - Change: Get rid of Handles e6c0daf + - Feature: Support io.js 3 with V8 4.4 + - Feature: Introduce NanPersistent 7fed696 + - Feature: Introduce NanGlobal 4408da1 + - Feature: Added NanTryCatch 10f1ca4 + - Feature: Update for V8 v4.3 4b6404a + - Feature: Introduce NanNewOneByteString c543d32 + - Feature: Introduce namespace Nan 67ed1b1 + - Removal: Remove NanLocker and NanUnlocker dd6e401 + - Removal: Remove string converters, except NanUtf8String, which now follows the node implementation b5d00a9 + - Removal: Remove NanReturn* macros d90a25c + - Removal: Remove HasInstance e8f84fe + + +### 1.9.0 Jul 31 2015 + + - Feature: Added `NanFatalException` 81d4a2c + - Feature: Added more error types 4265f06 + - Feature: Added dereference and function call operators to NanCallback c4b2ed0 + - Feature: Added indexed GetFromPersistent and SaveToPersistent edd510c + - Feature: Added more overloads of SaveToPersistent and GetFromPersistent 8b1cef6 + - Feature: Added NanErrnoException dd87d9e + - Correctness: Prevent assign, copy, and move for classes that do not support it 1f55c59, 4b808cb, c96d9b2, fba4a29, 3357130 + - Deprecation: Deprecate `NanGetPointerSafe` and `NanSetPointerSafe` 81d4a2c + - Deprecation: Deprecate `NanBooleanOptionValue` and `NanUInt32OptionValue` 0ad254b + +### 1.8.4 Apr 26 2015 + + - Build: Repackage + +### 1.8.3 Apr 26 2015 + + - Bugfix: Include missing header 1af8648 + +### 1.8.2 Apr 23 2015 + + - Build: Repackage + +### 1.8.1 Apr 23 2015 + + - Bugfix: NanObjectWrapHandle should take a pointer 155f1d3 + +### 1.8.0 Apr 23 2015 + + - Feature: Allow primitives with NanReturnValue 2e4475e + - Feature: Added comparison operators to NanCallback 55b075e + - Feature: Backport thread local storage 15bb7fa + - Removal: Remove support for signatures with arguments 8a2069d + - Correcteness: Replaced NanObjectWrapHandle macro with function 0bc6d59 + +### 1.7.0 Feb 28 2015 + + - Feature: Made NanCallback::Call accept optional target 8d54da7 + - Feature: Support atom-shell 0.21 0b7f1bb + +### 1.6.2 Feb 6 2015 + + - Bugfix: NanEncode: fix argument type for node::Encode on io.js 2be8639 + +### 1.6.1 Jan 23 2015 + + - Build: version bump + +### 1.5.3 Jan 23 2015 + + - Build: repackage + +### 1.6.0 Jan 23 2015 + + - Deprecated `NanNewContextHandle` in favor of `NanNew` 49259af + - Support utility functions moved in newer v8 versions (Node 0.11.15, io.js 1.0) a0aa179 + - Added `NanEncode`, `NanDecodeBytes` and `NanDecodeWrite` 75e6fb9 + +### 1.5.2 Jan 23 2015 + + - Bugfix: Fix non-inline definition build error with clang++ 21d96a1, 60fadd4 + - Bugfix: Readded missing String constructors 18d828f + - Bugfix: Add overload handling NanNew(..) 5ef813b + - Bugfix: Fix uv_work_cb versioning 997e4ae + - Bugfix: Add function factory and test 4eca89c + - Bugfix: Add object template factory and test cdcb951 + - Correctness: Lifted an io.js related typedef c9490be + - Correctness: Make explicit downcasts of String lengths 00074e6 + - Windows: Limit the scope of disabled warning C4530 83d7deb + +### 1.5.1 Jan 15 2015 + + - Build: version bump + +### 1.4.3 Jan 15 2015 + + - Build: version bump + +### 1.4.2 Jan 15 2015 + + - Feature: Support io.js 0dbc5e8 + +### 1.5.0 Jan 14 2015 + + - Feature: Support io.js b003843 + - Correctness: Improved NanNew internals 9cd4f6a + - Feature: Implement progress to NanAsyncWorker 8d6a160 + +### 1.4.1 Nov 8 2014 + + - Bugfix: Handle DEBUG definition correctly + - Bugfix: Accept int as Boolean + +### 1.4.0 Nov 1 2014 + + - Feature: Added NAN_GC_CALLBACK 6a5c245 + - Performance: Removed unnecessary local handle creation 18a7243, 41fe2f8 + - Correctness: Added constness to references in NanHasInstance 02c61cd + - Warnings: Fixed spurious warnings from -Wundef and -Wshadow, 541b122, 99d8cb6 + - Windoze: Shut Visual Studio up when compiling 8d558c1 + - License: Switch to plain MIT from custom hacked MIT license 11de983 + - Build: Added test target to Makefile e232e46 + - Performance: Removed superfluous scope in NanAsyncWorker f4b7821 + - Sugar/Feature: Added NanReturnThis() and NanReturnHolder() shorthands 237a5ff, d697208 + - Feature: Added suitable overload of NanNew for v8::Integer::NewFromUnsigned b27b450 + +### 1.3.0 Aug 2 2014 + + - Added NanNew(std::string) + - Added NanNew(std::string&) + - Added NanAsciiString helper class + - Added NanUtf8String helper class + - Added NanUcs2String helper class + - Deprecated NanRawString() + - Deprecated NanCString() + - Added NanGetIsolateData(v8::Isolate *isolate) + - Added NanMakeCallback(v8::Handle target, v8::Handle func, int argc, v8::Handle* argv) + - Added NanMakeCallback(v8::Handle target, v8::Handle symbol, int argc, v8::Handle* argv) + - Added NanMakeCallback(v8::Handle target, const char* method, int argc, v8::Handle* argv) + - Added NanSetTemplate(v8::Handle templ, v8::Handle name , v8::Handle value, v8::PropertyAttribute attributes) + - Added NanSetPrototypeTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) + - Added NanSetInstanceTemplate(v8::Local templ, const char *name, v8::Handle value) + - Added NanSetInstanceTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) + +### 1.2.0 Jun 5 2014 + + - Add NanSetPrototypeTemplate + - Changed NAN_WEAK_CALLBACK internals, switched _NanWeakCallbackData to class, + introduced _NanWeakCallbackDispatcher + - Removed -Wno-unused-local-typedefs from test builds + - Made test builds Windows compatible ('Sleep()') + +### 1.1.2 May 28 2014 + + - Release to fix more stuff-ups in 1.1.1 + +### 1.1.1 May 28 2014 + + - Release to fix version mismatch in nan.h and lack of changelog entry for 1.1.0 + +### 1.1.0 May 25 2014 + + - Remove nan_isolate, use v8::Isolate::GetCurrent() internally instead + - Additional explicit overloads for NanNew(): (char*,int), (uint8_t*[,int]), + (uint16_t*[,int), double, int, unsigned int, bool, v8::String::ExternalStringResource*, + v8::String::ExternalAsciiStringResource* + - Deprecate NanSymbol() + - Added SetErrorMessage() and ErrorMessage() to NanAsyncWorker + +### 1.0.0 May 4 2014 + + - Heavy API changes for V8 3.25 / Node 0.11.13 + - Use cpplint.py + - Removed NanInitPersistent + - Removed NanPersistentToLocal + - Removed NanFromV8String + - Removed NanMakeWeak + - Removed NanNewLocal + - Removed NAN_WEAK_CALLBACK_OBJECT + - Removed NAN_WEAK_CALLBACK_DATA + - Introduce NanNew, replaces NanNewLocal, NanPersistentToLocal, adds many overloaded typed versions + - Introduce NanUndefined, NanNull, NanTrue and NanFalse + - Introduce NanEscapableScope and NanEscapeScope + - Introduce NanMakeWeakPersistent (requires a special callback to work on both old and new node) + - Introduce NanMakeCallback for node::MakeCallback + - Introduce NanSetTemplate + - Introduce NanGetCurrentContext + - Introduce NanCompileScript and NanRunScript + - Introduce NanAdjustExternalMemory + - Introduce NanAddGCEpilogueCallback, NanAddGCPrologueCallback, NanRemoveGCEpilogueCallback, NanRemoveGCPrologueCallback + - Introduce NanGetHeapStatistics + - Rename NanAsyncWorker#SavePersistent() to SaveToPersistent() + +### 0.8.0 Jan 9 2014 + + - NanDispose -> NanDisposePersistent, deprecate NanDispose + - Extract _NAN_*_RETURN_TYPE, pull up NAN_*() + +### 0.7.1 Jan 9 2014 + + - Fixes to work against debug builds of Node + - Safer NanPersistentToLocal (avoid reinterpret_cast) + - Speed up common NanRawString case by only extracting flattened string when necessary + +### 0.7.0 Dec 17 2013 + + - New no-arg form of NanCallback() constructor. + - NanCallback#Call takes Handle rather than Local + - Removed deprecated NanCallback#Run method, use NanCallback#Call instead + - Split off _NAN_*_ARGS_TYPE from _NAN_*_ARGS + - Restore (unofficial) Node 0.6 compatibility at NanCallback#Call() + - Introduce NanRawString() for char* (or appropriate void*) from v8::String + (replacement for NanFromV8String) + - Introduce NanCString() for null-terminated char* from v8::String + +### 0.6.0 Nov 21 2013 + + - Introduce NanNewLocal(v8::Handle value) for use in place of + v8::Local::New(...) since v8 started requiring isolate in Node 0.11.9 + +### 0.5.2 Nov 16 2013 + + - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public + +### 0.5.1 Nov 12 2013 + + - Use node::MakeCallback() instead of direct v8::Function::Call() + +### 0.5.0 Nov 11 2013 + + - Added @TooTallNate as collaborator + - New, much simpler, "include_dirs" for binding.gyp + - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros + +### 0.4.4 Nov 2 2013 + + - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+ + +### 0.4.3 Nov 2 2013 + + - Include node_object_wrap.h, removed from node.h for Node 0.11.8. + +### 0.4.2 Nov 2 2013 + + - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for + Node 0.11.8 release. + +### 0.4.1 Sep 16 2013 + + - Added explicit `#include ` as it was removed from node.h for v0.11.8 + +### 0.4.0 Sep 2 2013 + + - Added NAN_INLINE and NAN_DEPRECATED and made use of them + - Added NanError, NanTypeError and NanRangeError + - Cleaned up code + +### 0.3.2 Aug 30 2013 + + - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent + in NanAsyncWorker + +### 0.3.1 Aug 20 2013 + + - fix "not all control paths return a value" compile warning on some platforms + +### 0.3.0 Aug 19 2013 + + - Made NAN work with NPM + - Lots of fixes to NanFromV8String, pulling in features from new Node core + - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API + - Added optional error number argument for NanThrowError() + - Added NanInitPersistent() + - Added NanReturnNull() and NanReturnEmptyString() + - Added NanLocker and NanUnlocker + - Added missing scopes + - Made sure to clear disposed Persistent handles + - Changed NanAsyncWorker to allocate error messages on the heap + - Changed NanThrowError(Local) to NanThrowError(Handle) + - Fixed leak in NanAsyncWorker when errmsg is used + +### 0.2.2 Aug 5 2013 + + - Fixed usage of undefined variable with node::BASE64 in NanFromV8String() + +### 0.2.1 Aug 5 2013 + + - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for + NanFromV8String() + +### 0.2.0 Aug 5 2013 + + - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR, + NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY + - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS, + _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS, + _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS, + _NAN_PROPERTY_QUERY_ARGS + - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer + - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT, + NAN_WEAK_CALLBACK_DATA, NanMakeWeak + - Renamed THROW_ERROR to _NAN_THROW_ERROR + - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*) + - Added NanBufferUse(char*, uint32_t) + - Added NanNewContextHandle(v8::ExtensionConfiguration*, + v8::Handle, v8::Handle) + - Fixed broken NanCallback#GetFunction() + - Added optional encoding and size arguments to NanFromV8String() + - Added NanGetPointerSafe() and NanSetPointerSafe() + - Added initial test suite (to be expanded) + - Allow NanUInt32OptionValue to convert any Number object + +### 0.1.0 Jul 21 2013 + + - Added `NAN_GETTER`, `NAN_SETTER` + - Added `NanThrowError` with single Local argument + - Added `NanNewBufferHandle` with single uint32_t argument + - Added `NanHasInstance(Persistent&, Handle)` + - Added `Local NanCallback#GetFunction()` + - Added `NanCallback#Call(int, Local[])` + - Deprecated `NanCallback#Run(int, Local[])` in favour of Call diff --git a/node_modules/nan/CMakeLists.txt b/node_modules/nan/CMakeLists.txt new file mode 100644 index 0000000..fe3a7e0 --- /dev/null +++ b/node_modules/nan/CMakeLists.txt @@ -0,0 +1,138 @@ +cmake_minimum_required(VERSION 3.5) +project(nan) + +set(CMAKE_CXX_STANDARD 11) + +set(CPPLINT "${CMAKE_CURRENT_SOURCE_DIR}/cpplint.py") +set(MODULES symbols strings) +set(SOURCES "") +set(ADDONS "") + +foreach(MODULE ${MODULES}) + list(APPEND SOURCES "test/cpp/${MODULE}.cpp") + list(APPEND ADDONS "test/build/${CMAKE_BUILD_TYPE}/${MODULE}.node") +endforeach() + +set(LINT_SOURCES examples/async_pi_estimate/addon.cc + examples/async_pi_estimate/async.cc + examples/async_pi_estimate/async.h + examples/async_pi_estimate/pi_est.cc + examples/async_pi_estimate/pi_est.h + examples/async_pi_estimate/sync.cc + examples/async_pi_estimate/sync.h + nan.h + nan_callbacks.h + nan_callbacks_12_inl.h + nan_callbacks_pre_12_inl.h + nan_converters.h + nan_converters_43_inl.h + nan_converters_pre_43_inl.h + nan_define_own_property_helper.h + nan_implementation_12_inl.h + nan_implementation_pre_12_inl.h + nan_json.h + nan_maybe_43_inl.h + nan_maybe_pre_43_inl.h + nan_new.h + nan_object_wrap.h + nan_persistent_12_inl.h + nan_persistent_pre_12_inl.h + nan_private.h + nan_scriptorigin.h + nan_string_bytes.h + nan_weak.h + test/cpp/accessors.cpp + test/cpp/accessors2.cpp + test/cpp/asyncresource.cpp + test/cpp/asyncworker.cpp + test/cpp/asyncprogressworker.cpp + test/cpp/asyncprogressworkerstream.cpp + test/cpp/asyncprogressworkersignal.cpp + test/cpp/asyncprogressqueueworker.cpp + test/cpp/asyncprogressqueueworkerstream.cpp + test/cpp/asyncworkererror.cpp + test/cpp/buffer.cpp + test/cpp/bufferworkerpersistent.cpp + test/cpp/error.cpp + test/cpp/gc.cpp + test/cpp/indexedinterceptors.cpp + test/cpp/callbackcontext.cpp + test/cpp/converters.cpp + test/cpp/isolatedata.cpp + test/cpp/json-parse.cpp + test/cpp/json-stringify.cpp + test/cpp/makecallback.cpp + test/cpp/maybe.cpp + test/cpp/morenews.cpp + test/cpp/multifile1.cpp + test/cpp/multifile2.cpp + test/cpp/multifile2.h + test/cpp/namedinterceptors.cpp + test/cpp/nancallback.cpp + test/cpp/nannew.cpp + test/cpp/news.cpp + test/cpp/objectwraphandle.cpp + test/cpp/persistent.cpp + test/cpp/private.cpp + test/cpp/returnemptystring.cpp + test/cpp/returnnull.cpp + test/cpp/returnundefined.cpp + test/cpp/returnvalue.cpp + test/cpp/setcallhandler.cpp + test/cpp/settemplate.cpp + test/cpp/sleep.h + test/cpp/strings.cpp + test/cpp/symbols.cpp + test/cpp/threadlocal.cpp + test/cpp/trycatch.cpp + test/cpp/typedarrays.cpp + test/cpp/weak.cpp + test/cpp/weak2.cpp + test/cpp/wrappedobjectfactory.cpp + node_modules/node-gyp/gyp/data/win/large-pdb-shim.cc) + +set(FILTER "-build/include_subdir,-whitespace/parens") + +find_package(Python COMPONENTS Interpreter Development REQUIRED) + +execute_process( + COMMAND npm install + OUTPUT_FILE node_modules + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_custom_target(lint + COMMAND ${Python_EXECUTABLE} ${CPPLINT} --filter=${FILTER} ${LINT_SOURCES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_custom_target(test + DEPENDS ${ADDONS} + COMMAND npm test +) + +add_custom_target(forcetest + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test + COMMAND ../node_modules/.bin/node-gyp rebuild + COMMAND npm test +) + +add_custom_target(docs + DEPENDS README.md doc/.build.sh doc/asyncworker.md doc/buffers.md doc/callback.md + doc/converters.md doc/errors.md doc/maybe_types.md doc/methods.md doc/new.md + doc/node_misc.md doc/persistent.md doc/scopes.md doc/script.md doc/string_bytes.md + doc/v8_internals.md doc/json.md doc/v8_misc.md + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND doc/.build.sh +) + +add_custom_command(OUTPUT ${ADDONS} + DEPENDS ${SOURCES} nan.h nan_new.h nan_implementation_pre_12_inl.h nan_implementation_12_inl.h + nan_callbacks.h nan_callbacks_12_inl.h nan_callbacks_pre_12_inl.h nan_converters.h + nan_converters_43_inl.h nan_converters_pre_43_inl.h nan_define_own_property_helper.h + nan_json.h nan_maybe_43_inl.h nan_maybe_pre_43_inl.h nan_persistent_12_inl.h + nan_persistent_pre_12_inl.h nan_private.h nan_weak.h nan_scriptorigin.h nan_string_bytes.h + test/binding.gyp + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test + COMMAND ../node_modules/.bin/node-gyp rebuild +) \ No newline at end of file diff --git a/node_modules/nan/LICENSE.md b/node_modules/nan/LICENSE.md new file mode 100644 index 0000000..2d33043 --- /dev/null +++ b/node_modules/nan/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2018 [NAN contributors]() + +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. diff --git a/node_modules/nan/README.md b/node_modules/nan/README.md new file mode 100644 index 0000000..22ce006 --- /dev/null +++ b/node_modules/nan/README.md @@ -0,0 +1,455 @@ +Native Abstractions for Node.js +=============================== + +**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 8, 10, 12, 14, 16, 17, 18, 19, 20, 21, and 22.** + +***Current version: 2.22.2*** + +*(See [CHANGELOG.md](https://github.com/nodejs/nan/blob/master/CHANGELOG.md) for complete ChangeLog)* + +[![NPM](https://nodei.co/npm/nan.png?downloads=true&downloadRank=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6&height=3)](https://nodei.co/npm/nan/) + +[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan) + +Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.12 to 4.0, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle. + +This project also contains some helper utilities that make addon development a bit more pleasant. + + * **[News & Updates](#news)** + * **[Usage](#usage)** + * **[Example](#example)** + * **[API](#api)** + * **[Tests](#tests)** + * **[Known issues](#issues)** + * **[Governance & Contributing](#governance)** + + + +## News & Updates + + + +## Usage + +Simply add **NAN** as a dependency in the *package.json* of your Node addon: + +``` bash +$ npm install --save nan +``` + +Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include ` in your *.cpp* files: + +``` python +"include_dirs" : [ + "` when compiling your addon. + + + +## Example + +Just getting started with Nan? Take a look at the **[Node Add-on Examples](https://github.com/nodejs/node-addon-examples)**. + +Refer to a [quick-start **Nan** Boilerplate](https://github.com/fcanas/node-native-boilerplate) for a ready-to-go project that utilizes basic Nan functionality. + +For a simpler example, see the **[async pi estimation example](https://github.com/nodejs/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**. + +Yet another example is **[nan-example-eol](https://github.com/CodeCharmLtd/nan-example-eol)**. It shows newline detection implemented as a native addon. + +Also take a look at our comprehensive **[C++ test suite](https://github.com/nodejs/nan/tree/master/test/cpp)** which has a plethora of code snippets for your pasting pleasure. + + + +## API + +Additional to the NAN documentation below, please consult: + +* [The V8 Getting Started * Guide](https://v8.dev/docs/embed) +* [V8 API Documentation](https://v8docs.nodesource.com/) +* [Node Add-on Documentation](https://nodejs.org/api/addons.html) + + + +### JavaScript-accessible methods + +A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://github.com/v8/v8/wiki/Embedder%27s-Guide#templates) for further information. + +In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type. + +* **Method argument types** + - Nan::FunctionCallbackInfo + - Nan::PropertyCallbackInfo + - Nan::ReturnValue +* **Method declarations** + - Method declaration + - Getter declaration + - Setter declaration + - Property getter declaration + - Property setter declaration + - Property enumerator declaration + - Property deleter declaration + - Property query declaration + - Index getter declaration + - Index setter declaration + - Index enumerator declaration + - Index deleter declaration + - Index query declaration +* Method and template helpers + - Nan::SetMethod() + - Nan::SetPrototypeMethod() + - Nan::SetAccessor() + - Nan::SetNamedPropertyHandler() + - Nan::SetIndexedPropertyHandler() + - Nan::SetTemplate() + - Nan::SetPrototypeTemplate() + - Nan::SetInstanceTemplate() + - Nan::SetCallHandler() + - Nan::SetCallAsFunctionHandler() + +### Scopes + +A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works. + +A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope. + +The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these. + + - Nan::HandleScope + - Nan::EscapableHandleScope + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection). + +### Persistent references + +An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed. + +Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported. + + - Nan::PersistentBase & v8::PersistentBase + - Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits + - Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits + - Nan::Persistent + - Nan::Global + - Nan::WeakCallbackInfo + - Nan::WeakCallbackType + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://v8.dev/docs/embed#handles-and-garbage-collection). + +### New + +NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8. + + - Nan::New() + - Nan::Undefined() + - Nan::Null() + - Nan::True() + - Nan::False() + - Nan::EmptyString() + + +### Converters + +NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN. + + - Nan::To() + +### Maybe Types + +The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_. + +* **Maybe Types** + - Nan::MaybeLocal + - Nan::Maybe + - Nan::Nothing + - Nan::Just +* **Maybe Helpers** + - Nan::Call() + - Nan::ToDetailString() + - Nan::ToArrayIndex() + - Nan::Equals() + - Nan::NewInstance() + - Nan::GetFunction() + - Nan::Set() + - Nan::DefineOwnProperty() + - Nan::ForceSet() + - Nan::Get() + - Nan::GetPropertyAttributes() + - Nan::Has() + - Nan::Delete() + - Nan::GetPropertyNames() + - Nan::GetOwnPropertyNames() + - Nan::SetPrototype() + - Nan::ObjectProtoToString() + - Nan::HasOwnProperty() + - Nan::HasRealNamedProperty() + - Nan::HasRealIndexedProperty() + - Nan::HasRealNamedCallbackProperty() + - Nan::GetRealNamedPropertyInPrototypeChain() + - Nan::GetRealNamedProperty() + - Nan::CallAsFunction() + - Nan::CallAsConstructor() + - Nan::GetSourceLine() + - Nan::GetLineNumber() + - Nan::GetStartColumn() + - Nan::GetEndColumn() + - Nan::CloneElementAt() + - Nan::HasPrivate() + - Nan::GetPrivate() + - Nan::SetPrivate() + - Nan::DeletePrivate() + - Nan::MakeMaybe() + +### Script + +NAN provides `v8::Script` helpers as the API has changed over the supported versions of V8. + + - Nan::CompileScript() + - Nan::RunScript() + - Nan::ScriptOrigin + + +### JSON + +The _JSON_ object provides the C++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object. + + - Nan::JSON.Parse + - Nan::JSON.Stringify + +Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments. + +### Errors + +NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted. + +Note that an Error object is simply a specialized form of `v8::Value`. + +Also consult the V8 Embedders Guide section on [Exceptions](https://v8.dev/docs/embed#exceptions) for more information. + + - Nan::Error() + - Nan::RangeError() + - Nan::ReferenceError() + - Nan::SyntaxError() + - Nan::TypeError() + - Nan::ThrowError() + - Nan::ThrowRangeError() + - Nan::ThrowReferenceError() + - Nan::ThrowSyntaxError() + - Nan::ThrowTypeError() + - Nan::FatalException() + - Nan::ErrnoException() + - Nan::TryCatch + + +### Buffers + +NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility. + + - Nan::NewBuffer() + - Nan::CopyBuffer() + - Nan::FreeCallback() + +### Nan::Callback + +`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution. + + - Nan::Callback + +### Asynchronous work helpers + +`Nan::AsyncWorker`, `Nan::AsyncProgressWorker` and `Nan::AsyncProgressQueueWorker` are helper classes that make working with asynchronous code easier. + + - Nan::AsyncWorker + - Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker + - Nan::AsyncProgressQueueWorker + - Nan::AsyncQueueWorker + +### Strings & Bytes + +Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing. + + - Nan::Encoding + - Nan::Encode() + - Nan::DecodeBytes() + - Nan::DecodeWrite() + + +### Object Wrappers + +The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects. + + - Nan::ObjectWrap + + +### V8 internals + +The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods. + + - NAN_GC_CALLBACK() + - Nan::AddGCEpilogueCallback() + - Nan::RemoveGCEpilogueCallback() + - Nan::AddGCPrologueCallback() + - Nan::RemoveGCPrologueCallback() + - Nan::GetHeapStatistics() + - Nan::SetCounterFunction() + - Nan::SetCreateHistogramFunction() + - Nan::SetAddHistogramSampleFunction() + - Nan::IdleNotification() + - Nan::LowMemoryNotification() + - Nan::ContextDisposedNotification() + - Nan::GetInternalFieldPointer() + - Nan::SetInternalFieldPointer() + - Nan::AdjustExternalMemory() + + +### Miscellaneous V8 Helpers + + - Nan::Utf8String + - Nan::GetCurrentContext() + - Nan::SetIsolateData() + - Nan::GetIsolateData() + - Nan::TypedArrayContents + + +### Miscellaneous Node Helpers + + - Nan::AsyncResource + - Nan::MakeCallback() + - NAN_MODULE_INIT() + - Nan::Export() + + + + + + +### Tests + +To run the NAN tests do: + +``` sh +npm install +npm run-script rebuild-tests +npm test +``` + +Or just: + +``` sh +npm install +make test +``` + + + +## Known issues + +### Compiling against Node.js 0.12 on OSX + +With new enough compilers available on OSX, the versions of V8 headers corresponding to Node.js 0.12 +do not compile anymore. The error looks something like: + +``` +❯ CXX(target) Release/obj.target/accessors/cpp/accessors.o +In file included from ../cpp/accessors.cpp:9: +In file included from ../../nan.h:51: +In file included from /Users/ofrobots/.node-gyp/0.12.18/include/node/node.h:61: +/Users/ofrobots/.node-gyp/0.12.18/include/node/v8.h:5800:54: error: 'CreateHandle' is a protected member of 'v8::HandleScope' + return Handle(reinterpret_cast(HandleScope::CreateHandle( + ~~~~~~~~~~~~~^~~~~~~~~~~~ +``` + +This can be worked around by patching your local versions of v8.h corresponding to Node 0.12 to make +`v8::Handle` a friend of `v8::HandleScope`. Since neither Node.js not V8 support this release line anymore +this patch cannot be released by either project in an official release. + +For this reason, we do not test against Node.js 0.12 on OSX in this project's CI. If you need to support +that configuration, you will need to either get an older compiler, or apply a source patch to the version +of V8 headers as a workaround. + + + +## Governance & Contributing + +NAN is governed by the [Node.js Addon API Working Group](https://github.com/nodejs/CTC/blob/master/WORKING_GROUPS.md#addon-api) + +### Addon API Working Group (WG) + +The NAN project is jointly governed by a Working Group which is responsible for high-level guidance of the project. + +Members of the WG are also known as Collaborators, there is no distinction between the two, unlike other Node.js projects. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project [README.md](./README.md#collaborators). + +Individuals making significant and valuable contributions are made members of the WG and given commit-access to the project. These individuals are identified by the WG and their addition to the WG is discussed via GitHub and requires unanimous consensus amongst those WG members participating in the discussion with a quorum of 50% of WG members required for acceptance of the vote. + +_Note:_ If you make a significant contribution and are not considered for commit-access log an issue or contact a WG member directly. + +For the current list of WG members / Collaborators, see the project [README.md](./README.md#collaborators). + +### Consensus Seeking Process + +The WG follows a [Consensus Seeking](https://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model. + +Modifications of the contents of the NAN repository are made on a collaborative basis. Anybody with a GitHub account may propose a modification via pull request and it will be considered by the WG. All pull requests must be reviewed and accepted by a WG member with sufficient expertise who is able to take full responsibility for the change. In the case of pull requests proposed by an existing WG member, an additional WG member is required for sign-off. Consensus should be sought if additional WG members participate and there is disagreement around a particular modification. + +If a change proposal cannot reach a consensus, a WG member can call for a vote amongst the members of the WG. Simple majority wins. + + + +## Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + + + +### WG Members / Collaborators + + + + + + + + + + +
Rod VaggGitHub/rvaggTwitter/@rvagg
Benjamin ByholmGitHub/kkoopa-
Trevor NorrisGitHub/trevnorrisTwitter/@trevnorris
Nathan RajlichGitHub/TooTallNateTwitter/@TooTallNate
Brett LawsonGitHub/brett19Twitter/@brett19x
Ben NoordhuisGitHub/bnoordhuisTwitter/@bnoordhuis
David SiegelGitHub/agnatTwitter/@agnat
Michael Ira KrufkyGitHub/mkrufkyTwitter/@mkrufky
+ +## Licence & copyright + +Copyright (c) 2018 NAN WG Members / Collaborators (listed above). + +Native Abstractions for Node.js is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/nan/doc/asyncworker.md b/node_modules/nan/doc/asyncworker.md new file mode 100644 index 0000000..04231f8 --- /dev/null +++ b/node_modules/nan/doc/asyncworker.md @@ -0,0 +1,146 @@ +## Asynchronous work helpers + +`Nan::AsyncWorker`, `Nan::AsyncProgressWorker` and `Nan::AsyncProgressQueueWorker` are helper classes that make working with asynchronous code easier. + + - Nan::AsyncWorker + - Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker + - Nan::AsyncProgressQueueWorker + - Nan::AsyncQueueWorker + + +### Nan::AsyncWorker + +`Nan::AsyncWorker` is an _abstract_ class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress. + +This class internally handles the details of creating an [`AsyncResource`][AsyncResource], and running the callback in the +correct async context. To be able to identify the async resources created by this class in async-hooks, provide a +`resource_name` to the constructor. It is recommended that the module name be used as a prefix to the `resource_name` to avoid +collisions in the names. For more details see [`AsyncResource`][AsyncResource] documentation. The `resource_name` needs to stay valid for the lifetime of the worker instance. + +Definition: + +```c++ +class AsyncWorker { + public: + explicit AsyncWorker(Callback *callback_, const char* resource_name = "nan:AsyncWorker"); + + virtual ~AsyncWorker(); + + virtual void WorkComplete(); + + void SaveToPersistent(const char *key, const v8::Local &value); + + void SaveToPersistent(const v8::Local &key, + const v8::Local &value); + + void SaveToPersistent(uint32_t index, + const v8::Local &value); + + v8::Local GetFromPersistent(const char *key) const; + + v8::Local GetFromPersistent(const v8::Local &key) const; + + v8::Local GetFromPersistent(uint32_t index) const; + + virtual void Execute() = 0; + + uv_work_t request; + + virtual void Destroy(); + + protected: + Persistent persistentHandle; + + Callback *callback; + + virtual void HandleOKCallback(); + + virtual void HandleErrorCallback(); + + void SetErrorMessage(const char *msg); + + const char* ErrorMessage(); +}; +``` + + +### Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker + +`Nan::AsyncProgressWorkerBase` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript. + +Previously the definition of `Nan::AsyncProgressWorker` only allowed sending `const char` data. Now extending `Nan::AsyncProgressWorker` will yield an instance of the implicit `Nan::AsyncProgressWorkerBase` template with type `` for compatibility. + +`Nan::AsyncProgressWorkerBase` & `Nan::AsyncProgressWorker` is intended for best-effort delivery of nonessential progress messages, e.g. a progress bar. The last event sent before the main thread is woken will be delivered. + +Definition: + +```c++ +template +class AsyncProgressWorkerBase : public AsyncWorker { + public: + explicit AsyncProgressWorkerBase(Callback *callback_, const char* resource_name = ...); + + virtual ~AsyncProgressWorkerBase(); + + void WorkProgress(); + + class ExecutionProgress { + public: + void Signal() const; + void Send(const T* data, size_t count) const; + }; + + virtual void Execute(const ExecutionProgress& progress) = 0; + + virtual void HandleProgressCallback(const T *data, size_t count) = 0; + + virtual void Destroy(); +}; + +typedef AsyncProgressWorkerBase AsyncProgressWorker; +``` + + +### Nan::AsyncProgressQueueWorker + +`Nan::AsyncProgressQueueWorker` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript. + +`Nan::AsyncProgressQueueWorker` behaves exactly the same as `Nan::AsyncProgressWorker`, except all events are queued and delivered to the main thread. + +Definition: + +```c++ +template +class AsyncProgressQueueWorker : public AsyncWorker { + public: + explicit AsyncProgressQueueWorker(Callback *callback_, const char* resource_name = "nan:AsyncProgressQueueWorker"); + + virtual ~AsyncProgressQueueWorker(); + + void WorkProgress(); + + class ExecutionProgress { + public: + void Send(const T* data, size_t count) const; + }; + + virtual void Execute(const ExecutionProgress& progress) = 0; + + virtual void HandleProgressCallback(const T *data, size_t count) = 0; + + virtual void Destroy(); +}; +``` + + +### Nan::AsyncQueueWorker + +`Nan::AsyncQueueWorker` will run a `Nan::AsyncWorker` asynchronously via libuv. Both the `execute` and `after_work` steps are taken care of for you. Most of the logic for this is embedded in `Nan::AsyncWorker`. + +Definition: + +```c++ +void AsyncQueueWorker(AsyncWorker *); +``` + +[AsyncResource]: node_misc.md#api_nan_asyncresource diff --git a/node_modules/nan/doc/buffers.md b/node_modules/nan/doc/buffers.md new file mode 100644 index 0000000..8d8d25c --- /dev/null +++ b/node_modules/nan/doc/buffers.md @@ -0,0 +1,54 @@ +## Buffers + +NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility. + + - Nan::NewBuffer() + - Nan::CopyBuffer() + - Nan::FreeCallback() + + +### Nan::NewBuffer() + +Allocate a new `node::Buffer` object with the specified size and optional data. Calls `node::Buffer::New()`. + +Note that when creating a `Buffer` using `Nan::NewBuffer()` and an existing `char*`, it is assumed that the ownership of the pointer is being transferred to the new `Buffer` for management. +When a `node::Buffer` instance is garbage collected and a `FreeCallback` has not been specified, `data` will be disposed of via a call to `free()`. +You _must not_ free the memory space manually once you have created a `Buffer` in this way. + +Signature: + +```c++ +Nan::MaybeLocal Nan::NewBuffer(uint32_t size) +Nan::MaybeLocal Nan::NewBuffer(char* data, uint32_t size) +Nan::MaybeLocal Nan::NewBuffer(char *data, + size_t length, + Nan::FreeCallback callback, + void *hint) +``` + + + +### Nan::CopyBuffer() + +Similar to [`Nan::NewBuffer()`](#api_nan_new_buffer) except that an implicit memcpy will occur within Node. Calls `node::Buffer::Copy()`. + +Management of the `char*` is left to the user, you should manually free the memory space if necessary as the new `Buffer` will have its own copy. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CopyBuffer(const char *data, uint32_t size) +``` + + + +### Nan::FreeCallback() + +A free callback that can be provided to [`Nan::NewBuffer()`](#api_nan_new_buffer). +The supplied callback will be invoked when the `Buffer` undergoes garbage collection. + +Signature: + +```c++ +typedef void (*FreeCallback)(char *data, void *hint); +``` diff --git a/node_modules/nan/doc/callback.md b/node_modules/nan/doc/callback.md new file mode 100644 index 0000000..f7af0bf --- /dev/null +++ b/node_modules/nan/doc/callback.md @@ -0,0 +1,76 @@ +## Nan::Callback + +`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution. + + - Nan::Callback + + +### Nan::Callback + +```c++ +class Callback { + public: + Callback(); + + explicit Callback(const v8::Local &fn); + + ~Callback(); + + bool operator==(const Callback &other) const; + + bool operator!=(const Callback &other) const; + + v8::Local operator*() const; + + MaybeLocal operator()(AsyncResource* async_resource, + v8::Local target, + int argc = 0, + v8::Local argv[] = 0) const; + + MaybeLocal operator()(AsyncResource* async_resource, + int argc = 0, + v8::Local argv[] = 0) const; + + void SetFunction(const v8::Local &fn); + + v8::Local GetFunction() const; + + bool IsEmpty() const; + + void Reset(const v8::Local &fn); + + void Reset(); + + MaybeLocal Call(v8::Local target, + int argc, + v8::Local argv[], + AsyncResource* async_resource) const; + MaybeLocal Call(int argc, + v8::Local argv[], + AsyncResource* async_resource) const; + + // Deprecated versions. Use the versions that accept an async_resource instead + // as they run the callback in the correct async context as specified by the + // resource. If you want to call a synchronous JS function (i.e. on a + // non-empty JS stack), you can use Nan::Call instead. + v8::Local operator()(v8::Local target, + int argc = 0, + v8::Local argv[] = 0) const; + + v8::Local operator()(int argc = 0, + v8::Local argv[] = 0) const; + v8::Local Call(v8::Local target, + int argc, + v8::Local argv[]) const; + + v8::Local Call(int argc, v8::Local argv[]) const; +}; +``` + +Example usage: + +```c++ +v8::Local function; +Nan::Callback callback(function); +callback.Call(0, 0); +``` diff --git a/node_modules/nan/doc/converters.md b/node_modules/nan/doc/converters.md new file mode 100644 index 0000000..d20861b --- /dev/null +++ b/node_modules/nan/doc/converters.md @@ -0,0 +1,41 @@ +## Converters + +NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN. + + - Nan::To() + + +### Nan::To() + +Converts a `v8::Local` to a different subtype of `v8::Value` or to a native data type. Returns a `Nan::MaybeLocal<>` or a `Nan::Maybe<>` accordingly. + +See [maybe_types.md](./maybe_types.md) for more information on `Nan::Maybe` types. + +Signatures: + +```c++ +// V8 types +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); +Nan::MaybeLocal Nan::To(v8::Local val); + +// Native types +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +Nan::Maybe Nan::To(v8::Local val); +``` + +### Example + +```c++ +v8::Local val; +Nan::MaybeLocal str = Nan::To(val); +Nan::Maybe d = Nan::To(val); +``` + diff --git a/node_modules/nan/doc/errors.md b/node_modules/nan/doc/errors.md new file mode 100644 index 0000000..173a8ea --- /dev/null +++ b/node_modules/nan/doc/errors.md @@ -0,0 +1,226 @@ +## Errors + +NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted. + +Note that an Error object is simply a specialized form of `v8::Value`. + +Also consult the V8 Embedders Guide section on [Exceptions](https://v8.dev/docs/embed#exceptions) for more information. + + - Nan::Error() + - Nan::RangeError() + - Nan::ReferenceError() + - Nan::SyntaxError() + - Nan::TypeError() + - Nan::ThrowError() + - Nan::ThrowRangeError() + - Nan::ThrowReferenceError() + - Nan::ThrowSyntaxError() + - Nan::ThrowTypeError() + - Nan::FatalException() + - Nan::ErrnoException() + - Nan::TryCatch + + + +### Nan::Error() + +Create a new Error object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an Error object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::Error(const char *msg); +v8::Local Nan::Error(v8::Local msg); +``` + + + +### Nan::RangeError() + +Create a new RangeError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an RangeError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::RangeError(const char *msg); +v8::Local Nan::RangeError(v8::Local msg); +``` + + + +### Nan::ReferenceError() + +Create a new ReferenceError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an ReferenceError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::ReferenceError(const char *msg); +v8::Local Nan::ReferenceError(v8::Local msg); +``` + + + +### Nan::SyntaxError() + +Create a new SyntaxError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an SyntaxError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::SyntaxError(const char *msg); +v8::Local Nan::SyntaxError(v8::Local msg); +``` + + + +### Nan::TypeError() + +Create a new TypeError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8. + +Note that an TypeError object is simply a specialized form of `v8::Value`. + +Signature: + +```c++ +v8::Local Nan::TypeError(const char *msg); +v8::Local Nan::TypeError(v8::Local msg); +``` + + + +### Nan::ThrowError() + +Throw an Error object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new Error object will be created. + +Signature: + +```c++ +void Nan::ThrowError(const char *msg); +void Nan::ThrowError(v8::Local msg); +void Nan::ThrowError(v8::Local error); +``` + + + +### Nan::ThrowRangeError() + +Throw an RangeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new RangeError object will be created. + +Signature: + +```c++ +void Nan::ThrowRangeError(const char *msg); +void Nan::ThrowRangeError(v8::Local msg); +void Nan::ThrowRangeError(v8::Local error); +``` + + + +### Nan::ThrowReferenceError() + +Throw an ReferenceError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new ReferenceError object will be created. + +Signature: + +```c++ +void Nan::ThrowReferenceError(const char *msg); +void Nan::ThrowReferenceError(v8::Local msg); +void Nan::ThrowReferenceError(v8::Local error); +``` + + + +### Nan::ThrowSyntaxError() + +Throw an SyntaxError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new SyntaxError object will be created. + +Signature: + +```c++ +void Nan::ThrowSyntaxError(const char *msg); +void Nan::ThrowSyntaxError(v8::Local msg); +void Nan::ThrowSyntaxError(v8::Local error); +``` + + + +### Nan::ThrowTypeError() + +Throw an TypeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new TypeError object will be created. + +Signature: + +```c++ +void Nan::ThrowTypeError(const char *msg); +void Nan::ThrowTypeError(v8::Local msg); +void Nan::ThrowTypeError(v8::Local error); +``` + + +### Nan::FatalException() + +Replaces `node::FatalException()` which has a different API across supported versions of Node. For use with [`Nan::TryCatch`](#api_nan_try_catch). + +Signature: + +```c++ +void Nan::FatalException(const Nan::TryCatch& try_catch); +``` + + +### Nan::ErrnoException() + +Replaces `node::ErrnoException()` which has a different API across supported versions of Node. + +Signature: + +```c++ +v8::Local Nan::ErrnoException(int errorno, + const char* syscall = NULL, + const char* message = NULL, + const char* path = NULL); +``` + + + +### Nan::TryCatch + +A simple wrapper around [`v8::TryCatch`](https://v8docs.nodesource.com/node-8.16/d4/dc6/classv8_1_1_try_catch.html) compatible with all supported versions of V8. Can be used as a direct replacement in most cases. See also [`Nan::FatalException()`](#api_nan_fatal_exception) for an internal use compatible with `node::FatalException`. + +Signature: + +```c++ +class Nan::TryCatch { + public: + Nan::TryCatch(); + + bool HasCaught() const; + + bool CanContinue() const; + + v8::Local ReThrow(); + + v8::Local Exception() const; + + // Nan::MaybeLocal for older versions of V8 + v8::MaybeLocal StackTrace() const; + + v8::Local Message() const; + + void Reset(); + + void SetVerbose(bool value); + + void SetCaptureMessage(bool value); +}; +``` + diff --git a/node_modules/nan/doc/json.md b/node_modules/nan/doc/json.md new file mode 100644 index 0000000..55beb26 --- /dev/null +++ b/node_modules/nan/doc/json.md @@ -0,0 +1,62 @@ +## JSON + +The _JSON_ object provides the C++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object. + + - Nan::JSON.Parse + - Nan::JSON.Stringify + +Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments. + + + +### Nan::JSON.Parse + +A simple wrapper around [`v8::JSON::Parse`](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html#a936310d2540fb630ed37d3ee3ffe4504). + +Definition: + +```c++ +Nan::MaybeLocal Nan::JSON::Parse(v8::Local json_string); +``` + +Use `JSON.Parse(json_string)` to parse a string into a `v8::Value`. + +Example: + +```c++ +v8::Local json_string = Nan::New("{ \"JSON\": \"object\" }").ToLocalChecked(); + +Nan::JSON NanJSON; +Nan::MaybeLocal result = NanJSON.Parse(json_string); +if (!result.IsEmpty()) { + v8::Local val = result.ToLocalChecked(); +} +``` + + + +### Nan::JSON.Stringify + +A simple wrapper around [`v8::JSON::Stringify`](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html#a44b255c3531489ce43f6110209138860). + +Definition: + +```c++ +Nan::MaybeLocal Nan::JSON::Stringify(v8::Local json_object, v8::Local gap = v8::Local()); +``` + +Use `JSON.Stringify(value)` to stringify a `v8::Object`. + +Example: + +```c++ +// using `v8::Local val` from the `JSON::Parse` example +v8::Local obj = Nan::To(val).ToLocalChecked(); + +Nan::JSON NanJSON; +Nan::MaybeLocal result = NanJSON.Stringify(obj); +if (!result.IsEmpty()) { + v8::Local stringified = result.ToLocalChecked(); +} +``` + diff --git a/node_modules/nan/doc/maybe_types.md b/node_modules/nan/doc/maybe_types.md new file mode 100644 index 0000000..142851a --- /dev/null +++ b/node_modules/nan/doc/maybe_types.md @@ -0,0 +1,583 @@ +## Maybe Types + +The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_. + +* **Maybe Types** + - Nan::MaybeLocal + - Nan::Maybe + - Nan::Nothing + - Nan::Just +* **Maybe Helpers** + - Nan::Call() + - Nan::ToDetailString() + - Nan::ToArrayIndex() + - Nan::Equals() + - Nan::NewInstance() + - Nan::GetFunction() + - Nan::Set() + - Nan::DefineOwnProperty() + - Nan::ForceSet() + - Nan::Get() + - Nan::GetPropertyAttributes() + - Nan::Has() + - Nan::Delete() + - Nan::GetPropertyNames() + - Nan::GetOwnPropertyNames() + - Nan::SetPrototype() + - Nan::ObjectProtoToString() + - Nan::HasOwnProperty() + - Nan::HasRealNamedProperty() + - Nan::HasRealIndexedProperty() + - Nan::HasRealNamedCallbackProperty() + - Nan::GetRealNamedPropertyInPrototypeChain() + - Nan::GetRealNamedProperty() + - Nan::CallAsFunction() + - Nan::CallAsConstructor() + - Nan::GetSourceLine() + - Nan::GetLineNumber() + - Nan::GetStartColumn() + - Nan::GetEndColumn() + - Nan::CloneElementAt() + - Nan::HasPrivate() + - Nan::GetPrivate() + - Nan::SetPrivate() + - Nan::DeletePrivate() + - Nan::MakeMaybe() + + +### Nan::MaybeLocal + +A `Nan::MaybeLocal` is a wrapper around [`v8::Local`](https://v8docs.nodesource.com/node-8.16/de/deb/classv8_1_1_local.html) that enforces a check that determines whether the `v8::Local` is empty before it can be used. + +If an API method returns a `Nan::MaybeLocal`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, an empty `Nan::MaybeLocal` is returned. + +Definition: + +```c++ +template class Nan::MaybeLocal { + public: + MaybeLocal(); + + template MaybeLocal(v8::Local that); + + bool IsEmpty() const; + + template bool ToLocal(v8::Local *out); + + // Will crash if the MaybeLocal<> is empty. + v8::Local ToLocalChecked(); + + template v8::Local FromMaybe(v8::Local default_value) const; +}; +``` + +See the documentation for [`v8::MaybeLocal`](https://v8docs.nodesource.com/node-8.16/d8/d7d/classv8_1_1_maybe_local.html) for further details. + + +### Nan::Maybe + +A simple `Nan::Maybe` type, representing an object which may or may not have a value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html. + +If an API method returns a `Nan::Maybe<>`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, a "Nothing" value is returned. + +Definition: + +```c++ +template class Nan::Maybe { + public: + bool IsNothing() const; + bool IsJust() const; + + // Will crash if the Maybe<> is nothing. + T FromJust(); + + T FromMaybe(const T& default_value); + + bool operator==(const Maybe &other); + + bool operator!=(const Maybe &other); +}; +``` + +See the documentation for [`v8::Maybe`](https://v8docs.nodesource.com/node-8.16/d9/d4b/classv8_1_1_maybe.html) for further details. + + +### Nan::Nothing + +Construct an empty `Nan::Maybe` type representing _nothing_. + +```c++ +template Nan::Maybe Nan::Nothing(); +``` + + +### Nan::Just + +Construct a `Nan::Maybe` type representing _just_ a value. + +```c++ +template Nan::Maybe Nan::Just(const T &t); +``` + + +### Nan::Call() + +A helper method for calling a synchronous [`v8::Function#Call()`](https://v8docs.nodesource.com/node-8.16/d5/d54/classv8_1_1_function.html#a9c3d0e4e13ddd7721fce238aa5b94a11) in a way compatible across supported versions of V8. + +For asynchronous callbacks, use Nan::Callback::Call along with an AsyncResource. + +Signature: + +```c++ +Nan::MaybeLocal Nan::Call(v8::Local fun, v8::Local recv, int argc, v8::Local argv[]); +Nan::MaybeLocal Nan::Call(const Nan::Callback& callback, v8::Local recv, + int argc, v8::Local argv[]); +Nan::MaybeLocal Nan::Call(const Nan::Callback& callback, int argc, v8::Local argv[]); +``` + + + +### Nan::ToDetailString() + +A helper method for calling [`v8::Value#ToDetailString()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#a2f9770296dc2c8d274bc8cc0dca243e5) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::ToDetailString(v8::Local val); +``` + + + +### Nan::ToArrayIndex() + +A helper method for calling [`v8::Value#ToArrayIndex()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#acc5bbef3c805ec458470c0fcd6f13493) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::ToArrayIndex(v8::Local val); +``` + + + +### Nan::Equals() + +A helper method for calling [`v8::Value#Equals()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#a08fba1d776a59bbf6864b25f9152c64b) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Equals(v8::Local a, v8::Local(b)); +``` + + + +### Nan::NewInstance() + +A helper method for calling [`v8::Function#NewInstance()`](https://v8docs.nodesource.com/node-8.16/d5/d54/classv8_1_1_function.html#ae477558b10c14b76ed00e8dbab44ce5b) and [`v8::ObjectTemplate#NewInstance()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#ad605a7543cfbc5dab54cdb0883d14ae4) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::NewInstance(v8::Local h); +Nan::MaybeLocal Nan::NewInstance(v8::Local h, int argc, v8::Local argv[]); +Nan::MaybeLocal Nan::NewInstance(v8::Local h); +``` + + + +### Nan::GetFunction() + +A helper method for calling [`v8::FunctionTemplate#GetFunction()`](https://v8docs.nodesource.com/node-8.16/d8/d83/classv8_1_1_function_template.html#a56d904662a86eca78da37d9bb0ed3705) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetFunction(v8::Local t); +``` + + + +### Nan::Set() + +A helper method for calling [`v8::Object#Set()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a67604ea3734f170c66026064ea808f20) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Set(v8::Local obj, + v8::Local key, + v8::Local value) +Nan::Maybe Nan::Set(v8::Local obj, + uint32_t index, + v8::Local value); +``` + + + +### Nan::DefineOwnProperty() + +A helper method for calling [`v8::Object#DefineOwnProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a6f76b2ed605cb8f9185b92de0033a820) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::DefineOwnProperty(v8::Local obj, + v8::Local key, + v8::Local value, + v8::PropertyAttribute attribs = v8::None); +``` + + + +### Nan::ForceSet() + +Deprecated, use Nan::DefineOwnProperty(). + +A helper method for calling [`v8::Object#ForceSet()`](https://v8docs.nodesource.com/node-0.12/db/d85/classv8_1_1_object.html#acfbdfd7427b516ebdb5c47c4df5ed96c) in a way compatible across supported versions of V8. + +Signature: + +```c++ +NAN_DEPRECATED Nan::Maybe Nan::ForceSet(v8::Local obj, + v8::Local key, + v8::Local value, + v8::PropertyAttribute attribs = v8::None); +``` + + + +### Nan::Get() + +A helper method for calling [`v8::Object#Get()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a2565f03e736694f6b1e1cf22a0b4eac2) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::Get(v8::Local obj, + v8::Local key); +Nan::MaybeLocal Nan::Get(v8::Local obj, uint32_t index); +``` + + + +### Nan::GetPropertyAttributes() + +A helper method for calling [`v8::Object#GetPropertyAttributes()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a9b898894da3d1db2714fd9325a54fe57) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetPropertyAttributes( + v8::Local obj, + v8::Local key); +``` + + + +### Nan::Has() + +A helper method for calling [`v8::Object#Has()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab3c3d89ea7c2f9afd08965bd7299a41d) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Has(v8::Local obj, v8::Local key); +Nan::Maybe Nan::Has(v8::Local obj, uint32_t index); +``` + + + +### Nan::Delete() + +A helper method for calling [`v8::Object#Delete()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a48e4a19b2cedff867eecc73ddb7d377f) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::Delete(v8::Local obj, + v8::Local key); +Nan::Maybe Nan::Delete(v8::Local obj, uint32_t index); +``` + + + +### Nan::GetPropertyNames() + +A helper method for calling [`v8::Object#GetPropertyNames()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#aced885270cfd2c956367b5eedc7fbfe8) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetPropertyNames(v8::Local obj); +``` + + + +### Nan::GetOwnPropertyNames() + +A helper method for calling [`v8::Object#GetOwnPropertyNames()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a79a6e4d66049b9aa648ed4dfdb23e6eb) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetOwnPropertyNames(v8::Local obj); +``` + + + +### Nan::SetPrototype() + +A helper method for calling [`v8::Object#SetPrototype()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a442706b22fceda6e6d1f632122a9a9f4) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::SetPrototype(v8::Local obj, + v8::Local prototype); +``` + + + +### Nan::ObjectProtoToString() + +A helper method for calling [`v8::Object#ObjectProtoToString()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab7a92b4dcf822bef72f6c0ac6fea1f0b) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::ObjectProtoToString(v8::Local obj); +``` + + + +### Nan::HasOwnProperty() + +A helper method for calling [`v8::Object#HasOwnProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab7b7245442ca6de1e1c145ea3fd653ff) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasOwnProperty(v8::Local obj, + v8::Local key); +``` + + + +### Nan::HasRealNamedProperty() + +A helper method for calling [`v8::Object#HasRealNamedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ad8b80a59c9eb3c1e6c3cd6c84571f767) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasRealNamedProperty(v8::Local obj, + v8::Local key); +``` + + + +### Nan::HasRealIndexedProperty() + +A helper method for calling [`v8::Object#HasRealIndexedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af94fc1135a5e74a2193fb72c3a1b9855) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasRealIndexedProperty(v8::Local obj, + uint32_t index); +``` + + + +### Nan::HasRealNamedCallbackProperty() + +A helper method for calling [`v8::Object#HasRealNamedCallbackProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af743b7ea132b89f84d34d164d0668811) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasRealNamedCallbackProperty( + v8::Local obj, + v8::Local key); +``` + + + +### Nan::GetRealNamedPropertyInPrototypeChain() + +A helper method for calling [`v8::Object#GetRealNamedPropertyInPrototypeChain()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a8700b1862e6b4783716964ba4d5e6172) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetRealNamedPropertyInPrototypeChain( + v8::Local obj, + v8::Local key); +``` + + + +### Nan::GetRealNamedProperty() + +A helper method for calling [`v8::Object#GetRealNamedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a84471a824576a5994fdd0ffcbf99ccc0) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetRealNamedProperty(v8::Local obj, + v8::Local key); +``` + + + +### Nan::CallAsFunction() + +A helper method for calling [`v8::Object#CallAsFunction()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ad3ffc36f3dfc3592ce2a96bc047ee2cd) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CallAsFunction(v8::Local obj, + v8::Local recv, + int argc, + v8::Local argv[]); +``` + + + +### Nan::CallAsConstructor() + +A helper method for calling [`v8::Object#CallAsConstructor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a50d571de50d0b0dfb28795619d07a01b) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CallAsConstructor(v8::Local obj, + int argc, + v8::Local argv[]); +``` + + + +### Nan::GetSourceLine() + +A helper method for calling [`v8::Message#GetSourceLine()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#a849f7a6c41549d83d8159825efccd23a) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetSourceLine(v8::Local msg); +``` + + + +### Nan::GetLineNumber() + +A helper method for calling [`v8::Message#GetLineNumber()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#adbe46c10a88a6565f2732a2d2adf99b9) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetLineNumber(v8::Local msg); +``` + + + +### Nan::GetStartColumn() + +A helper method for calling [`v8::Message#GetStartColumn()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#a60ede616ba3822d712e44c7a74487ba6) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetStartColumn(v8::Local msg); +``` + + + +### Nan::GetEndColumn() + +A helper method for calling [`v8::Message#GetEndColumn()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#aaa004cf19e529da980bc19fcb76d93be) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::GetEndColumn(v8::Local msg); +``` + + + +### Nan::CloneElementAt() + +A helper method for calling [`v8::Array#CloneElementAt()`](https://v8docs.nodesource.com/node-4.8/d3/d32/classv8_1_1_array.html#a1d3a878d4c1c7cae974dd50a1639245e) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CloneElementAt(v8::Local array, uint32_t index); +``` + + +### Nan::HasPrivate() + +A helper method for calling [`v8::Object#HasPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af68a0b98066cfdeb8f943e98a40ba08d) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::HasPrivate(v8::Local object, v8::Local key); +``` + + +### Nan::GetPrivate() + +A helper method for calling [`v8::Object#GetPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a169f2da506acbec34deadd9149a1925a) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::GetPrivate(v8::Local object, v8::Local key); +``` + + +### Nan::SetPrivate() + +A helper method for calling [`v8::Object#SetPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ace1769b0f3b86bfe9fda1010916360ee) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::SetPrivate(v8::Local object, v8::Local key, v8::Local value); +``` + + +### Nan::DeletePrivate() + +A helper method for calling [`v8::Object#DeletePrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a138bb32a304f3982be02ad499693b8fd) in a way compatible across supported versions of V8. + +Signature: + +```c++ +Nan::Maybe Nan::DeletePrivate(v8::Local object, v8::Local key); +``` + + +### Nan::MakeMaybe() + +Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN. + +Synopsis: + +```c++ + MaybeLocal someNumber = MakeMaybe(New(3.141592654)); + MaybeLocal someString = MakeMaybe(New("probably")); +``` + +Signature: + +```c++ +template class MaybeMaybe> +Nan::MaybeLocal Nan::MakeMaybe(MaybeMaybe v); +``` diff --git a/node_modules/nan/doc/methods.md b/node_modules/nan/doc/methods.md new file mode 100644 index 0000000..f9a5af3 --- /dev/null +++ b/node_modules/nan/doc/methods.md @@ -0,0 +1,672 @@ +## JavaScript-accessible methods + +A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://github.com/v8/v8/wiki/Embedder%27s-Guide#templates) for further information. + +In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type. + +* **Method argument types** + - Nan::FunctionCallbackInfo + - Nan::PropertyCallbackInfo + - Nan::ReturnValue +* **Method declarations** + - Method declaration + - Getter declaration + - Setter declaration + - Property getter declaration + - Property setter declaration + - Property enumerator declaration + - Property deleter declaration + - Property query declaration + - Index getter declaration + - Index setter declaration + - Index enumerator declaration + - Index deleter declaration + - Index query declaration +* Method and template helpers + - Nan::SetMethod() + - Nan::SetPrototypeMethod() + - Nan::SetAccessor() + - Nan::SetNamedPropertyHandler() + - Nan::SetIndexedPropertyHandler() + - Nan::SetTemplate() + - Nan::SetPrototypeTemplate() + - Nan::SetInstanceTemplate() + - Nan::SetCallHandler() + - Nan::SetCallAsFunctionHandler() + + +### Nan::FunctionCallbackInfo + +`Nan::FunctionCallbackInfo` should be used in place of [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.16/dd/d0d/classv8_1_1_function_callback_info.html), even with older versions of Node where `v8::FunctionCallbackInfo` does not exist. + +Definition: + +```c++ +template class FunctionCallbackInfo { + public: + ReturnValue GetReturnValue() const; + v8::Local Callee(); // NOTE: Not available in NodeJS >= 10.0.0 + v8::Local Data(); + v8::Local Holder(); + bool IsConstructCall(); + int Length() const; + v8::Local operator[](int i) const; + v8::Local This() const; + v8::Isolate *GetIsolate() const; +}; +``` + +See the [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.16/dd/d0d/classv8_1_1_function_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from methods. + +**Note:** `FunctionCallbackInfo::Callee` is removed in Node.js after `10.0.0` because it is was deprecated in V8. Consider using `info.Data()` to pass any information you need. + + +### Nan::PropertyCallbackInfo + +`Nan::PropertyCallbackInfo` should be used in place of [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d7/dc5/classv8_1_1_property_callback_info.html), even with older versions of Node where `v8::PropertyCallbackInfo` does not exist. + +Definition: + +```c++ +template class PropertyCallbackInfo : public PropertyCallbackInfoBase { + public: + ReturnValue GetReturnValue() const; + v8::Isolate* GetIsolate() const; + v8::Local Data() const; + v8::Local This() const; + v8::Local Holder() const; +}; +``` + +See the [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d7/dc5/classv8_1_1_property_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from property accessor methods. + + +### Nan::ReturnValue + +`Nan::ReturnValue` is used in place of [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.16/da/da7/classv8_1_1_return_value.html) on both [`Nan::FunctionCallbackInfo`](#api_nan_function_callback_info) and [`Nan::PropertyCallbackInfo`](#api_nan_property_callback_info) as the return type of `GetReturnValue()`. + +Example usage: + +```c++ +void EmptyArray(const Nan::FunctionCallbackInfo& info) { + info.GetReturnValue().Set(Nan::New()); +} +``` + +Definition: + +```c++ +template class ReturnValue { + public: + // Handle setters + template void Set(const v8::Local &handle); + template void Set(const Nan::Global &handle); + + // Fast primitive setters + void Set(bool value); + void Set(double i); + void Set(int32_t i); + void Set(uint32_t i); + + // Fast JS primitive setters + void SetNull(); + void SetUndefined(); + void SetEmptyString(); + + // Convenience getter for isolate + v8::Isolate *GetIsolate() const; +}; +``` + +See the documentation on [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.16/da/da7/classv8_1_1_return_value.html) for further information on this. + + +### Method declaration + +JavaScript-accessible methods should be declared with the following signature to form a `Nan::FunctionCallback`: + +```c++ +typedef void(*FunctionCallback)(const FunctionCallbackInfo&); +``` + +Example: + +```c++ +void MethodName(const Nan::FunctionCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a method as one is implicitly created for you. + +**Example usage** + +```c++ +// .h: +class Foo : public Nan::ObjectWrap { + ... + + static void Bar(const Nan::FunctionCallbackInfo& info); + static void Baz(const Nan::FunctionCallbackInfo& info); +} + + +// .cc: +void Foo::Bar(const Nan::FunctionCallbackInfo& info) { + ... +} + +void Foo::Baz(const Nan::FunctionCallbackInfo& info) { + ... +} +``` + +A helper macro `NAN_METHOD(methodname)` exists, compatible with NAN v1 method declarations. + +**Example usage with `NAN_METHOD(methodname)`** + +```c++ +// .h: +class Foo : public Nan::ObjectWrap { + ... + + static NAN_METHOD(Bar); + static NAN_METHOD(Baz); +} + + +// .cc: +NAN_METHOD(Foo::Bar) { + ... +} + +NAN_METHOD(Foo::Baz) { + ... +} +``` + +Use [`Nan::SetPrototypeMethod`](#api_nan_set_prototype_method) to attach a method to a JavaScript function prototype or [`Nan::SetMethod`](#api_nan_set_method) to attach a method directly on a JavaScript object. + + +### Getter declaration + +JavaScript-accessible getters should be declared with the following signature to form a `Nan::GetterCallback`: + +```c++ +typedef void(*GetterCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void GetterName(v8::Local property, + const Nan::PropertyCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a getter as one is implicitly created for you. + +A helper macro `NAN_GETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on [Accessors](https://v8.dev/docs/embed#accessors). + + +### Setter declaration + +JavaScript-accessible setters should be declared with the following signature to form a Nan::SetterCallback: + +```c++ +typedef void(*SetterCallback)(v8::Local, + v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void SetterName(v8::Local property, + v8::Local value, + const Nan::PropertyCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a setter as one is implicitly created for you. + +A helper macro `NAN_SETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on [Accessors](https://v8.dev/docs/embed#accessors). + + +### Property getter declaration + +JavaScript-accessible property getters should be declared with the following signature to form a Nan::PropertyGetterCallback: + +```c++ +typedef void(*PropertyGetterCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyGetterName(v8::Local property, + const Nan::PropertyCallbackInfo& info) { + ... +} +``` + +You do not need to declare a new `HandleScope` within a property getter as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_GETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Property setter declaration + +JavaScript-accessible property setters should be declared with the following signature to form a Nan::PropertySetterCallback: + +```c++ +typedef void(*PropertySetterCallback)(v8::Local, + v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertySetterName(v8::Local property, + v8::Local value, + const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property setter as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_SETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Property enumerator declaration + +JavaScript-accessible property enumerators should be declared with the following signature to form a Nan::PropertyEnumeratorCallback: + +```c++ +typedef void(*PropertyEnumeratorCallback)(const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyEnumeratorName(const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property enumerator as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Property deleter declaration + +JavaScript-accessible property deleters should be declared with the following signature to form a Nan::PropertyDeleterCallback: + +```c++ +typedef void(*PropertyDeleterCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyDeleterName(v8::Local property, + const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property deleter as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_DELETER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Property query declaration + +JavaScript-accessible property query methods should be declared with the following signature to form a Nan::PropertyQueryCallback: + +```c++ +typedef void(*PropertyQueryCallback)(v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void PropertyQueryName(v8::Local property, + const Nan::PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a property query method as one is implicitly created for you. + +A helper macro `NAN_PROPERTY_QUERY(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on named property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Index getter declaration + +JavaScript-accessible index getter methods should be declared with the following signature to form a Nan::IndexGetterCallback: + +```c++ +typedef void(*IndexGetterCallback)(uint32_t, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexGetterName(uint32_t index, const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index getter as one is implicitly created for you. + +A helper macro `NAN_INDEX_GETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Index setter declaration + +JavaScript-accessible index setter methods should be declared with the following signature to form a Nan::IndexSetterCallback: + +```c++ +typedef void(*IndexSetterCallback)(uint32_t, + v8::Local, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexSetterName(uint32_t index, + v8::Local value, + const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index setter as one is implicitly created for you. + +A helper macro `NAN_INDEX_SETTER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Index enumerator declaration + +JavaScript-accessible index enumerator methods should be declared with the following signature to form a Nan::IndexEnumeratorCallback: + +```c++ +typedef void(*IndexEnumeratorCallback)(const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexEnumeratorName(const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index enumerator as one is implicitly created for you. + +A helper macro `NAN_INDEX_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Index deleter declaration + +JavaScript-accessible index deleter methods should be declared with the following signature to form a Nan::IndexDeleterCallback: + +```c++ +typedef void(*IndexDeleterCallback)(uint32_t, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexDeleterName(uint32_t index, const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index deleter as one is implicitly created for you. + +A helper macro `NAN_INDEX_DELETER(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Index query declaration + +JavaScript-accessible index query methods should be declared with the following signature to form a Nan::IndexQueryCallback: + +```c++ +typedef void(*IndexQueryCallback)(uint32_t, + const PropertyCallbackInfo&); +``` + +Example: + +```c++ +void IndexQueryName(uint32_t index, const PropertyCallbackInfo& info); +``` + +You do not need to declare a new `HandleScope` within a index query method as one is implicitly created for you. + +A helper macro `NAN_INDEX_QUERY(methodname)` exists, compatible with NAN v1 method declarations. + +Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://v8.dev/docs/embed#interceptors). + + +### Nan::SetMethod() + +Sets a method with a given name directly on a JavaScript object where the method has the `Nan::FunctionCallback` signature (see Method declaration). + +Signature: + +```c++ +void Nan::SetMethod(v8::Local recv, + const char *name, + Nan::FunctionCallback callback, + v8::Local data = v8::Local()) +void Nan::SetMethod(v8::Local templ, + const char *name, + Nan::FunctionCallback callback, + v8::Local data = v8::Local()) +``` + + +### Nan::SetPrototypeMethod() + +Sets a method with a given name on a `FunctionTemplate`'s prototype where the method has the `Nan::FunctionCallback` signature (see Method declaration). + +Signature: + +```c++ +void Nan::SetPrototypeMethod(v8::Local recv, + const char* name, + Nan::FunctionCallback callback, + v8::Local data = v8::Local()) +``` + + +### Nan::SetAccessor() + +Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see Getter declaration) and setters with the `Nan::SetterCallback` signature (see Setter declaration). + +Signature: + +```c++ +// The signature parameter was deprecated in Node 16 and subsequently removed +NAN_DEPRECATED void SetAccessor(v8::Local tpl, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + v8::AccessControl settings = v8::DEFAULT, + v8::PropertyAttribute attribute = v8::None, + imp::Sig signature = imp::Sig()); +void SetAccessor(v8::Local tpl, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + v8::AccessControl settings = v8::DEFAULT, + v8::PropertyAttribute attribute = v8::None); +bool SetAccessor(v8::Local obj, + v8::Local name, + Nan::GetterCallback getter, + Nan::SetterCallback setter = 0, + v8::Local data = v8::Local(), + v8::AccessControl settings = v8::DEFAULT, + v8::PropertyAttribute attribute = v8::None) +``` + +See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#aca0ed196f8a9adb1f68b1aadb6c9cd77) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ae91b3b56b357f285288c89fbddc46d1b) for further information about how to use `Nan::SetAccessor()`. + + +### Nan::SetNamedPropertyHandler() + +Sets named property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts: + +* Property getters with the `Nan::PropertyGetterCallback` signature (see Property getter declaration) +* Property setters with the `Nan::PropertySetterCallback` signature (see Property setter declaration) +* Property query methods with the `Nan::PropertyQueryCallback` signature (see Property query declaration) +* Property deleters with the `Nan::PropertyDeleterCallback` signature (see Property deleter declaration) +* Property enumerators with the `Nan::PropertyEnumeratorCallback` signature (see Property enumerator declaration) + +Signature: + +```c++ +void SetNamedPropertyHandler(v8::Local tpl, + Nan::PropertyGetterCallback getter, + Nan::PropertySetterCallback setter = 0, + Nan::PropertyQueryCallback query = 0, + Nan::PropertyDeleterCallback deleter = 0, + Nan::PropertyEnumeratorCallback enumerator = 0, + v8::Local data = v8::Local()) +``` + +See the V8 [`ObjectTemplate#SetNamedPropertyHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#a33b3ebd7de641f6cc6414b7de01fc1c7) for further information about how to use `Nan::SetNamedPropertyHandler()`. + + +### Nan::SetIndexedPropertyHandler() + +Sets indexed property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts: + +* Indexed property getters with the `Nan::IndexGetterCallback` signature (see Index getter declaration) +* Indexed property setters with the `Nan::IndexSetterCallback` signature (see Index setter declaration) +* Indexed property query methods with the `Nan::IndexQueryCallback` signature (see Index query declaration) +* Indexed property deleters with the `Nan::IndexDeleterCallback` signature (see Index deleter declaration) +* Indexed property enumerators with the `Nan::IndexEnumeratorCallback` signature (see Index enumerator declaration) + +Signature: + +```c++ +void SetIndexedPropertyHandler(v8::Local tpl, + Nan::IndexGetterCallback getter, + Nan::IndexSetterCallback setter = 0, + Nan::IndexQueryCallback query = 0, + Nan::IndexDeleterCallback deleter = 0, + Nan::IndexEnumeratorCallback enumerator = 0, + v8::Local data = v8::Local()) +``` + +See the V8 [`ObjectTemplate#SetIndexedPropertyHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#ac89f06d634add0e890452033f7d17ff1) for further information about how to use `Nan::SetIndexedPropertyHandler()`. + + +### Nan::SetTemplate() + +Adds properties on an `Object`'s or `Function`'s template. + +Signature: + +```c++ +void Nan::SetTemplate(v8::Local templ, + const char *name, + v8::Local value); +void Nan::SetTemplate(v8::Local templ, + v8::Local name, + v8::Local value, + v8::PropertyAttribute attributes) +``` + +Calls the `Template`'s [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#ae3fbaff137557aa6a0233bc7e52214ac). + + +### Nan::SetPrototypeTemplate() + +Adds properties on an `Object`'s or `Function`'s prototype template. + +Signature: + +```c++ +void Nan::SetPrototypeTemplate(v8::Local templ, + const char *name, + v8::Local value); +void Nan::SetPrototypeTemplate(v8::Local templ, + v8::Local name, + v8::Local value, + v8::PropertyAttribute attributes) +``` + +Calls the `FunctionTemplate`'s _PrototypeTemplate's_ [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf). + + +### Nan::SetInstanceTemplate() + +Use to add instance properties on `FunctionTemplate`'s. + +Signature: + +```c++ +void Nan::SetInstanceTemplate(v8::Local templ, + const char *name, + v8::Local value); +void Nan::SetInstanceTemplate(v8::Local templ, + v8::Local name, + v8::Local value, + v8::PropertyAttribute attributes) +``` + +Calls the `FunctionTemplate`'s _InstanceTemplate's_ [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf). + + +### Nan::SetCallHandler() + +Set the call-handler callback for a `v8::FunctionTemplate`. +This callback is called whenever the function created from this FunctionTemplate is called. + +Signature: + +```c++ +void Nan::SetCallHandler(v8::Local templ, Nan::FunctionCallback callback, v8::Local data = v8::Local()) +``` + +Calls the `FunctionTemplate`'s [`SetCallHandler()`](https://v8docs.nodesource.com/node-8.16/d8/d83/classv8_1_1_function_template.html#ab7574b298db3c27fbc2ed465c08ea2f8). + + +### Nan::SetCallAsFunctionHandler() + +Sets the callback to be used when calling instances created from the `v8::ObjectTemplate` as a function. +If no callback is set, instances behave like normal JavaScript objects that cannot be called as a function. + +Signature: + +```c++ +void Nan::SetCallAsFunctionHandler(v8::Local templ, Nan::FunctionCallback callback, v8::Local data = v8::Local()) +``` + +Calls the `ObjectTemplate`'s [`SetCallAsFunctionHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#a5e9612fc80bf6db8f2da199b9b0bd04e). + diff --git a/node_modules/nan/doc/new.md b/node_modules/nan/doc/new.md new file mode 100644 index 0000000..0f28a0e --- /dev/null +++ b/node_modules/nan/doc/new.md @@ -0,0 +1,147 @@ +## New + +NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8. + + - Nan::New() + - Nan::Undefined() + - Nan::Null() + - Nan::True() + - Nan::False() + - Nan::EmptyString() + + + +### Nan::New() + +`Nan::New()` should be used to instantiate new JavaScript objects. + +Refer to the specific V8 type in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/d1/d83/classv8_1_1_data.html) for information on the types of arguments required for instantiation. + +Signatures: + +Return types are mostly omitted from the signatures for simplicity. In most cases the type will be contained within a `v8::Local`. The following types will be contained within a `Nan::MaybeLocal`: `v8::String`, `v8::Date`, `v8::RegExp`, `v8::Script`, `v8::UnboundScript`. + +Empty objects: + +```c++ +Nan::New(); +``` + +Generic single and multiple-argument: + +```c++ +Nan::New(A0 arg0); +Nan::New(A0 arg0, A1 arg1); +Nan::New(A0 arg0, A1 arg1, A2 arg2); +Nan::New(A0 arg0, A1 arg1, A2 arg2, A3 arg3); +``` + +For creating `v8::FunctionTemplate` and `v8::Function` objects: + +_The definition of `Nan::FunctionCallback` can be found in the [Method declaration](./methods.md#api_nan_method) documentation._ + +```c++ +Nan::New(Nan::FunctionCallback callback, + v8::Local data = v8::Local()); +Nan::New(Nan::FunctionCallback callback, + v8::Local data = v8::Local(), + A2 a2 = A2()); +``` + +Native number types: + +```c++ +v8::Local Nan::New(bool value); +v8::Local Nan::New(int32_t value); +v8::Local Nan::New(uint32_t value); +v8::Local Nan::New(double value); +``` + +String types: + +```c++ +Nan::MaybeLocal Nan::New(std::string const& value); +Nan::MaybeLocal Nan::New(const char * value, int length); +Nan::MaybeLocal Nan::New(const char * value); +Nan::MaybeLocal Nan::New(const uint16_t * value); +Nan::MaybeLocal Nan::New(const uint16_t * value, int length); +``` + +Specialized types: + +```c++ +v8::Local Nan::New(v8::String::ExternalStringResource * value); +v8::Local Nan::New(Nan::ExternalOneByteStringResource * value); +v8::Local Nan::New(v8::Local pattern, v8::RegExp::Flags flags); +``` + +Note that `Nan::ExternalOneByteStringResource` maps to [`v8::String::ExternalOneByteStringResource`](https://v8docs.nodesource.com/node-8.16/d9/db3/classv8_1_1_string_1_1_external_one_byte_string_resource.html), and `v8::String::ExternalAsciiStringResource` in older versions of V8. + + + +### Nan::Undefined() + +A helper method to reference the `v8::Undefined` object in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::Undefined() +``` + + +### Nan::Null() + +A helper method to reference the `v8::Null` object in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::Null() +``` + + +### Nan::True() + +A helper method to reference the `v8::Boolean` object representing the `true` value in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::True() +``` + + +### Nan::False() + +A helper method to reference the `v8::Boolean` object representing the `false` value in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::False() +``` + + +### Nan::EmptyString() + +Call [`v8::String::Empty`](https://v8docs.nodesource.com/node-8.16/d2/db3/classv8_1_1_string.html#a7c1bc8886115d7ee46f1d571dd6ebc6d) to reference the empty string in a way that is compatible across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::EmptyString() +``` + + + +### Nan::NewOneByteString() + +An implementation of [`v8::String::NewFromOneByte()`](https://v8docs.nodesource.com/node-8.16/d2/db3/classv8_1_1_string.html#a5264d50b96d2c896ce525a734dc10f09) provided for consistent availability and API across supported versions of V8. Allocates a new string from Latin-1 data. + +Signature: + +```c++ +Nan::MaybeLocal Nan::NewOneByteString(const uint8_t * value, + int length = -1) +``` diff --git a/node_modules/nan/doc/node_misc.md b/node_modules/nan/doc/node_misc.md new file mode 100644 index 0000000..17578e3 --- /dev/null +++ b/node_modules/nan/doc/node_misc.md @@ -0,0 +1,123 @@ +## Miscellaneous Node Helpers + + - Nan::AsyncResource + - Nan::MakeCallback() + - NAN_MODULE_INIT() + - Nan::Export() + + +### Nan::AsyncResource + +This class is analogous to the `AsyncResource` JavaScript class exposed by Node's [async_hooks][] API. + +When calling back into JavaScript asynchronously, special care must be taken to ensure that the runtime can properly track +async hops. `Nan::AsyncResource` is a class that provides an RAII wrapper around `node::EmitAsyncInit`, `node::EmitAsyncDestroy`, +and `node::MakeCallback`. Using this mechanism to call back into JavaScript, as opposed to `Nan::MakeCallback` or +`v8::Function::Call` ensures that the callback is executed in the correct async context. This ensures that async mechanisms +such as domains and [async_hooks][] function correctly. + +Definition: + +```c++ +class AsyncResource { + public: + AsyncResource(v8::Local name, + v8::Local resource = New()); + AsyncResource(const char* name, + v8::Local resource = New()); + ~AsyncResource(); + + v8::MaybeLocal runInAsyncScope(v8::Local target, + v8::Local func, + int argc, + v8::Local* argv); + v8::MaybeLocal runInAsyncScope(v8::Local target, + v8::Local symbol, + int argc, + v8::Local* argv); + v8::MaybeLocal runInAsyncScope(v8::Local target, + const char* method, + int argc, + v8::Local* argv); +}; +``` + +* `name`: Identifier for the kind of resource that is being provided for diagnostics information exposed by the [async_hooks][] + API. This will be passed to the possible `init` hook as the `type`. To avoid name collisions with other modules we recommend + that the name include the name of the owning module as a prefix. For example `mysql` module could use something like + `mysql:batch-db-query-resource`. +* `resource`: An optional object associated with the async work that will be passed to the possible [async_hooks][] + `init` hook. If this parameter is omitted, or an empty handle is provided, this object will be created automatically. +* When calling JS on behalf of this resource, one can use `runInAsyncScope`. This will ensure that the callback runs in the + correct async execution context. +* `AsyncDestroy` is automatically called when an AsyncResource object is destroyed. + +For more details, see the Node [async_hooks][] documentation. You might also want to take a look at the documentation for the +[N-API counterpart][napi]. For example usage, see the `asyncresource.cpp` example in the `test/cpp` directory. + + +### Nan::MakeCallback() + +Deprecated wrappers around the legacy `node::MakeCallback()` APIs. Node.js 10+ +has deprecated these legacy APIs as they do not provide a mechanism to preserve +async context. + +We recommend that you use the `AsyncResource` class and `AsyncResource::runInAsyncScope` instead of using `Nan::MakeCallback` or +`v8::Function#Call()` directly. `AsyncResource` properly takes care of running the callback in the correct async execution +context – something that is essential for functionality like domains, async_hooks and async debugging. + +Signatures: + +```c++ +NAN_DEPRECATED +v8::Local Nan::MakeCallback(v8::Local target, + v8::Local func, + int argc, + v8::Local* argv); +NAN_DEPRECATED +v8::Local Nan::MakeCallback(v8::Local target, + v8::Local symbol, + int argc, + v8::Local* argv); +NAN_DEPRECATED +v8::Local Nan::MakeCallback(v8::Local target, + const char* method, + int argc, + v8::Local* argv); +``` + + + +### NAN_MODULE_INIT() + +Used to define the entry point function to a Node add-on. Creates a function with a given `name` that receives a `target` object representing the equivalent of the JavaScript `exports` object. + +See example below. + + +### Nan::Export() + +A simple helper to register a `v8::FunctionTemplate` from a JavaScript-accessible method (see [Methods](./methods.md)) as a property on an object. Can be used in a way similar to assigning properties to `module.exports` in JavaScript. + +Signature: + +```c++ +void Export(v8::Local target, const char *name, Nan::FunctionCallback f) +``` + +Also available as the shortcut `NAN_EXPORT` macro. + +Example: + +```c++ +NAN_METHOD(Foo) { + ... +} + +NAN_MODULE_INIT(Init) { + NAN_EXPORT(target, Foo); +} +``` + +[async_hooks]: https://nodejs.org/dist/latest-v9.x/docs/api/async_hooks.html +[napi]: https://nodejs.org/dist/latest-v9.x/docs/api/n-api.html#n_api_custom_asynchronous_operations diff --git a/node_modules/nan/doc/object_wrappers.md b/node_modules/nan/doc/object_wrappers.md new file mode 100644 index 0000000..07d8c05 --- /dev/null +++ b/node_modules/nan/doc/object_wrappers.md @@ -0,0 +1,263 @@ +## Object Wrappers + +The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects. + + - Nan::ObjectWrap + + + +### Nan::ObjectWrap() + +A reimplementation of `node::ObjectWrap` that adds some API not present in older versions of Node. Should be preferred over `node::ObjectWrap` in all cases for consistency. + +Definition: + +```c++ +class ObjectWrap { + public: + ObjectWrap(); + + virtual ~ObjectWrap(); + + template + static inline T* Unwrap(v8::Local handle); + + inline v8::Local handle(); + + inline Nan::Persistent& persistent(); + + protected: + inline void Wrap(v8::Local handle); + + inline void MakeWeak(); + + /* Ref() marks the object as being attached to an event loop. + * Refed objects will not be garbage collected, even if + * all references are lost. + */ + virtual void Ref(); + + /* Unref() marks an object as detached from the event loop. This is its + * default state. When an object with a "weak" reference changes from + * attached to detached state it will be freed. Be careful not to access + * the object after making this call as it might be gone! + * (A "weak reference" means an object that only has a + * persistent handle.) + * + * DO NOT CALL THIS FROM DESTRUCTOR + */ + virtual void Unref(); + + int refs_; // ro +}; +``` + +See the Node documentation on [Wrapping C++ Objects](https://nodejs.org/api/addons.html#addons_wrapping_c_objects) for more details. + +### This vs. Holder + +When calling `Unwrap`, it is important that the argument is indeed some JavaScript object which got wrapped by a `Wrap` call for this class or any derived class. +The `Signature` installed by [`Nan::SetPrototypeMethod()`](methods.md#api_nan_set_prototype_method) does ensure that `info.Holder()` is just such an instance. +In Node 0.12 and later, `info.This()` will also be of such a type, since otherwise the invocation will get rejected. +However, in Node 0.10 and before it was possible to invoke a method on a JavaScript object which just had the extension type in its prototype chain. +In such a situation, calling `Unwrap` on `info.This()` will likely lead to a failed assertion causing a crash, but could lead to even more serious corruption. + +On the other hand, calling `Unwrap` in an [accessor](methods.md#api_nan_set_accessor) should not use `Holder()` if the accessor is defined on the prototype. +So either define your accessors on the instance template, +or use `This()` after verifying that it is indeed a valid object. + +### Examples + +#### Basic + +```c++ +class MyObject : public Nan::ObjectWrap { + public: + static NAN_MODULE_INIT(Init) { + v8::Local tpl = Nan::New(New); + tpl->SetClassName(Nan::New("MyObject").ToLocalChecked()); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + + Nan::SetPrototypeMethod(tpl, "getHandle", GetHandle); + Nan::SetPrototypeMethod(tpl, "getValue", GetValue); + + constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked()); + Nan::Set(target, Nan::New("MyObject").ToLocalChecked(), + Nan::GetFunction(tpl).ToLocalChecked()); + } + + private: + explicit MyObject(double value = 0) : value_(value) {} + ~MyObject() {} + + static NAN_METHOD(New) { + if (info.IsConstructCall()) { + double value = info[0]->IsUndefined() ? 0 : Nan::To(info[0]).FromJust(); + MyObject *obj = new MyObject(value); + obj->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); + } else { + const int argc = 1; + v8::Local argv[argc] = {info[0]}; + v8::Local cons = Nan::New(constructor()); + info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); + } + } + + static NAN_METHOD(GetHandle) { + MyObject* obj = Nan::ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(obj->handle()); + } + + static NAN_METHOD(GetValue) { + MyObject* obj = Nan::ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(obj->value_); + } + + static inline Nan::Persistent & constructor() { + static Nan::Persistent my_constructor; + return my_constructor; + } + + double value_; +}; + +NODE_MODULE(objectwrapper, MyObject::Init) +``` + +To use in Javascript: + +```Javascript +var objectwrapper = require('bindings')('objectwrapper'); + +var obj = new objectwrapper.MyObject(5); +console.log('Should be 5: ' + obj.getValue()); +``` + +#### Factory of wrapped objects + +```c++ +class MyFactoryObject : public Nan::ObjectWrap { + public: + static NAN_MODULE_INIT(Init) { + v8::Local tpl = Nan::New(New); + tpl->InstanceTemplate()->SetInternalFieldCount(1); + + Nan::SetPrototypeMethod(tpl, "getValue", GetValue); + + constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked()); + } + + static NAN_METHOD(NewInstance) { + v8::Local cons = Nan::New(constructor()); + double value = info[0]->IsNumber() ? Nan::To(info[0]).FromJust() : 0; + const int argc = 1; + v8::Local argv[1] = {Nan::New(value)}; + info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); + } + + // Needed for the next example: + inline double value() const { + return value_; + } + + private: + explicit MyFactoryObject(double value = 0) : value_(value) {} + ~MyFactoryObject() {} + + static NAN_METHOD(New) { + if (info.IsConstructCall()) { + double value = info[0]->IsNumber() ? Nan::To(info[0]).FromJust() : 0; + MyFactoryObject * obj = new MyFactoryObject(value); + obj->Wrap(info.This()); + info.GetReturnValue().Set(info.This()); + } else { + const int argc = 1; + v8::Local argv[argc] = {info[0]}; + v8::Local cons = Nan::New(constructor()); + info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked()); + } + } + + static NAN_METHOD(GetValue) { + MyFactoryObject* obj = ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(obj->value_); + } + + static inline Nan::Persistent & constructor() { + static Nan::Persistent my_constructor; + return my_constructor; + } + + double value_; +}; + +NAN_MODULE_INIT(Init) { + MyFactoryObject::Init(target); + Nan::Set(target, + Nan::New("newFactoryObjectInstance").ToLocalChecked(), + Nan::GetFunction( + Nan::New(MyFactoryObject::NewInstance)).ToLocalChecked() + ); +} + +NODE_MODULE(wrappedobjectfactory, Init) +``` + +To use in Javascript: + +```Javascript +var wrappedobjectfactory = require('bindings')('wrappedobjectfactory'); + +var obj = wrappedobjectfactory.newFactoryObjectInstance(10); +console.log('Should be 10: ' + obj.getValue()); +``` + +#### Passing wrapped objects around + +Use the `MyFactoryObject` class above along with the following: + +```c++ +static NAN_METHOD(Sum) { + Nan::MaybeLocal maybe1 = Nan::To(info[0]); + Nan::MaybeLocal maybe2 = Nan::To(info[1]); + + // Quick check: + if (maybe1.IsEmpty() || maybe2.IsEmpty()) { + // return value is undefined by default + return; + } + + MyFactoryObject* obj1 = + Nan::ObjectWrap::Unwrap(maybe1.ToLocalChecked()); + MyFactoryObject* obj2 = + Nan::ObjectWrap::Unwrap(maybe2.ToLocalChecked()); + + info.GetReturnValue().Set(Nan::New(obj1->value() + obj2->value())); +} + +NAN_MODULE_INIT(Init) { + MyFactoryObject::Init(target); + Nan::Set(target, + Nan::New("newFactoryObjectInstance").ToLocalChecked(), + Nan::GetFunction( + Nan::New(MyFactoryObject::NewInstance)).ToLocalChecked() + ); + Nan::Set(target, + Nan::New("sum").ToLocalChecked(), + Nan::GetFunction(Nan::New(Sum)).ToLocalChecked() + ); +} + +NODE_MODULE(myaddon, Init) +``` + +To use in Javascript: + +```Javascript +var myaddon = require('bindings')('myaddon'); + +var obj1 = myaddon.newFactoryObjectInstance(5); +var obj2 = myaddon.newFactoryObjectInstance(10); +console.log('sum of object values: ' + myaddon.sum(obj1, obj2)); +``` diff --git a/node_modules/nan/doc/persistent.md b/node_modules/nan/doc/persistent.md new file mode 100644 index 0000000..9a7bb94 --- /dev/null +++ b/node_modules/nan/doc/persistent.md @@ -0,0 +1,296 @@ +## Persistent references + +An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed. + +Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported. + + - Nan::PersistentBase & v8::PersistentBase + - Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits + - Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits + - Nan::Persistent + - Nan::Global + - Nan::WeakCallbackInfo + - Nan::WeakCallbackType + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://v8.dev/docs/embed#handles-and-garbage-collection). + + +### Nan::PersistentBase & v8::PersistentBase + +A persistent handle contains a reference to a storage cell in V8 which holds an object value and which is updated by the garbage collector whenever the object is moved. A new storage cell can be created using the constructor or `Nan::PersistentBase::Reset()`. Existing handles can be disposed using an argument-less `Nan::PersistentBase::Reset()`. + +Definition: + +_(note: this is implemented as `Nan::PersistentBase` for older versions of V8 and the native `v8::PersistentBase` is used for newer versions of V8)_ + +```c++ +template class PersistentBase { + public: + /** + * If non-empty, destroy the underlying storage cell + */ + void Reset(); + + /** + * If non-empty, destroy the underlying storage cell and create a new one with + * the contents of another if it is also non-empty + */ + template void Reset(const v8::Local &other); + + /** + * If non-empty, destroy the underlying storage cell and create a new one with + * the contents of another if it is also non-empty + */ + template void Reset(const PersistentBase &other); + + /** Returns true if the handle is empty. */ + bool IsEmpty() const; + + /** + * If non-empty, destroy the underlying storage cell + * IsEmpty() will return true after this call. + */ + void Empty(); + + template bool operator==(const PersistentBase &that); + + template bool operator==(const v8::Local &that); + + template bool operator!=(const PersistentBase &that); + + template bool operator!=(const v8::Local &that); + + /** + * Install a finalization callback on this object. + * NOTE: There is no guarantee as to *when* or even *if* the callback is + * invoked. The invocation is performed solely on a best effort basis. + * As always, GC-based finalization should *not* be relied upon for any + * critical form of resource management! At the moment you can either + * specify a parameter for the callback or the location of two internal + * fields in the dying object. + */ + template + void SetWeak(P *parameter, + typename WeakCallbackInfo

::Callback callback, + WeakCallbackType type); + + void ClearWeak(); + + /** + * Marks the reference to this object independent. Garbage collector is free + * to ignore any object groups containing this object. Weak callback for an + * independent handle should not assume that it will be preceded by a global + * GC prologue callback or followed by a global GC epilogue callback. + */ + void MarkIndependent() const; + + bool IsIndependent() const; + + /** Checks if the handle holds the only reference to an object. */ + bool IsNearDeath() const; + + /** Returns true if the handle's reference is weak. */ + bool IsWeak() const +}; +``` + +See the V8 documentation for [`PersistentBase`](https://v8docs.nodesource.com/node-8.16/d4/dca/classv8_1_1_persistent_base.html) for further information. + +**Tip:** To get a `v8::Local` reference to the original object back from a `PersistentBase` or `Persistent` object: + +```c++ +v8::Local object = Nan::New(persistent); +``` + + +### Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits + +Default traits for `Nan::Persistent`. This class does not allow use of the a copy constructor or assignment operator. At present `kResetInDestructor` is not set, but that will change in a future version. + +Definition: + +_(note: this is implemented as `Nan::NonCopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_ + +```c++ +template class NonCopyablePersistentTraits { + public: + typedef Persistent > NonCopyablePersistent; + + static const bool kResetInDestructor = false; + + template + static void Copy(const Persistent &source, + NonCopyablePersistent *dest); + + template static void Uncompilable(); +}; +``` + +See the V8 documentation for [`NonCopyablePersistentTraits`](https://v8docs.nodesource.com/node-8.16/de/d73/classv8_1_1_non_copyable_persistent_traits.html) for further information. + + +### Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits + +A helper class of traits to allow copying and assignment of `Persistent`. This will clone the contents of storage cell, but not any of the flags, etc.. + +Definition: + +_(note: this is implemented as `Nan::CopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_ + +```c++ +template +class CopyablePersistentTraits { + public: + typedef Persistent > CopyablePersistent; + + static const bool kResetInDestructor = true; + + template + static void Copy(const Persistent &source, + CopyablePersistent *dest); +}; +``` + +See the V8 documentation for [`CopyablePersistentTraits`](https://v8docs.nodesource.com/node-8.16/da/d5c/structv8_1_1_copyable_persistent_traits.html) for further information. + + +### Nan::Persistent + +A type of `PersistentBase` which allows copy and assignment. Copy, assignment and destructor behavior is controlled by the traits class `M`. + +Definition: + +```c++ +template > +class Persistent; + +template class Persistent : public PersistentBase { + public: + /** + * A Persistent with no storage cell. + */ + Persistent(); + + /** + * Construct a Persistent from a v8::Local. When the v8::Local is non-empty, a + * new storage cell is created pointing to the same object, and no flags are + * set. + */ + template Persistent(v8::Local that); + + /** + * Construct a Persistent from a Persistent. When the Persistent is non-empty, + * a new storage cell is created pointing to the same object, and no flags are + * set. + */ + Persistent(const Persistent &that); + + /** + * The copy constructors and assignment operator create a Persistent exactly + * as the Persistent constructor, but the Copy function from the traits class + * is called, allowing the setting of flags based on the copied Persistent. + */ + Persistent &operator=(const Persistent &that); + + template + Persistent &operator=(const Persistent &that); + + /** + * The destructor will dispose the Persistent based on the kResetInDestructor + * flags in the traits class. Since not calling dispose can result in a + * memory leak, it is recommended to always set this flag. + */ + ~Persistent(); +}; +``` + +See the V8 documentation for [`Persistent`](https://v8docs.nodesource.com/node-8.16/d2/d78/classv8_1_1_persistent.html) for further information. + + +### Nan::Global + +A type of `PersistentBase` which has move semantics. + +```c++ +template class Global : public PersistentBase { + public: + /** + * A Global with no storage cell. + */ + Global(); + + /** + * Construct a Global from a v8::Local. When the v8::Local is non-empty, a new + * storage cell is created pointing to the same object, and no flags are set. + */ + template Global(v8::Local that); + /** + * Construct a Global from a PersistentBase. When the Persistent is non-empty, + * a new storage cell is created pointing to the same object, and no flags are + * set. + */ + template Global(const PersistentBase &that); + + /** + * Pass allows returning globals from functions, etc. + */ + Global Pass(); +}; +``` + +See the V8 documentation for [`Global`](https://v8docs.nodesource.com/node-8.16/d5/d40/classv8_1_1_global.html) for further information. + + +### Nan::WeakCallbackInfo + +`Nan::WeakCallbackInfo` is used as an argument when setting a persistent reference as weak. You may need to free any external resources attached to the object. It is a mirror of `v8:WeakCallbackInfo` as found in newer versions of V8. + +Definition: + +```c++ +template class WeakCallbackInfo { + public: + typedef void (*Callback)(const WeakCallbackInfo& data); + + v8::Isolate *GetIsolate() const; + + /** + * Get the parameter that was associated with the weak handle. + */ + T *GetParameter() const; + + /** + * Get pointer from internal field, index can be 0 or 1. + */ + void *GetInternalField(int index) const; +}; +``` + +Example usage: + +```c++ +void weakCallback(const WeakCallbackInfo &data) { + int *parameter = data.GetParameter(); + delete parameter; +} + +Persistent obj; +int *data = new int(0); +obj.SetWeak(data, callback, WeakCallbackType::kParameter); +``` + +See the V8 documentation for [`WeakCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d8/d06/classv8_1_1_weak_callback_info.html) for further information. + + +### Nan::WeakCallbackType + +Represents the type of a weak callback. +A weak callback of type `kParameter` makes the supplied parameter to `Nan::PersistentBase::SetWeak` available through `WeakCallbackInfo::GetParameter`. +A weak callback of type `kInternalFields` uses up to two internal fields at indices 0 and 1 on the `Nan::PersistentBase` being made weak. +Note that only `v8::Object`s and derivatives can have internal fields. + +Definition: + +```c++ +enum class WeakCallbackType { kParameter, kInternalFields }; +``` diff --git a/node_modules/nan/doc/scopes.md b/node_modules/nan/doc/scopes.md new file mode 100644 index 0000000..84000ee --- /dev/null +++ b/node_modules/nan/doc/scopes.md @@ -0,0 +1,73 @@ +## Scopes + +A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works. + +A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope. + +The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these. + + - Nan::HandleScope + - Nan::EscapableHandleScope + +Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection). + + +### Nan::HandleScope + +A simple wrapper around [`v8::HandleScope`](https://v8docs.nodesource.com/node-8.16/d3/d95/classv8_1_1_handle_scope.html). + +Definition: + +```c++ +class Nan::HandleScope { + public: + Nan::HandleScope(); + static int NumberOfHandles(); +}; +``` + +Allocate a new `Nan::HandleScope` whenever you are creating new V8 JavaScript objects. Note that an implicit `HandleScope` is created for you on JavaScript-accessible methods so you do not need to insert one yourself. + +Example: + +```c++ +// new object is created, it needs a new scope: +void Pointless() { + Nan::HandleScope scope; + v8::Local obj = Nan::New(); +} + +// JavaScript-accessible method already has a HandleScope +NAN_METHOD(Pointless2) { + v8::Local obj = Nan::New(); +} +``` + + +### Nan::EscapableHandleScope + +Similar to [`Nan::HandleScope`](#api_nan_handle_scope) but should be used in cases where a function needs to return a V8 JavaScript type that has been created within it. + +Definition: + +```c++ +class Nan::EscapableHandleScope { + public: + Nan::EscapableHandleScope(); + static int NumberOfHandles(); + template v8::Local Escape(v8::Local value); +} +``` + +Use `Escape(value)` to return the object. + +Example: + +```c++ +v8::Local EmptyObj() { + Nan::EscapableHandleScope scope; + v8::Local obj = Nan::New(); + return scope.Escape(obj); +} +``` + diff --git a/node_modules/nan/doc/script.md b/node_modules/nan/doc/script.md new file mode 100644 index 0000000..301c1b3 --- /dev/null +++ b/node_modules/nan/doc/script.md @@ -0,0 +1,58 @@ +## Script + +NAN provides `v8::Script` helpers as the API has changed over the supported versions of V8. + + - Nan::CompileScript() + - Nan::RunScript() + - Nan::ScriptOrigin + + + +### Nan::CompileScript() + +A wrapper around [`v8::ScriptCompiler::Compile()`](https://v8docs.nodesource.com/node-8.16/da/da5/classv8_1_1_script_compiler.html#a93f5072a0db55d881b969e9fc98e564b). + +Note that `Nan::BoundScript` is an alias for `v8::Script`. + +Signature: + +```c++ +Nan::MaybeLocal Nan::CompileScript( + v8::Local s, + const v8::ScriptOrigin& origin); +Nan::MaybeLocal Nan::CompileScript(v8::Local s); +``` + + + +### Nan::RunScript() + +Calls `script->Run()` or `script->BindToCurrentContext()->Run(Nan::GetCurrentContext())`. + +Note that `Nan::BoundScript` is an alias for `v8::Script` and `Nan::UnboundScript` is an alias for `v8::UnboundScript` where available and `v8::Script` on older versions of V8. + +Signature: + +```c++ +Nan::MaybeLocal Nan::RunScript(v8::Local script) +Nan::MaybeLocal Nan::RunScript(v8::Local script) +``` + + +### Nan::ScriptOrigin + +A class transparently extending [`v8::ScriptOrigin`](https://v8docs.nodesource.com/node-16.0/db/d84/classv8_1_1_script_origin.html#pub-methods) +to provide backwards compatibility. Only the listed methods are guaranteed to +be available on all versions of Node. + +Declaration: + +```c++ +class Nan::ScriptOrigin : public v8::ScriptOrigin { + public: + ScriptOrigin(v8::Local name, v8::Local line = v8::Local(), v8::Local column = v8::Local()) + v8::Local ResourceName() const; + v8::Local ResourceLineOffset() const; + v8::Local ResourceColumnOffset() const; +} +``` diff --git a/node_modules/nan/doc/string_bytes.md b/node_modules/nan/doc/string_bytes.md new file mode 100644 index 0000000..7c1bd32 --- /dev/null +++ b/node_modules/nan/doc/string_bytes.md @@ -0,0 +1,62 @@ +## Strings & Bytes + +Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing. + + - Nan::Encoding + - Nan::Encode() + - Nan::DecodeBytes() + - Nan::DecodeWrite() + + + +### Nan::Encoding + +An enum representing the supported encoding types. A copy of `node::encoding` that is consistent across versions of Node. + +Definition: + +```c++ +enum Nan::Encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER } +``` + + + +### Nan::Encode() + +A wrapper around `node::Encode()` that provides a consistent implementation across supported versions of Node. + +Signature: + +```c++ +v8::Local Nan::Encode(const void *buf, + size_t len, + enum Nan::Encoding encoding = BINARY); +``` + + + +### Nan::DecodeBytes() + +A wrapper around `node::DecodeBytes()` that provides a consistent implementation across supported versions of Node. + +Signature: + +```c++ +ssize_t Nan::DecodeBytes(v8::Local val, + enum Nan::Encoding encoding = BINARY); +``` + + + +### Nan::DecodeWrite() + +A wrapper around `node::DecodeWrite()` that provides a consistent implementation across supported versions of Node. + +Signature: + +```c++ +ssize_t Nan::DecodeWrite(char *buf, + size_t len, + v8::Local val, + enum Nan::Encoding encoding = BINARY); +``` diff --git a/node_modules/nan/doc/v8_internals.md b/node_modules/nan/doc/v8_internals.md new file mode 100644 index 0000000..2e7c918 --- /dev/null +++ b/node_modules/nan/doc/v8_internals.md @@ -0,0 +1,199 @@ +## V8 internals + +The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods. + + - NAN_GC_CALLBACK() + - Nan::AddGCEpilogueCallback() + - Nan::RemoveGCEpilogueCallback() + - Nan::AddGCPrologueCallback() + - Nan::RemoveGCPrologueCallback() + - Nan::GetHeapStatistics() + - Nan::SetCounterFunction() + - Nan::SetCreateHistogramFunction() + - Nan::SetAddHistogramSampleFunction() + - Nan::IdleNotification() + - Nan::LowMemoryNotification() + - Nan::ContextDisposedNotification() + - Nan::GetInternalFieldPointer() + - Nan::SetInternalFieldPointer() + - Nan::AdjustExternalMemory() + + + +### NAN_GC_CALLBACK(callbackname) + +Use `NAN_GC_CALLBACK` to declare your callbacks for `Nan::AddGCPrologueCallback()` and `Nan::AddGCEpilogueCallback()`. Your new method receives the arguments `v8::GCType type` and `v8::GCCallbackFlags flags`. + +```c++ +static Nan::Persistent callback; + +NAN_GC_CALLBACK(gcPrologueCallback) { + v8::Local argv[] = { Nan::New("prologue").ToLocalChecked() }; + Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(callback), 1, argv); +} + +NAN_METHOD(Hook) { + callback.Reset(To(args[0]).ToLocalChecked()); + Nan::AddGCPrologueCallback(gcPrologueCallback); + info.GetReturnValue().Set(info.Holder()); +} +``` + + +### Nan::AddGCEpilogueCallback() + +Signature: + +```c++ +void Nan::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, v8::GCType gc_type_filter = v8::kGCTypeAll) +``` + +Calls V8's [`AddGCEpilogueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a580f976e4290cead62c2fc4dd396be3e). + + +### Nan::RemoveGCEpilogueCallback() + +Signature: + +```c++ +void Nan::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback) +``` + +Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#adca9294555a3908e9f23c7bb0f0f284c). + + +### Nan::AddGCPrologueCallback() + +Signature: + +```c++ +void Nan::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback, v8::GCType gc_type_filter callback) +``` + +Calls V8's [`AddGCPrologueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a6dbef303603ebdb03da6998794ea05b8). + + +### Nan::RemoveGCPrologueCallback() + +Signature: + +```c++ +void Nan::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback) +``` + +Calls V8's [`RemoveGCPrologueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a5f72c7cda21415ce062bbe5c58abe09e). + + +### Nan::GetHeapStatistics() + +Signature: + +```c++ +void Nan::GetHeapStatistics(v8::HeapStatistics *heap_statistics) +``` + +Calls V8's [`GetHeapStatistics()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a5593ac74687b713095c38987e5950b34). + + +### Nan::SetCounterFunction() + +Signature: + +```c++ +void Nan::SetCounterFunction(v8::CounterLookupCallback cb) +``` + +Calls V8's [`SetCounterFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a045d7754e62fa0ec72ae6c259b29af94). + + +### Nan::SetCreateHistogramFunction() + +Signature: + +```c++ +void Nan::SetCreateHistogramFunction(v8::CreateHistogramCallback cb) +``` + +Calls V8's [`SetCreateHistogramFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a542d67e85089cb3f92aadf032f99e732). + + +### Nan::SetAddHistogramSampleFunction() + +Signature: + +```c++ +void Nan::SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) +``` + +Calls V8's [`SetAddHistogramSampleFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#aeb420b690bc2c216882d6fdd00ddd3ea). + + +### Nan::IdleNotification() + +Signature: + +```c++ +NAN_DEPRECATED bool Nan::IdleNotification(int idle_time_in_ms) +``` + +Calls V8's [`IdleNotification()` or `IdleNotificationDeadline()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ad6a2a02657f5425ad460060652a5a118) depending on V8 version. Removed in V8 12.7.41. + + +### Nan::LowMemoryNotification() + +Signature: + +```c++ +void Nan::LowMemoryNotification() +``` + +Calls V8's [`LowMemoryNotification()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a24647f61d6b41f69668094bdcd6ea91f). + + +### Nan::ContextDisposedNotification() + +Signature: + +```c++ +void Nan::ContextDisposedNotification() +``` + +Calls V8's [`ContextDisposedNotification()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b). + + +### Nan::GetInternalFieldPointer() + +Gets a pointer to the internal field with at `index` from a V8 `Object` handle. + +Signature: + +```c++ +void* Nan::GetInternalFieldPointer(v8::Local object, int index) +``` + +Calls the Object's [`GetAlignedPointerFromInternalField()` or `GetPointerFromInternalField()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a580ea84afb26c005d6762eeb9e3c308f) depending on the version of V8. + + +### Nan::SetInternalFieldPointer() + +Sets the value of the internal field at `index` on a V8 `Object` handle. + +Signature: + +```c++ +void Nan::SetInternalFieldPointer(v8::Local object, int index, void* value) +``` + +Calls the Object's [`SetAlignedPointerInInternalField()` or `SetPointerInInternalField()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab3c57184263cf29963ef0017bec82281) depending on the version of V8. + + +### Nan::AdjustExternalMemory() + +Signature: + +```c++ +int Nan::AdjustExternalMemory(int bytesChange) +``` + +Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e). + diff --git a/node_modules/nan/doc/v8_misc.md b/node_modules/nan/doc/v8_misc.md new file mode 100644 index 0000000..1bd46d3 --- /dev/null +++ b/node_modules/nan/doc/v8_misc.md @@ -0,0 +1,85 @@ +## Miscellaneous V8 Helpers + + - Nan::Utf8String + - Nan::GetCurrentContext() + - Nan::SetIsolateData() + - Nan::GetIsolateData() + - Nan::TypedArrayContents + + + +### Nan::Utf8String + +Converts an object to a UTF-8-encoded character array. If conversion to a string fails (e.g. due to an exception in the toString() method of the object) then the length() method returns 0 and the * operator returns NULL. The underlying memory used for this object is managed by the object. + +An implementation of [`v8::String::Utf8Value`](https://v8docs.nodesource.com/node-8.16/d4/d1b/classv8_1_1_string_1_1_utf8_value.html) that is consistent across all supported versions of V8. + +Definition: + +```c++ +class Nan::Utf8String { + public: + Nan::Utf8String(v8::Local from); + + int length() const; + + char* operator*(); + const char* operator*() const; +}; +``` + + +### Nan::GetCurrentContext() + +A call to [`v8::Isolate::GetCurrent()->GetCurrentContext()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a81c7a1ed7001ae2a65e89107f75fd053) that works across all supported versions of V8. + +Signature: + +```c++ +v8::Local Nan::GetCurrentContext() +``` + + +### Nan::SetIsolateData() + +A helper to provide a consistent API to [`v8::Isolate#SetData()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a7acadfe7965997e9c386a05f098fbe36). + +Signature: + +```c++ +void Nan::SetIsolateData(v8::Isolate *isolate, T *data) +``` + + + +### Nan::GetIsolateData() + +A helper to provide a consistent API to [`v8::Isolate#GetData()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#aabd223436bc1100a787dadaa024c6257). + +Signature: + +```c++ +T *Nan::GetIsolateData(v8::Isolate *isolate) +``` + + +### Nan::TypedArrayContents + +A helper class for accessing the contents of an ArrayBufferView (aka a typedarray) from C++. If the input array is not a valid typedarray, then the data pointer of TypedArrayContents will default to `NULL` and the length will be 0. If the data pointer is not compatible with the alignment requirements of type, an assertion error will fail. + +Note that you must store a reference to the `array` object while you are accessing its contents. + +Definition: + +```c++ +template +class Nan::TypedArrayContents { + public: + TypedArrayContents(v8::Local array); + + size_t length() const; + + T* const operator*(); + const T* const operator*() const; +}; +``` diff --git a/node_modules/nan/include_dirs.js b/node_modules/nan/include_dirs.js new file mode 100644 index 0000000..4f1dfb4 --- /dev/null +++ b/node_modules/nan/include_dirs.js @@ -0,0 +1 @@ +console.log(require('path').relative('.', __dirname)); diff --git a/node_modules/nan/nan.h b/node_modules/nan/nan.h new file mode 100644 index 0000000..5f3f73d --- /dev/null +++ b/node_modules/nan/nan.h @@ -0,0 +1,3049 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors: + * - Rod Vagg + * - Benjamin Byholm + * - Trevor Norris + * - Nathan Rajlich + * - Brett Lawson + * - Ben Noordhuis + * - David Siegel + * - Michael Ira Krufky + * + * MIT License + * + * Version 2.22.2: current Node 22.14.0, Node 0.12: 0.12.18, Node 0.10: 0.10.48, iojs: 3.3.1 + * + * See https://github.com/nodejs/nan for the latest update to this file + **********************************************************************************/ + +#ifndef NAN_H_ +#define NAN_H_ + +#include + +#define NODE_0_10_MODULE_VERSION 11 +#define NODE_0_12_MODULE_VERSION 14 +#define ATOM_0_21_MODULE_VERSION 41 +#define IOJS_1_0_MODULE_VERSION 42 +#define IOJS_1_1_MODULE_VERSION 43 +#define IOJS_2_0_MODULE_VERSION 44 +#define IOJS_3_0_MODULE_VERSION 45 +#define NODE_4_0_MODULE_VERSION 46 +#define NODE_5_0_MODULE_VERSION 47 +#define NODE_6_0_MODULE_VERSION 48 +#define NODE_7_0_MODULE_VERSION 51 +#define NODE_8_0_MODULE_VERSION 57 +#define NODE_9_0_MODULE_VERSION 59 +#define NODE_10_0_MODULE_VERSION 64 +#define NODE_11_0_MODULE_VERSION 67 +#define NODE_12_0_MODULE_VERSION 72 +#define NODE_13_0_MODULE_VERSION 79 +#define NODE_14_0_MODULE_VERSION 83 +#define NODE_15_0_MODULE_VERSION 88 +#define NODE_16_0_MODULE_VERSION 93 +#define NODE_17_0_MODULE_VERSION 102 +#define NODE_18_0_MODULE_VERSION 108 +#define NODE_19_0_MODULE_VERSION 111 +#define NODE_20_0_MODULE_VERSION 115 + +#ifdef _MSC_VER +# define NAN_HAS_CPLUSPLUS_11 (_MSC_VER >= 1800) +#else +# define NAN_HAS_CPLUSPLUS_11 (__cplusplus >= 201103L) +#endif + +#if NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION && !NAN_HAS_CPLUSPLUS_11 +# error This version of node/NAN/v8 requires a C++11 compiler +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(_MSC_VER) +# pragma warning( push ) +# pragma warning( disable : 4530 ) +# include +# include +# include +# pragma warning( pop ) +#else +# include +# include +# include +#endif + +// uv helpers +#ifdef UV_VERSION_MAJOR +# ifndef UV_VERSION_PATCH +# define UV_VERSION_PATCH 0 +# endif +# define NAUV_UVVERSION ((UV_VERSION_MAJOR << 16) | \ + (UV_VERSION_MINOR << 8) | \ + (UV_VERSION_PATCH)) +#else +# define NAUV_UVVERSION 0x000b00 +#endif + +#if NAUV_UVVERSION < 0x000b0b +# ifdef WIN32 +# include +# else +# include +# endif +#endif + +namespace Nan { + +#define NAN_CONCAT(a, b) NAN_CONCAT_HELPER(a, b) +#define NAN_CONCAT_HELPER(a, b) a##b + +#define NAN_INLINE inline // TODO(bnoordhuis) Remove in v3.0.0. + +#if defined(__GNUC__) && \ + !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS) +# define NAN_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) && \ + !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS) +# define NAN_DEPRECATED __declspec(deprecated) +#else +# define NAN_DEPRECATED +#endif + +#if NAN_HAS_CPLUSPLUS_11 +# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete; +# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete; +# define NAN_DISALLOW_MOVE(CLASS) \ + CLASS(CLASS&&) = delete; /* NOLINT(build/c++11) */ \ + void operator=(CLASS&&) = delete; +#else +# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&); +# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&); +# define NAN_DISALLOW_MOVE(CLASS) +#endif + +#define NAN_DISALLOW_ASSIGN_COPY(CLASS) \ + NAN_DISALLOW_ASSIGN(CLASS) \ + NAN_DISALLOW_COPY(CLASS) + +#define NAN_DISALLOW_ASSIGN_MOVE(CLASS) \ + NAN_DISALLOW_ASSIGN(CLASS) \ + NAN_DISALLOW_MOVE(CLASS) + +#define NAN_DISALLOW_COPY_MOVE(CLASS) \ + NAN_DISALLOW_COPY(CLASS) \ + NAN_DISALLOW_MOVE(CLASS) + +#define NAN_DISALLOW_ASSIGN_COPY_MOVE(CLASS) \ + NAN_DISALLOW_ASSIGN(CLASS) \ + NAN_DISALLOW_COPY(CLASS) \ + NAN_DISALLOW_MOVE(CLASS) + +#define TYPE_CHECK(T, S) \ + while (false) { \ + *(static_cast(0)) = static_cast(0); \ + } + +//=== RegistrationFunction ===================================================== + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + typedef v8::Handle ADDON_REGISTER_FUNCTION_ARGS_TYPE; +#else + typedef v8::Local ADDON_REGISTER_FUNCTION_ARGS_TYPE; +#endif + +#define NAN_MODULE_INIT(name) \ + void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) + +#if NODE_MAJOR_VERSION >= 10 || \ + NODE_MAJOR_VERSION == 9 && NODE_MINOR_VERSION >= 3 +#define NAN_MODULE_WORKER_ENABLED(module_name, registration) \ + extern "C" NODE_MODULE_EXPORT void \ + NAN_CONCAT(node_register_module_v, NODE_MODULE_VERSION)( \ + v8::Local exports, v8::Local module, \ + v8::Local context) \ + { \ + registration(exports); \ + } +#else +#define NAN_MODULE_WORKER_ENABLED(module_name, registration) \ + NODE_MODULE(module_name, registration) +#endif + +//=== CallbackInfo ============================================================= + +#include "nan_callbacks.h" // NOLINT(build/include) + +//============================================================================== + +#if (NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION) +typedef v8::Script UnboundScript; +typedef v8::Script BoundScript; +#else +typedef v8::UnboundScript UnboundScript; +typedef v8::Script BoundScript; +#endif + +#if (NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION) +typedef v8::String::ExternalAsciiStringResource + ExternalOneByteStringResource; +#else +typedef v8::String::ExternalOneByteStringResource + ExternalOneByteStringResource; +#endif + +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) +template +class NonCopyablePersistentTraits : + public v8::NonCopyablePersistentTraits {}; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 10 || \ + (V8_MAJOR_VERSION == 10 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 5)) +template struct CopyablePersistentTraits { + typedef v8::Persistent > CopyablePersistent; + static const bool kResetInDestructor = true; + template + static NAN_INLINE void Copy(const v8::Persistent &source, + CopyablePersistent *dest) { + } +}; +#else +template +class CopyablePersistentTraits : + public v8::CopyablePersistentTraits {}; +#endif + +template +class PersistentBase : + public v8::PersistentBase {}; + +template > +class Persistent; +#else +template class NonCopyablePersistentTraits; +template class PersistentBase; +template class WeakCallbackData; +template > +class Persistent; +#endif // NODE_MODULE_VERSION + +template +class Maybe { + public: + inline bool IsNothing() const { return !has_value_; } + inline bool IsJust() const { return has_value_; } + + inline T ToChecked() const { return FromJust(); } + inline void Check() const { FromJust(); } + + inline bool To(T* out) const { + if (IsJust()) *out = value_; + return IsJust(); + } + + inline T FromJust() const { +#if defined(V8_ENABLE_CHECKS) + assert(IsJust() && "FromJust is Nothing"); +#endif // V8_ENABLE_CHECKS + return value_; + } + + inline T FromMaybe(const T& default_value) const { + return has_value_ ? value_ : default_value; + } + + inline bool operator==(const Maybe &other) const { + return (IsJust() == other.IsJust()) && + (!IsJust() || FromJust() == other.FromJust()); + } + + inline bool operator!=(const Maybe &other) const { + return !operator==(other); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + // Allow implicit conversions from v8::Maybe to Nan::Maybe. + Maybe(const v8::Maybe& that) // NOLINT(runtime/explicit) + : has_value_(that.IsJust()) + , value_(that.FromMaybe(T())) {} +#endif + + private: + Maybe() : has_value_(false) {} + explicit Maybe(const T& t) : has_value_(true), value_(t) {} + bool has_value_; + T value_; + + template + friend Maybe Nothing(); + template + friend Maybe Just(const U& u); +}; + +template +inline Maybe Nothing() { + return Maybe(); +} + +template +inline Maybe Just(const T& t) { + return Maybe(t); +} + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +# include "nan_maybe_43_inl.h" // NOLINT(build/include) +#else +# include "nan_maybe_pre_43_inl.h" // NOLINT(build/include) +#endif + +#include "nan_converters.h" // NOLINT(build/include) +#include "nan_new.h" // NOLINT(build/include) + +#if NAUV_UVVERSION < 0x000b17 +#define NAUV_WORK_CB(func) \ + void func(uv_async_t *async, int) +#else +#define NAUV_WORK_CB(func) \ + void func(uv_async_t *async) +#endif + +#if NAUV_UVVERSION >= 0x000b0b + +typedef uv_key_t nauv_key_t; + +inline int nauv_key_create(nauv_key_t *key) { + return uv_key_create(key); +} + +inline void nauv_key_delete(nauv_key_t *key) { + uv_key_delete(key); +} + +inline void* nauv_key_get(nauv_key_t *key) { + return uv_key_get(key); +} + +inline void nauv_key_set(nauv_key_t *key, void *value) { + uv_key_set(key, value); +} + +#else + +/* Implement thread local storage for older versions of libuv. + * This is essentially a backport of libuv commit 5d2434bf + * written by Ben Noordhuis, adjusted for names and inline. + */ + +#ifndef WIN32 + +typedef pthread_key_t nauv_key_t; + +inline int nauv_key_create(nauv_key_t* key) { + return -pthread_key_create(key, NULL); +} + +inline void nauv_key_delete(nauv_key_t* key) { + if (pthread_key_delete(*key)) + abort(); +} + +inline void* nauv_key_get(nauv_key_t* key) { + return pthread_getspecific(*key); +} + +inline void nauv_key_set(nauv_key_t* key, void* value) { + if (pthread_setspecific(*key, value)) + abort(); +} + +#else + +typedef struct { + DWORD tls_index; +} nauv_key_t; + +inline int nauv_key_create(nauv_key_t* key) { + key->tls_index = TlsAlloc(); + if (key->tls_index == TLS_OUT_OF_INDEXES) + return UV_ENOMEM; + return 0; +} + +inline void nauv_key_delete(nauv_key_t* key) { + if (TlsFree(key->tls_index) == FALSE) + abort(); + key->tls_index = TLS_OUT_OF_INDEXES; +} + +inline void* nauv_key_get(nauv_key_t* key) { + void* value = TlsGetValue(key->tls_index); + if (value == NULL) + if (GetLastError() != ERROR_SUCCESS) + abort(); + return value; +} + +inline void nauv_key_set(nauv_key_t* key, void* value) { + if (TlsSetValue(key->tls_index, value) == FALSE) + abort(); +} + +#endif +#endif + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION +template +v8::Local New(v8::Handle); +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + typedef v8::WeakCallbackType WeakCallbackType; +#else +struct WeakCallbackType { + enum E {kParameter, kInternalFields}; + E type; + WeakCallbackType(E other) : type(other) {} // NOLINT(runtime/explicit) + inline bool operator==(E other) { return other == this->type; } + inline bool operator!=(E other) { return !operator==(other); } +}; +#endif + +template class WeakCallbackInfo; + +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +# include "nan_persistent_12_inl.h" // NOLINT(build/include) +#else +# include "nan_persistent_pre_12_inl.h" // NOLINT(build/include) +#endif + +namespace imp { + static const size_t kMaxLength = 0x3fffffff; + // v8::String::REPLACE_INVALID_UTF8 was introduced + // in node.js v0.10.29 and v0.8.27. +#if NODE_MAJOR_VERSION > 0 || \ + NODE_MINOR_VERSION > 10 || \ + NODE_MINOR_VERSION == 10 && NODE_PATCH_VERSION >= 29 || \ + NODE_MINOR_VERSION == 8 && NODE_PATCH_VERSION >= 27 + static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8; +#else + static const unsigned kReplaceInvalidUtf8 = 0; +#endif +} // end of namespace imp + +//=== HandleScope ============================================================== + +class HandleScope { + v8::HandleScope scope; + + public: +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + inline HandleScope() : scope(v8::Isolate::GetCurrent()) {} + inline static int NumberOfHandles() { + return v8::HandleScope::NumberOfHandles(v8::Isolate::GetCurrent()); + } +#else + inline HandleScope() : scope() {} + inline static int NumberOfHandles() { + return v8::HandleScope::NumberOfHandles(); + } +#endif + + private: + // Make it hard to create heap-allocated or illegal handle scopes by + // disallowing certain operations. + HandleScope(const HandleScope &); + void operator=(const HandleScope &); + void *operator new(size_t size); + void operator delete(void *, size_t) { + abort(); + } +}; + +class EscapableHandleScope { + public: +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + inline EscapableHandleScope() : scope(v8::Isolate::GetCurrent()) {} + + inline static int NumberOfHandles() { + return v8::EscapableHandleScope::NumberOfHandles(v8::Isolate::GetCurrent()); + } + + template + inline v8::Local Escape(v8::Local value) { + return scope.Escape(value); + } + + private: + v8::EscapableHandleScope scope; +#else + inline EscapableHandleScope() : scope() {} + + inline static int NumberOfHandles() { + return v8::HandleScope::NumberOfHandles(); + } + + template + inline v8::Local Escape(v8::Local value) { + return scope.Close(value); + } + + private: + v8::HandleScope scope; +#endif + + private: + // Make it hard to create heap-allocated or illegal handle scopes by + // disallowing certain operations. + EscapableHandleScope(const EscapableHandleScope &); + void operator=(const EscapableHandleScope &); + void *operator new(size_t size); + void operator delete(void *, size_t) { + abort(); + } +}; + +//=== TryCatch ================================================================= + +class TryCatch { + v8::TryCatch try_catch_; + friend void FatalException(const TryCatch&); + + public: +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + TryCatch() : try_catch_(v8::Isolate::GetCurrent()) {} +#endif + + inline bool HasCaught() const { return try_catch_.HasCaught(); } + + inline bool CanContinue() const { return try_catch_.CanContinue(); } + + inline v8::Local ReThrow() { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + return New(try_catch_.ReThrow()); +#else + return try_catch_.ReThrow(); +#endif + } + + inline v8::Local Exception() const { + return try_catch_.Exception(); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + inline v8::MaybeLocal StackTrace() const { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(try_catch_.StackTrace(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); + } +#else + inline MaybeLocal StackTrace() const { + return try_catch_.StackTrace(); + } +#endif + + inline v8::Local Message() const { + return try_catch_.Message(); + } + + inline void Reset() { try_catch_.Reset(); } + + inline void SetVerbose(bool value) { try_catch_.SetVerbose(value); } + + inline void SetCaptureMessage(bool value) { + try_catch_.SetCaptureMessage(value); + } +}; + +v8::Local MakeCallback(v8::Local target, + v8::Local func, + int argc, + v8::Local* argv); +v8::Local MakeCallback(v8::Local target, + v8::Local symbol, + int argc, + v8::Local* argv); +v8::Local MakeCallback(v8::Local target, + const char* method, + int argc, + v8::Local* argv); + +// === AsyncResource =========================================================== + +class AsyncResource { + public: + AsyncResource( + v8::Local name + , v8::Local resource = New()) { +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + + if (resource.IsEmpty()) { + resource = New(); + } + + context = node::EmitAsyncInit(isolate, resource, name); +#endif + } + + AsyncResource( + const char* name + , v8::Local resource = New()) { +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + + if (resource.IsEmpty()) { + resource = New(); + } + + v8::Local name_string = + New(name).ToLocalChecked(); + context = node::EmitAsyncInit(isolate, resource, name_string); +#endif + } + + ~AsyncResource() { +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + node::EmitAsyncDestroy(isolate, context); +#endif + } + + inline MaybeLocal runInAsyncScope( + v8::Local target + , v8::Local func + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION + return MakeCallback(target, func, argc, argv); +#else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, func, argc, argv, context); +#endif + } + + inline MaybeLocal runInAsyncScope( + v8::Local target + , v8::Local symbol + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION + return MakeCallback(target, symbol, argc, argv); +#else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, symbol, argc, argv, context); +#endif + } + + inline MaybeLocal runInAsyncScope( + v8::Local target + , const char* method + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION + return MakeCallback(target, method, argc, argv); +#else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, method, argc, argv, context); +#endif + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncResource) +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + node::async_context context; +#endif +}; + +inline uv_loop_t* GetCurrentEventLoop() { +#if NODE_MAJOR_VERSION >= 10 || \ + NODE_MAJOR_VERSION == 9 && NODE_MINOR_VERSION >= 3 || \ + NODE_MAJOR_VERSION == 8 && NODE_MINOR_VERSION >= 10 + return node::GetCurrentEventLoop(v8::Isolate::GetCurrent()); +#else + return uv_default_loop(); +#endif +} + +//============ ================================================================= + +/* node 0.12 */ +#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION + inline + void SetCounterFunction(v8::CounterLookupCallback cb) { + v8::Isolate::GetCurrent()->SetCounterFunction(cb); + } + + inline + void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) { + v8::Isolate::GetCurrent()->SetCreateHistogramFunction(cb); + } + + inline + void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) { + v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb); + } + +#if defined(V8_MAJOR_VERSION) && \ + (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && \ + V8_MINOR_VERSION >= 7)) + NAN_DEPRECATED inline bool IdleNotification(int) { + return true; + } +# elif defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + NAN_DEPRECATED inline bool IdleNotification(int idle_time_in_ms) { + return v8::Isolate::GetCurrent()->IdleNotificationDeadline( + idle_time_in_ms * 0.001); + } +# else + NAN_DEPRECATED inline bool IdleNotification(int idle_time_in_ms) { + return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms); + } +#endif + + inline void LowMemoryNotification() { + v8::Isolate::GetCurrent()->LowMemoryNotification(); + } + + inline void ContextDisposedNotification() { + v8::Isolate::GetCurrent()->ContextDisposedNotification(); + } +#else + inline + void SetCounterFunction(v8::CounterLookupCallback cb) { + v8::V8::SetCounterFunction(cb); + } + + inline + void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) { + v8::V8::SetCreateHistogramFunction(cb); + } + + inline + void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) { + v8::V8::SetAddHistogramSampleFunction(cb); + } + + inline bool IdleNotification(int idle_time_in_ms) { + return v8::V8::IdleNotification(idle_time_in_ms); + } + + inline void LowMemoryNotification() { + v8::V8::LowMemoryNotification(); + } + + inline void ContextDisposedNotification() { + v8::V8::ContextDisposedNotification(); + } +#endif + +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) // Node 0.12 + inline v8::Local Undefined() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::Undefined(v8::Isolate::GetCurrent()))); +# else + return v8::Undefined(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local Null() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::Null(v8::Isolate::GetCurrent()))); +# else + return v8::Null(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local True() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::True(v8::Isolate::GetCurrent()))); +# else + return v8::True(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local False() { +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(v8::False(v8::Isolate::GetCurrent()))); +# else + return v8::False(v8::Isolate::GetCurrent()); +# endif + } + + inline v8::Local EmptyString() { + return v8::String::Empty(v8::Isolate::GetCurrent()); + } + + inline int AdjustExternalMemory(int bc) { + return static_cast( + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc)); + } + + inline void SetTemplate( + v8::Local templ + , const char *name + , v8::Local value) { + templ->Set(v8::Isolate::GetCurrent(), name, value); + } + + inline void SetTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes) { + templ->Set(name, value, attributes); + } + + inline v8::Local GetCurrentContext() { + return v8::Isolate::GetCurrent()->GetCurrentContext(); + } + + inline void* GetInternalFieldPointer( + v8::Local object + , int index) { + return object->GetAlignedPointerFromInternalField(index); + } + + inline void SetInternalFieldPointer( + v8::Local object + , int index + , void* value) { + object->SetAlignedPointerInInternalField(index, value); + } + +# define NAN_GC_CALLBACK(name) \ + void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags) + +#if NODE_MODULE_VERSION <= NODE_4_0_MODULE_VERSION + typedef v8::Isolate::GCEpilogueCallback GCEpilogueCallback; + typedef v8::Isolate::GCPrologueCallback GCPrologueCallback; +#else + typedef v8::Isolate::GCCallback GCEpilogueCallback; + typedef v8::Isolate::GCCallback GCPrologueCallback; +#endif + + inline void AddGCEpilogueCallback( + GCEpilogueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter); + } + + inline void RemoveGCEpilogueCallback( + GCEpilogueCallback callback) { + v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback); + } + + inline void AddGCPrologueCallback( + GCPrologueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter); + } + + inline void RemoveGCPrologueCallback( + GCPrologueCallback callback) { + v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback); + } + + inline void GetHeapStatistics( + v8::HeapStatistics *heap_statistics) { + v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics); + } + +# define X(NAME) \ + inline v8::Local NAME(const char *msg) { \ + EscapableHandleScope scope; \ + return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline \ + v8::Local NAME(v8::Local msg) { \ + return v8::Exception::NAME(msg); \ + } \ + \ + inline void Throw ## NAME(const char *msg) { \ + HandleScope scope; \ + v8::Isolate::GetCurrent()->ThrowException( \ + v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline void Throw ## NAME(v8::Local msg) { \ + HandleScope scope; \ + v8::Isolate::GetCurrent()->ThrowException( \ + v8::Exception::NAME(msg)); \ + } + + X(Error) + X(RangeError) + X(ReferenceError) + X(SyntaxError) + X(TypeError) + +# undef X + + inline void ThrowError(v8::Local error) { + v8::Isolate::GetCurrent()->ThrowException(error); + } + + inline MaybeLocal NewBuffer( + char *data + , size_t length +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + , node::Buffer::FreeCallback callback +#else + , node::smalloc::FreeCallback callback +#endif + , void *hint + ) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(length <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::New( + v8::Isolate::GetCurrent(), data, length, callback, hint); +#else + return node::Buffer::New(v8::Isolate::GetCurrent(), data, length, callback, + hint); +#endif + } + + inline MaybeLocal CopyBuffer( + const char *data + , uint32_t size + ) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::Copy( + v8::Isolate::GetCurrent(), data, size); +#else + return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); +#endif + } + + inline MaybeLocal NewBuffer(uint32_t size) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::New( + v8::Isolate::GetCurrent(), size); +#else + return node::Buffer::New(v8::Isolate::GetCurrent(), size); +#endif + } + + inline MaybeLocal NewBuffer( + char* data + , uint32_t size + ) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION + return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); +#else + return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size); +#endif + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + inline MaybeLocal + NewOneByteString(const uint8_t * value, int length = -1) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, + v8::NewStringType::kNormal, length); + } + + inline MaybeLocal CompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source source(s, origin); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source) + .FromMaybe(v8::Local())); + } + + inline MaybeLocal CompileScript( + v8::Local s + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source source(s); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source) + .FromMaybe(v8::Local())); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(script->BindToCurrentContext() + ->Run(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(script->Run(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); + } +#else + inline MaybeLocal + NewOneByteString(const uint8_t * value, int length = -1) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length); + } + + inline MaybeLocal CompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + v8::ScriptCompiler::Source source(s, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); + } + + inline MaybeLocal CompileScript( + v8::Local s + ) { + v8::ScriptCompiler::Source source(s); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + EscapableHandleScope scope; + return scope.Escape(script->BindToCurrentContext()->Run()); + } + + inline MaybeLocal RunScript( + v8::Local script + ) { + return script->Run(); + } +#endif + + NAN_DEPRECATED inline v8::Local MakeCallback( + v8::Local target + , v8::Local func + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(node::MakeCallback( + v8::Isolate::GetCurrent(), target, func, argc, argv))); +#else +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource res("nan:makeCallback"); + return res.runInAsyncScope(target, func, argc, argv) + .FromMaybe(v8::Local()); +# else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, func, argc, argv); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#endif // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + } + + NAN_DEPRECATED inline v8::Local MakeCallback( + v8::Local target + , v8::Local symbol + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(node::MakeCallback( + v8::Isolate::GetCurrent(), target, symbol, argc, argv))); +#else +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource res("nan:makeCallback"); + return res.runInAsyncScope(target, symbol, argc, argv) + .FromMaybe(v8::Local()); +# else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, symbol, argc, argv); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#endif // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + } + + NAN_DEPRECATED inline v8::Local MakeCallback( + v8::Local target + , const char* method + , int argc + , v8::Local* argv) { +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + return scope.Escape(New(node::MakeCallback( + v8::Isolate::GetCurrent(), target, method, argc, argv))); +#else +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource res("nan:makeCallback"); + return res.runInAsyncScope(target, method, argc, argv) + .FromMaybe(v8::Local()); +# else + return node::MakeCallback( + v8::Isolate::GetCurrent(), target, method, argc, argv); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#endif // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + } + + inline void FatalException(const TryCatch& try_catch) { + node::FatalException(v8::Isolate::GetCurrent(), try_catch.try_catch_); + } + + inline v8::Local ErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return node::ErrnoException(v8::Isolate::GetCurrent(), errorno, syscall, + message, path); + } + + NAN_DEPRECATED inline v8::Local NanErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return ErrnoException(errorno, syscall, message, path); + } + + template + inline void SetIsolateData( + v8::Isolate *isolate + , T *data + ) { + isolate->SetData(0, data); + } + + template + inline T *GetIsolateData( + v8::Isolate *isolate + ) { + return static_cast(isolate->GetData(0)); + } + +class Utf8String { + public: + inline explicit Utf8String(v8::Local from) : + length_(0), str_(str_st_) { + HandleScope scope; + if (!from.IsEmpty()) { +#if NODE_MAJOR_VERSION >= 10 + v8::Local context = GetCurrentContext(); + v8::Local string = + from->ToString(context).FromMaybe(v8::Local()); +#else + v8::Local string = from->ToString(); +#endif + if (!string.IsEmpty()) { + size_t len = 3 * string->Length() + 1; + assert(len <= INT_MAX); + if (len > sizeof (str_st_)) { + str_ = static_cast(malloc(len)); + assert(str_ != 0); + } + const int flags = + v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8; +#if NODE_MAJOR_VERSION >= 11 + length_ = string->WriteUtf8(v8::Isolate::GetCurrent(), str_, + static_cast(len), 0, flags); +#else + // See https://github.com/nodejs/nan/issues/832. + // Disable the warning as there is no way around it. +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + length_ = string->WriteUtf8(str_, static_cast(len), 0, flags); +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif +#endif // NODE_MAJOR_VERSION < 11 + str_[length_] = '\0'; + } + } + } + + inline int length() const { + return length_; + } + + inline char* operator*() { return str_; } + inline const char* operator*() const { return str_; } + + inline ~Utf8String() { + if (str_ != str_st_) { + free(str_); + } + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String) + + int length_; + char *str_; + char str_st_[1024]; +}; + +#else // Node 0.8 and 0.10 + inline v8::Local Undefined() { + EscapableHandleScope scope; + return scope.Escape(New(v8::Undefined())); + } + + inline v8::Local Null() { + EscapableHandleScope scope; + return scope.Escape(New(v8::Null())); + } + + inline v8::Local True() { + EscapableHandleScope scope; + return scope.Escape(New(v8::True())); + } + + inline v8::Local False() { + EscapableHandleScope scope; + return scope.Escape(New(v8::False())); + } + + inline v8::Local EmptyString() { + return v8::String::Empty(); + } + + inline int AdjustExternalMemory(int bc) { + return static_cast(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc)); + } + + inline void SetTemplate( + v8::Local templ + , const char *name + , v8::Local value) { + templ->Set(name, value); + } + + inline void SetTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes) { + templ->Set(name, value, attributes); + } + + inline v8::Local GetCurrentContext() { + return v8::Context::GetCurrent(); + } + + inline void* GetInternalFieldPointer( + v8::Local object + , int index) { + return object->GetPointerFromInternalField(index); + } + + inline void SetInternalFieldPointer( + v8::Local object + , int index + , void* value) { + object->SetPointerInInternalField(index, value); + } + +# define NAN_GC_CALLBACK(name) \ + void name(v8::GCType type, v8::GCCallbackFlags flags) + + inline void AddGCEpilogueCallback( + v8::GCEpilogueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::V8::AddGCEpilogueCallback(callback, gc_type_filter); + } + inline void RemoveGCEpilogueCallback( + v8::GCEpilogueCallback callback) { + v8::V8::RemoveGCEpilogueCallback(callback); + } + inline void AddGCPrologueCallback( + v8::GCPrologueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::V8::AddGCPrologueCallback(callback, gc_type_filter); + } + inline void RemoveGCPrologueCallback( + v8::GCPrologueCallback callback) { + v8::V8::RemoveGCPrologueCallback(callback); + } + inline void GetHeapStatistics( + v8::HeapStatistics *heap_statistics) { + v8::V8::GetHeapStatistics(heap_statistics); + } + +# define X(NAME) \ + inline v8::Local NAME(const char *msg) { \ + EscapableHandleScope scope; \ + return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline \ + v8::Local NAME(v8::Local msg) { \ + return v8::Exception::NAME(msg); \ + } \ + \ + inline void Throw ## NAME(const char *msg) { \ + HandleScope scope; \ + v8::ThrowException(v8::Exception::NAME(New(msg).ToLocalChecked())); \ + } \ + \ + inline \ + void Throw ## NAME(v8::Local errmsg) { \ + HandleScope scope; \ + v8::ThrowException(v8::Exception::NAME(errmsg)); \ + } + + X(Error) + X(RangeError) + X(ReferenceError) + X(SyntaxError) + X(TypeError) + +# undef X + + inline void ThrowError(v8::Local error) { + v8::ThrowException(error); + } + + inline MaybeLocal NewBuffer( + char *data + , size_t length + , node::Buffer::free_callback callback + , void *hint + ) { + EscapableHandleScope scope; + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(length <= imp::kMaxLength && "too large buffer"); + return scope.Escape( + New(node::Buffer::New(data, length, callback, hint)->handle_)); + } + + inline MaybeLocal CopyBuffer( + const char *data + , uint32_t size + ) { + EscapableHandleScope scope; + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); +#if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION + return scope.Escape(New(node::Buffer::New(data, size)->handle_)); +#else + return scope.Escape( + New(node::Buffer::New(const_cast(data), size)->handle_)); +#endif + } + + inline MaybeLocal NewBuffer(uint32_t size) { + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + EscapableHandleScope scope; + assert(size <= imp::kMaxLength && "too large buffer"); + return scope.Escape(New(node::Buffer::New(size)->handle_)); + } + + inline void FreeData(char *data, void *hint) { + (void) hint; // unused + delete[] data; + } + + inline MaybeLocal NewBuffer( + char* data + , uint32_t size + ) { + EscapableHandleScope scope; + // arbitrary buffer lengths requires + // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION + assert(size <= imp::kMaxLength && "too large buffer"); + return scope.Escape( + New(node::Buffer::New(data, size, FreeData, NULL)->handle_)); + } + +namespace imp { +inline void +widenString(std::vector *ws, const uint8_t *s, int l) { + size_t len = static_cast(l); + if (l < 0) { + len = strlen(reinterpret_cast(s)); + } + assert(len <= INT_MAX && "string too long"); + ws->resize(len); + std::copy(s, s + len, ws->begin()); // NOLINT(build/include_what_you_use) +} +} // end of namespace imp + + inline MaybeLocal + NewOneByteString(const uint8_t * value, int length = -1) { + std::vector wideString; // NOLINT(build/include_what_you_use) + imp::widenString(&wideString, value, length); + return v8::String::New(wideString.data(), + static_cast(wideString.size())); + } + + inline MaybeLocal CompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + return v8::Script::Compile(s, const_cast(&origin)); + } + + inline MaybeLocal CompileScript( + v8::Local s + ) { + return v8::Script::Compile(s); + } + + inline + MaybeLocal RunScript(v8::Local script) { + return script->Run(); + } + + inline v8::Local MakeCallback( + v8::Local target + , v8::Local func + , int argc + , v8::Local* argv) { + v8::HandleScope scope; + return scope.Close(New(node::MakeCallback(target, func, argc, argv))); + } + + inline v8::Local MakeCallback( + v8::Local target + , v8::Local symbol + , int argc + , v8::Local* argv) { + v8::HandleScope scope; + return scope.Close(New(node::MakeCallback(target, symbol, argc, argv))); + } + + inline v8::Local MakeCallback( + v8::Local target + , const char* method + , int argc + , v8::Local* argv) { + v8::HandleScope scope; + return scope.Close(New(node::MakeCallback(target, method, argc, argv))); + } + + inline void FatalException(const TryCatch& try_catch) { + node::FatalException(const_cast(try_catch.try_catch_)); + } + + inline v8::Local ErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return node::ErrnoException(errorno, syscall, message, path); + } + + NAN_DEPRECATED inline v8::Local NanErrnoException( + int errorno + , const char* syscall = NULL + , const char* message = NULL + , const char* path = NULL) { + return ErrnoException(errorno, syscall, message, path); + } + + + template + inline void SetIsolateData( + v8::Isolate *isolate + , T *data + ) { + isolate->SetData(data); + } + + template + inline T *GetIsolateData( + v8::Isolate *isolate + ) { + return static_cast(isolate->GetData()); + } + +class Utf8String { + public: + inline explicit Utf8String(v8::Local from) : + length_(0), str_(str_st_) { + v8::HandleScope scope; + if (!from.IsEmpty()) { + v8::Local string = from->ToString(); + if (!string.IsEmpty()) { + size_t len = 3 * string->Length() + 1; + assert(len <= INT_MAX); + if (len > sizeof (str_st_)) { + str_ = static_cast(malloc(len)); + assert(str_ != 0); + } + const int flags = + v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8; + length_ = string->WriteUtf8(str_, static_cast(len), 0, flags); + str_[length_] = '\0'; + } + } + } + + inline int length() const { + return length_; + } + + inline char* operator*() { return str_; } + inline const char* operator*() const { return str_; } + + inline ~Utf8String() { + if (str_ != str_st_) { + free(str_); + } + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String) + + int length_; + char *str_; + char str_st_[1024]; +}; + +#endif // NODE_MODULE_VERSION + +typedef void (*FreeCallback)(char *data, void *hint); + +typedef const FunctionCallbackInfo& NAN_METHOD_ARGS_TYPE; +typedef void NAN_METHOD_RETURN_TYPE; + +typedef const PropertyCallbackInfo& NAN_GETTER_ARGS_TYPE; +typedef void NAN_GETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& NAN_SETTER_ARGS_TYPE; +typedef void NAN_SETTER_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_GETTER_ARGS_TYPE; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_PROPERTY_GETTER_RETURN_TYPE; +#else +typedef void NAN_PROPERTY_GETTER_RETURN_TYPE; +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef const PropertyCallbackInfo& + NAN_PROPERTY_SETTER_ARGS_TYPE; +typedef v8::Intercepted NAN_PROPERTY_SETTER_RETURN_TYPE; +#else +typedef const PropertyCallbackInfo& + NAN_PROPERTY_SETTER_ARGS_TYPE; +typedef void NAN_PROPERTY_SETTER_RETURN_TYPE; +#endif + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_ENUMERATOR_ARGS_TYPE; +typedef void NAN_PROPERTY_ENUMERATOR_RETURN_TYPE; + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_DELETER_ARGS_TYPE; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_PROPERTY_DELETER_RETURN_TYPE; +#else +typedef void NAN_PROPERTY_DELETER_RETURN_TYPE; +#endif + + +typedef const PropertyCallbackInfo& + NAN_PROPERTY_QUERY_ARGS_TYPE; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_PROPERTY_QUERY_RETURN_TYPE; +#else +typedef void NAN_PROPERTY_QUERY_RETURN_TYPE; +#endif + +typedef const PropertyCallbackInfo& NAN_INDEX_GETTER_ARGS_TYPE; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_INDEX_GETTER_RETURN_TYPE; +#else +typedef void NAN_INDEX_GETTER_RETURN_TYPE; +#endif + + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef const PropertyCallbackInfo& NAN_INDEX_SETTER_ARGS_TYPE; +typedef v8::Intercepted NAN_INDEX_SETTER_RETURN_TYPE; +#else +typedef const PropertyCallbackInfo& NAN_INDEX_SETTER_ARGS_TYPE; +typedef void NAN_INDEX_SETTER_RETURN_TYPE; +#endif + +typedef const PropertyCallbackInfo& + NAN_INDEX_ENUMERATOR_ARGS_TYPE; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_INDEX_ENUMERATOR_RETURN_TYPE; +#else +typedef void NAN_INDEX_ENUMERATOR_RETURN_TYPE; +#endif + +typedef const PropertyCallbackInfo& + NAN_INDEX_DELETER_ARGS_TYPE; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_INDEX_DELETER_RETURN_TYPE; +#else +typedef void NAN_INDEX_DELETER_RETURN_TYPE; +#endif + +typedef const PropertyCallbackInfo& + NAN_INDEX_QUERY_ARGS_TYPE; +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted NAN_INDEX_QUERY_RETURN_TYPE; +#else +typedef void NAN_INDEX_QUERY_RETURN_TYPE; +#endif + +#define NAN_METHOD(name) \ + Nan::NAN_METHOD_RETURN_TYPE name(Nan::NAN_METHOD_ARGS_TYPE info) +#define NAN_GETTER(name) \ + Nan::NAN_GETTER_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_GETTER_ARGS_TYPE info) +#define NAN_SETTER(name) \ + Nan::NAN_SETTER_RETURN_TYPE name( \ + v8::Local property \ + , v8::Local value \ + , Nan::NAN_SETTER_ARGS_TYPE info) +#define NAN_PROPERTY_GETTER(name) \ + Nan::NAN_PROPERTY_GETTER_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info) +#define NAN_PROPERTY_SETTER(name) \ + Nan::NAN_PROPERTY_SETTER_RETURN_TYPE name( \ + v8::Local property \ + , v8::Local value \ + , Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info) +#define NAN_PROPERTY_ENUMERATOR(name) \ + Nan::NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name( \ + Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info) +#define NAN_PROPERTY_DELETER(name) \ + Nan::NAN_PROPERTY_DELETER_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_PROPERTY_DELETER_ARGS_TYPE info) +#define NAN_PROPERTY_QUERY(name) \ + Nan::NAN_PROPERTY_QUERY_RETURN_TYPE name( \ + v8::Local property \ + , Nan::NAN_PROPERTY_QUERY_ARGS_TYPE info) +# define NAN_INDEX_GETTER(name) \ + Nan::NAN_INDEX_GETTER_RETURN_TYPE name( \ + uint32_t index \ + , Nan::NAN_INDEX_GETTER_ARGS_TYPE info) +#define NAN_INDEX_SETTER(name) \ + Nan::NAN_INDEX_SETTER_RETURN_TYPE name( \ + uint32_t index \ + , v8::Local value \ + , Nan::NAN_INDEX_SETTER_ARGS_TYPE info) +#define NAN_INDEX_ENUMERATOR(name) \ + Nan::NAN_INDEX_ENUMERATOR_RETURN_TYPE \ + name(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info) +#define NAN_INDEX_DELETER(name) \ + Nan::NAN_INDEX_DELETER_RETURN_TYPE name( \ + uint32_t index \ + , Nan::NAN_INDEX_DELETER_ARGS_TYPE info) +#define NAN_INDEX_QUERY(name) \ + Nan::NAN_INDEX_QUERY_RETURN_TYPE name( \ + uint32_t index \ + , Nan::NAN_INDEX_QUERY_ARGS_TYPE info) + +class Callback { + public: + Callback() {} + + explicit Callback(const v8::Local &fn) : handle_(fn) {} + + ~Callback() { + handle_.Reset(); + } + + bool operator==(const Callback &other) const { + return handle_ == other.handle_; + } + + bool operator!=(const Callback &other) const { + return !operator==(other); + } + + inline + v8::Local operator*() const { return GetFunction(); } + + NAN_DEPRECATED inline v8::Local operator()( + v8::Local target + , int argc = 0 + , v8::Local argv[] = 0) const { +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource async("nan:Callback:operator()"); + return Call_(isolate, target, argc, argv, &async) + .FromMaybe(v8::Local()); +# else + return Call_(isolate, target, argc, argv); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#else + return Call_(target, argc, argv); +#endif // NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + } + + NAN_DEPRECATED inline v8::Local operator()( + int argc = 0 + , v8::Local argv[] = 0) const { +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource async("nan:Callback:operator()"); + return scope.Escape(Call_(isolate, isolate->GetCurrentContext()->Global(), + argc, argv, &async) + .FromMaybe(v8::Local())); +# else + return scope.Escape( + Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv)); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#else + v8::HandleScope scope; + return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv)); +#endif // NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + } + + inline MaybeLocal operator()( + AsyncResource* resource + , int argc = 0 + , v8::Local argv[] = 0) const { + return this->Call(argc, argv, resource); + } + + inline MaybeLocal operator()( + AsyncResource* resource + , v8::Local target + , int argc = 0 + , v8::Local argv[] = 0) const { + return this->Call(target, argc, argv, resource); + } + + // TODO(kkoopa): remove + inline void SetFunction(const v8::Local &fn) { + Reset(fn); + } + + inline void Reset(const v8::Local &fn) { + handle_.Reset(fn); + } + + inline void Reset() { + handle_.Reset(); + } + + inline v8::Local GetFunction() const { + return New(handle_); + } + + inline bool IsEmpty() const { + return handle_.IsEmpty(); + } + + // Deprecated: For async callbacks Use the versions that accept an + // AsyncResource. If this callback does not correspond to an async resource, + // that is, it is a synchronous function call on a non-empty JS stack, you + // should Nan::Call instead. + NAN_DEPRECATED inline v8::Local + Call(v8::Local target + , int argc + , v8::Local argv[]) const { +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource async("nan:Callback:Call"); + return Call_(isolate, target, argc, argv, &async) + .FromMaybe(v8::Local()); +# else + return Call_(isolate, target, argc, argv); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#else + return Call_(target, argc, argv); +#endif + } + + // Deprecated: For async callbacks Use the versions that accept an + // AsyncResource. If this callback does not correspond to an async resource, + // that is, it is a synchronous function call on a non-empty JS stack, you + // should Nan::Call instead. + NAN_DEPRECATED inline v8::Local + Call(int argc, v8::Local argv[]) const { +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); +# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + AsyncResource async("nan:Callback:Call"); + return scope.Escape(Call_(isolate, isolate->GetCurrentContext()->Global(), + argc, argv, &async) + .FromMaybe(v8::Local())); +# else + return scope.Escape( + Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv)); +# endif // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION +#else + v8::HandleScope scope; + return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv)); +#endif + } + + inline MaybeLocal + Call(v8::Local target + , int argc + , v8::Local argv[] + , AsyncResource* resource) const { +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + return Call_(isolate, target, argc, argv, resource); +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + return Call_(isolate, target, argc, argv); +#else + return Call_(target, argc, argv); +#endif + } + + inline MaybeLocal + Call(int argc, v8::Local argv[], AsyncResource* resource) const { +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + return Call(isolate->GetCurrentContext()->Global(), argc, argv, resource); +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv)); +#else + v8::HandleScope scope; + return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv)); +#endif + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(Callback) + Persistent handle_; + +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + MaybeLocal Call_(v8::Isolate *isolate + , v8::Local target + , int argc + , v8::Local argv[] + , AsyncResource* resource) const { + EscapableHandleScope scope; + v8::Local func = New(handle_); + auto maybe = resource->runInAsyncScope(target, func, argc, argv); + v8::Local local; + if (!maybe.ToLocal(&local)) return MaybeLocal(); + return scope.Escape(local); + } +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Local Call_(v8::Isolate *isolate + , v8::Local target + , int argc + , v8::Local argv[]) const { + EscapableHandleScope scope; + + v8::Local callback = New(handle_); +# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION + return scope.Escape(New(node::MakeCallback( + isolate + , target + , callback + , argc + , argv + ))); +# else + return scope.Escape(node::MakeCallback( + isolate + , target + , callback + , argc + , argv + )); +# endif + } +#else + v8::Local Call_(v8::Local target + , int argc + , v8::Local argv[]) const { + EscapableHandleScope scope; + + v8::Local callback = New(handle_); + return scope.Escape(New(node::MakeCallback( + target + , callback + , argc + , argv + ))); + } +#endif +}; + +inline MaybeLocal Call( + const Nan::Callback& callback + , v8::Local recv + , int argc + , v8::Local argv[]) { + return Call(*callback, recv, argc, argv); +} + +inline MaybeLocal Call( + const Nan::Callback& callback + , int argc + , v8::Local argv[]) { +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + Call(*callback, isolate->GetCurrentContext()->Global(), argc, argv) + .FromMaybe(v8::Local())); +#else + EscapableHandleScope scope; + return scope.Escape( + Call(*callback, v8::Context::GetCurrent()->Global(), argc, argv) + .FromMaybe(v8::Local())); +#endif +} + +inline MaybeLocal Call( + v8::Local symbol + , v8::Local recv + , int argc + , v8::Local argv[]) { + EscapableHandleScope scope; + v8::Local fn_v = + Get(recv, symbol).FromMaybe(v8::Local()); + if (fn_v.IsEmpty() || !fn_v->IsFunction()) return v8::Local(); + v8::Local fn = fn_v.As(); + return scope.Escape( + Call(fn, recv, argc, argv).FromMaybe(v8::Local())); +} + +inline MaybeLocal Call( + const char* method + , v8::Local recv + , int argc + , v8::Local argv[]) { + EscapableHandleScope scope; + v8::Local method_string = + New(method).ToLocalChecked(); + return scope.Escape( + Call(method_string, recv, argc, argv).FromMaybe(v8::Local())); +} + +/* abstract */ class AsyncWorker { + public: + explicit AsyncWorker(Callback *callback_, + const char* resource_name = "nan:AsyncWorker") + : callback(callback_), errmsg_(NULL) { + request.data = this; + + HandleScope scope; + v8::Local obj = New(); + persistentHandle.Reset(obj); + async_resource = new AsyncResource(resource_name, obj); + } + + virtual ~AsyncWorker() { + HandleScope scope; + + if (!persistentHandle.IsEmpty()) + persistentHandle.Reset(); + delete callback; + delete[] errmsg_; + delete async_resource; + } + + virtual void WorkComplete() { + HandleScope scope; + + if (errmsg_ == NULL) + HandleOKCallback(); + else + HandleErrorCallback(); + delete callback; + callback = NULL; + } + + inline void SaveToPersistent( + const char *key, const v8::Local &value) { + HandleScope scope; + Set(New(persistentHandle), New(key).ToLocalChecked(), value).FromJust(); + } + + inline void SaveToPersistent( + const v8::Local &key, const v8::Local &value) { + HandleScope scope; + Set(New(persistentHandle), key, value).FromJust(); + } + + inline void SaveToPersistent( + uint32_t index, const v8::Local &value) { + HandleScope scope; + Set(New(persistentHandle), index, value).FromJust(); + } + + inline v8::Local GetFromPersistent(const char *key) const { + EscapableHandleScope scope; + return scope.Escape( + Get(New(persistentHandle), New(key).ToLocalChecked()) + .FromMaybe(v8::Local())); + } + + inline v8::Local + GetFromPersistent(const v8::Local &key) const { + EscapableHandleScope scope; + return scope.Escape( + Get(New(persistentHandle), key) + .FromMaybe(v8::Local())); + } + + inline v8::Local GetFromPersistent(uint32_t index) const { + EscapableHandleScope scope; + return scope.Escape( + Get(New(persistentHandle), index) + .FromMaybe(v8::Local())); + } + + virtual void Execute() = 0; + + uv_work_t request; + + virtual void Destroy() { + delete this; + } + + protected: + Persistent persistentHandle; + Callback *callback; + AsyncResource *async_resource; + + virtual void HandleOKCallback() { + HandleScope scope; + + callback->Call(0, NULL, async_resource); + } + + virtual void HandleErrorCallback() { + HandleScope scope; + + v8::Local argv[] = { + v8::Exception::Error(New(ErrorMessage()).ToLocalChecked()) + }; + callback->Call(1, argv, async_resource); + } + + void SetErrorMessage(const char *msg) { + delete[] errmsg_; + + size_t size = strlen(msg) + 1; + errmsg_ = new char[size]; + memcpy(errmsg_, msg, size); + } + + const char* ErrorMessage() const { + return errmsg_; + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncWorker) + char *errmsg_; +}; + +/* abstract */ class AsyncBareProgressWorkerBase : public AsyncWorker { + public: + explicit AsyncBareProgressWorkerBase( + Callback *callback_, + const char* resource_name = "nan:AsyncBareProgressWorkerBase") + : AsyncWorker(callback_, resource_name) { + uv_async_init( + GetCurrentEventLoop() + , &async + , AsyncProgress_ + ); + async.data = this; + } + + virtual ~AsyncBareProgressWorkerBase() { + } + + virtual void WorkProgress() = 0; + + virtual void Destroy() { + uv_close(reinterpret_cast(&async), AsyncClose_); + } + + private: + inline static NAUV_WORK_CB(AsyncProgress_) { + AsyncBareProgressWorkerBase *worker = + static_cast(async->data); + worker->WorkProgress(); + } + + inline static void AsyncClose_(uv_handle_t* handle) { + AsyncBareProgressWorkerBase *worker = + static_cast(handle->data); + delete worker; + } + + protected: + uv_async_t async; +}; + +template +/* abstract */ +class AsyncBareProgressWorker : public AsyncBareProgressWorkerBase { + public: + explicit AsyncBareProgressWorker( + Callback *callback_, + const char* resource_name = "nan:AsyncBareProgressWorker") + : AsyncBareProgressWorkerBase(callback_, resource_name) { + uv_mutex_init(&async_lock); + } + + virtual ~AsyncBareProgressWorker() { + uv_mutex_destroy(&async_lock); + } + + class ExecutionProgress { + friend class AsyncBareProgressWorker; + public: + void Signal() const { + uv_mutex_lock(&that_->async_lock); + uv_async_send(&that_->async); + uv_mutex_unlock(&that_->async_lock); + } + + void Send(const T* data, size_t count) const { + that_->SendProgress_(data, count); + } + + private: + explicit ExecutionProgress(AsyncBareProgressWorker *that) : that_(that) {} + NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress) + AsyncBareProgressWorker* const that_; + }; + + virtual void Execute(const ExecutionProgress& progress) = 0; + virtual void HandleProgressCallback(const T *data, size_t size) = 0; + + protected: + uv_mutex_t async_lock; + + private: + void Execute() /*final override*/ { + ExecutionProgress progress(this); + Execute(progress); + } + + virtual void SendProgress_(const T *data, size_t count) = 0; +}; + +template +/* abstract */ +class AsyncProgressWorkerBase : public AsyncBareProgressWorker { + public: + explicit AsyncProgressWorkerBase( + Callback *callback_, + const char* resource_name = "nan:AsyncProgressWorkerBase") + : AsyncBareProgressWorker(callback_, resource_name), asyncdata_(NULL), + asyncsize_(0) { + } + + virtual ~AsyncProgressWorkerBase() { + delete[] asyncdata_; + } + + void WorkProgress() { + uv_mutex_lock(&this->async_lock); + T *data = asyncdata_; + size_t size = asyncsize_; + asyncdata_ = NULL; + asyncsize_ = 0; + uv_mutex_unlock(&this->async_lock); + + // Don't send progress events after we've already completed. + if (this->callback) { + this->HandleProgressCallback(data, size); + } + delete[] data; + } + + private: + void SendProgress_(const T *data, size_t count) { + T *new_data = new T[count]; + std::copy(data, data + count, new_data); + + uv_mutex_lock(&this->async_lock); + T *old_data = asyncdata_; + asyncdata_ = new_data; + asyncsize_ = count; + uv_async_send(&this->async); + uv_mutex_unlock(&this->async_lock); + + delete[] old_data; + } + + T *asyncdata_; + size_t asyncsize_; +}; + +// This ensures compatibility to the previous un-templated AsyncProgressWorker +// class definition. +typedef AsyncProgressWorkerBase AsyncProgressWorker; + +template +/* abstract */ +class AsyncBareProgressQueueWorker : public AsyncBareProgressWorkerBase { + public: + explicit AsyncBareProgressQueueWorker( + Callback *callback_, + const char* resource_name = "nan:AsyncBareProgressQueueWorker") + : AsyncBareProgressWorkerBase(callback_, resource_name) { + } + + virtual ~AsyncBareProgressQueueWorker() { + } + + class ExecutionProgress { + friend class AsyncBareProgressQueueWorker; + public: + void Send(const T* data, size_t count) const { + that_->SendProgress_(data, count); + } + + private: + explicit ExecutionProgress(AsyncBareProgressQueueWorker *that) + : that_(that) {} + NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress) + AsyncBareProgressQueueWorker* const that_; + }; + + virtual void Execute(const ExecutionProgress& progress) = 0; + virtual void HandleProgressCallback(const T *data, size_t size) = 0; + + private: + void Execute() /*final override*/ { + ExecutionProgress progress(this); + Execute(progress); + } + + virtual void SendProgress_(const T *data, size_t count) = 0; +}; + +template +/* abstract */ +class AsyncProgressQueueWorker : public AsyncBareProgressQueueWorker { + public: + explicit AsyncProgressQueueWorker( + Callback *callback_, + const char* resource_name = "nan:AsyncProgressQueueWorker") + : AsyncBareProgressQueueWorker(callback_) { + uv_mutex_init(&async_lock); + } + + virtual ~AsyncProgressQueueWorker() { + uv_mutex_lock(&async_lock); + + while (!asyncdata_.empty()) { + std::pair &datapair = asyncdata_.front(); + T *data = datapair.first; + + asyncdata_.pop(); + + delete[] data; + } + + uv_mutex_unlock(&async_lock); + uv_mutex_destroy(&async_lock); + } + + void WorkComplete() { + WorkProgress(); + AsyncWorker::WorkComplete(); + } + + void WorkProgress() { + uv_mutex_lock(&async_lock); + + while (!asyncdata_.empty()) { + std::pair &datapair = asyncdata_.front(); + + T *data = datapair.first; + size_t size = datapair.second; + + asyncdata_.pop(); + uv_mutex_unlock(&async_lock); + + // Don't send progress events after we've already completed. + if (this->callback) { + this->HandleProgressCallback(data, size); + } + + delete[] data; + + uv_mutex_lock(&async_lock); + } + + uv_mutex_unlock(&async_lock); + } + + private: + void SendProgress_(const T *data, size_t count) { + T *new_data = new T[count]; + std::copy(data, data + count, new_data); + + uv_mutex_lock(&async_lock); + asyncdata_.push(std::pair(new_data, count)); + uv_mutex_unlock(&async_lock); + + uv_async_send(&this->async); + } + + uv_mutex_t async_lock; + std::queue > asyncdata_; +}; + +inline void AsyncExecute (uv_work_t* req) { + AsyncWorker *worker = static_cast(req->data); + worker->Execute(); +} + +/* uv_after_work_cb has 1 argument before node-v0.9.4 and + * 2 arguments since node-v0.9.4 + * https://github.com/libuv/libuv/commit/92fb84b751e18f032c02609467f44bfe927b80c5 + */ +inline void AsyncExecuteComplete(uv_work_t *req) { + AsyncWorker* worker = static_cast(req->data); + worker->WorkComplete(); + worker->Destroy(); +} +inline void AsyncExecuteComplete (uv_work_t* req, int status) { + AsyncExecuteComplete(req); +} + +inline void AsyncQueueWorker (AsyncWorker* worker) { + uv_queue_work( + GetCurrentEventLoop() + , &worker->request + , AsyncExecute + , AsyncExecuteComplete + ); +} + +namespace imp { + +inline +ExternalOneByteStringResource const* +GetExternalResource(v8::Local str) { +#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION + return str->GetExternalAsciiStringResource(); +#else + return str->GetExternalOneByteStringResource(); +#endif +} + +inline +bool +IsExternal(v8::Local str) { +#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION + return str->IsExternalAscii(); +#else + return str->IsExternalOneByte(); +#endif +} + +} // end of namespace imp + +enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER}; + +#if NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION +# include "nan_string_bytes.h" // NOLINT(build/include) +#endif + +inline v8::Local Encode( + const void *buf, size_t len, enum Encoding encoding = BINARY) { +#if (NODE_MODULE_VERSION >= ATOM_0_21_MODULE_VERSION) + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + node::encoding node_enc = static_cast(encoding); + + if (encoding == UCS2) { + return node::Encode( + isolate + , reinterpret_cast(buf) + , len / 2); + } else { + return node::Encode( + isolate + , reinterpret_cast(buf) + , len + , node_enc); + } +#elif (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + return node::Encode( + v8::Isolate::GetCurrent() + , buf, len + , static_cast(encoding)); +#else +# if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION + return node::Encode(buf, len, static_cast(encoding)); +# else + return imp::Encode(reinterpret_cast(buf), len, encoding); +# endif +#endif +} + +inline ssize_t DecodeBytes( + v8::Local val, enum Encoding encoding = BINARY) { +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + return node::DecodeBytes( + v8::Isolate::GetCurrent() + , val + , static_cast(encoding)); +#else +# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION) + if (encoding == BUFFER) { + return node::DecodeBytes(val, node::BINARY); + } +# endif + return node::DecodeBytes(val, static_cast(encoding)); +#endif +} + +inline ssize_t DecodeWrite( + char *buf + , size_t len + , v8::Local val + , enum Encoding encoding = BINARY) { +#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) + return node::DecodeWrite( + v8::Isolate::GetCurrent() + , buf + , len + , val + , static_cast(encoding)); +#else +# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION) + if (encoding == BUFFER) { + return node::DecodeWrite(buf, len, val, node::BINARY); + } +# endif + return node::DecodeWrite( + buf + , len + , val + , static_cast(encoding)); +#endif +} + +inline void SetPrototypeTemplate( + v8::Local templ + , const char *name + , v8::Local value +) { + HandleScope scope; + SetTemplate(templ->PrototypeTemplate(), name, value); +} + +inline void SetPrototypeTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes +) { + HandleScope scope; + SetTemplate(templ->PrototypeTemplate(), name, value, attributes); +} + +inline void SetInstanceTemplate( + v8::Local templ + , const char *name + , v8::Local value +) { + HandleScope scope; + SetTemplate(templ->InstanceTemplate(), name, value); +} + +inline void SetInstanceTemplate( + v8::Local templ + , v8::Local name + , v8::Local value + , v8::PropertyAttribute attributes +) { + HandleScope scope; + SetTemplate(templ->InstanceTemplate(), name, value, attributes); +} + +namespace imp { + +// Note(@agnat): Helper to distinguish different receiver types. The first +// version deals with receivers derived from v8::Template. The second version +// handles everything else. The final argument only serves as discriminator and +// is unused. +template +inline +void +SetMethodAux(T recv, + v8::Local name, + v8::Local tpl, + v8::Template *) { + recv->Set(name, tpl); +} + +template +inline +void +SetMethodAux(T recv, + v8::Local name, + v8::Local tpl, + ...) { + Set(recv, name, GetFunction(tpl).ToLocalChecked()); +} + +} // end of namespace imp + +template class HandleType> +inline void SetMethod( + HandleType recv + , const char *name + , FunctionCallback callback + , v8::Local data = v8::Local()) { + HandleScope scope; + v8::Local t = New(callback, data); + v8::Local fn_name = New(name).ToLocalChecked(); + t->SetClassName(fn_name); + // Note(@agnat): Pass an empty T* as discriminator. See note on + // SetMethodAux(...) above + imp::SetMethodAux(recv, fn_name, t, static_cast(0)); +} + +inline void SetPrototypeMethod( + v8::Local recv + , const char* name + , FunctionCallback callback + , v8::Local data = v8::Local()) { + HandleScope scope; + v8::Local t = New( + callback + , data + , New(recv)); + v8::Local fn_name = New(name).ToLocalChecked(); + recv->PrototypeTemplate()->Set(fn_name, t); + t->SetClassName(fn_name); +} + +//=== Accessors and Such ======================================================= + +NAN_DEPRECATED inline void SetAccessor( + v8::Local tpl + , v8::Local name + , GetterCallback getter + , SetterCallback setter + , v8::Local data + , v8::AccessControl settings + , v8::PropertyAttribute attribute + , imp::Sig signature) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (setter != 0) { + obj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 5)) + tpl->SetNativeDataProperty( +#else + tpl->SetAccessor( +#endif + name + , getter_ + , setter_ + , obj +#if !defined(V8_MAJOR_VERSION) || V8_MAJOR_VERSION < 12 + , settings +#endif + , attribute +#if (NODE_MODULE_VERSION < NODE_16_0_MODULE_VERSION) + , signature +#endif + ); +} + +inline void SetAccessor( + v8::Local tpl + , v8::Local name + , GetterCallback getter + , SetterCallback setter = 0 + , v8::Local data = v8::Local() + , v8::AccessControl settings = v8::DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (setter != 0) { + obj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 5)) + tpl->SetNativeDataProperty( +#else + tpl->SetAccessor( +#endif + name + , getter_ + , setter_ + , obj +#if !defined(V8_MAJOR_VERSION) || V8_MAJOR_VERSION < 12 + , settings +#endif + , attribute + ); +} + +inline bool SetAccessor( + v8::Local obj + , v8::Local name + , GetterCallback getter + , SetterCallback setter = 0 + , v8::Local data = v8::Local() + , v8::AccessControl settings = v8::DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + HandleScope scope; + + imp::NativeGetter getter_ = + imp::GetterCallbackWrapper; + imp::NativeSetter setter_ = + setter ? imp::SetterCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kAccessorFieldCount); + v8::Local dataobj = NewInstance(otpl).ToLocalChecked(); + + dataobj->SetInternalField( + imp::kGetterIndex + , New(reinterpret_cast(getter))); + + if (!data.IsEmpty()) { + dataobj->SetInternalField(imp::kDataIndex, data); + } + + if (setter) { + dataobj->SetInternalField( + imp::kSetterIndex + , New(reinterpret_cast(setter))); + } + +#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) +#if defined(V8_MAJOR_VERSION) && \ + (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && \ + V8_MINOR_VERSION >= 5)) + return obj->SetNativeDataProperty( + GetCurrentContext() + , name + , getter_ + , setter_ + , dataobj + , attribute).FromMaybe(false); +#else + return obj->SetAccessor( + GetCurrentContext() + , name + , getter_ + , setter_ + , dataobj + , settings + , attribute).FromMaybe(false); +#endif +#else + return obj->SetAccessor( + name + , getter_ + , setter_ + , dataobj + , settings + , attribute); +#endif +} + +inline void SetNamedPropertyHandler( + v8::Local tpl + , PropertyGetterCallback getter + , PropertySetterCallback setter = 0 + , PropertyQueryCallback query = 0 + , PropertyDeleterCallback deleter = 0 + , PropertyEnumeratorCallback enumerator = 0 + , v8::Local data = v8::Local()) { + HandleScope scope; + + imp::NativePropertyGetter getter_ = + imp::PropertyGetterCallbackWrapper; + imp::NativePropertySetter setter_ = + setter ? imp::PropertySetterCallbackWrapper : 0; + imp::NativePropertyQuery query_ = + query ? imp::PropertyQueryCallbackWrapper : 0; + imp::NativePropertyDeleter *deleter_ = + deleter ? imp::PropertyDeleterCallbackWrapper : 0; + imp::NativePropertyEnumerator enumerator_ = + enumerator ? imp::PropertyEnumeratorCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kPropertyFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + obj->SetInternalField( + imp::kPropertyGetterIndex + , New(reinterpret_cast(getter))); + + if (setter) { + obj->SetInternalField( + imp::kPropertySetterIndex + , New(reinterpret_cast(setter))); + } + + if (query) { + obj->SetInternalField( + imp::kPropertyQueryIndex + , New(reinterpret_cast(query))); + } + + if (deleter) { + obj->SetInternalField( + imp::kPropertyDeleterIndex + , New(reinterpret_cast(deleter))); + } + + if (enumerator) { + obj->SetInternalField( + imp::kPropertyEnumeratorIndex + , New(reinterpret_cast(enumerator))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + tpl->SetHandler(v8::NamedPropertyHandlerConfiguration( + getter_, setter_, query_, deleter_, enumerator_, obj)); +#else + tpl->SetNamedPropertyHandler( + getter_ + , setter_ + , query_ + , deleter_ + , enumerator_ + , obj); +#endif +} + +inline void SetIndexedPropertyHandler( + v8::Local tpl + , IndexGetterCallback getter + , IndexSetterCallback setter = 0 + , IndexQueryCallback query = 0 + , IndexDeleterCallback deleter = 0 + , IndexEnumeratorCallback enumerator = 0 + , v8::Local data = v8::Local()) { + HandleScope scope; + + imp::NativeIndexGetter getter_ = + imp::IndexGetterCallbackWrapper; + imp::NativeIndexSetter setter_ = + setter ? imp::IndexSetterCallbackWrapper : 0; + imp::NativeIndexQuery query_ = + query ? imp::IndexQueryCallbackWrapper : 0; + imp::NativeIndexDeleter deleter_ = + deleter ? imp::IndexDeleterCallbackWrapper : 0; + imp::NativeIndexEnumerator enumerator_ = + enumerator ? imp::IndexEnumeratorCallbackWrapper : 0; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kIndexPropertyFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + obj->SetInternalField( + imp::kIndexPropertyGetterIndex + , New(reinterpret_cast(getter))); + + if (setter) { + obj->SetInternalField( + imp::kIndexPropertySetterIndex + , New(reinterpret_cast(setter))); + } + + if (query) { + obj->SetInternalField( + imp::kIndexPropertyQueryIndex + , New(reinterpret_cast(query))); + } + + if (deleter) { + obj->SetInternalField( + imp::kIndexPropertyDeleterIndex + , New(reinterpret_cast(deleter))); + } + + if (enumerator) { + obj->SetInternalField( + imp::kIndexPropertyEnumeratorIndex + , New(reinterpret_cast(enumerator))); + } + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + tpl->SetHandler(v8::IndexedPropertyHandlerConfiguration( + getter_, setter_, query_, deleter_, enumerator_, obj)); +#else + tpl->SetIndexedPropertyHandler( + getter_ + , setter_ + , query_ + , deleter_ + , enumerator_ + , obj); +#endif +} + +inline void SetCallHandler( + v8::Local tpl + , FunctionCallback callback + , v8::Local data = v8::Local()) { + HandleScope scope; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , New(reinterpret_cast(callback))); + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + + tpl->SetCallHandler(imp::FunctionCallbackWrapper, obj); +} + + +inline void SetCallAsFunctionHandler( + v8::Local tpl, + FunctionCallback callback, + v8::Local data = v8::Local()) { + HandleScope scope; + + v8::Local otpl = New(); + otpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(otpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , New(reinterpret_cast(callback))); + + if (!data.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, data); + } + + tpl->SetCallAsFunctionHandler(imp::FunctionCallbackWrapper, obj); +} + +//=== Weak Persistent Handling ================================================= + +#include "nan_weak.h" // NOLINT(build/include) + +//=== ObjectWrap =============================================================== + +#include "nan_object_wrap.h" // NOLINT(build/include) + +//=== HiddenValue/Private ====================================================== + +#include "nan_private.h" // NOLINT(build/include) + +//=== Export ================================================================== + +inline +void +Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name, + FunctionCallback f) { + HandleScope scope; + + Set(target, New(name).ToLocalChecked(), + GetFunction(New(f)).ToLocalChecked()); +} + +//=== Tap Reverse Binding ===================================================== + +struct Tap { + explicit Tap(v8::Local t) : t_() { + HandleScope scope; + + t_.Reset(To(t).ToLocalChecked()); + } + + ~Tap() { t_.Reset(); } // not sure if necessary + + inline void plan(int i) { + HandleScope scope; + v8::Local arg = New(i); + Call("plan", New(t_), 1, &arg); + } + + inline void ok(bool isOk, const char *msg = NULL) { + HandleScope scope; + v8::Local args[2]; + args[0] = New(isOk); + if (msg) args[1] = New(msg).ToLocalChecked(); + Call("ok", New(t_), msg ? 2 : 1, args); + } + + inline void pass(const char * msg = NULL) { + HandleScope scope; + v8::Local hmsg; + if (msg) hmsg = New(msg).ToLocalChecked(); + Call("pass", New(t_), msg ? 1 : 0, &hmsg); + } + + inline void end() { + HandleScope scope; + Call("end", New(t_), 0, NULL); + } + + private: + Persistent t_; +}; + +#define NAN_STRINGIZE2(x) #x +#define NAN_STRINGIZE(x) NAN_STRINGIZE2(x) +#define NAN_TEST_EXPRESSION(expression) \ + ( expression ), __FILE__ ":" NAN_STRINGIZE(__LINE__) ": " #expression + +#define NAN_EXPORT(target, function) Export(target, #function, function) + +#undef TYPE_CHECK + +//=== Generic Maybefication =================================================== + +namespace imp { + +template struct Maybefier; + +template struct Maybefier > { + inline static MaybeLocal convert(v8::Local v) { + return v; + } +}; + +template struct Maybefier > { + inline static MaybeLocal convert(MaybeLocal v) { + return v; + } +}; + +} // end of namespace imp + +template class MaybeMaybe> +inline MaybeLocal +MakeMaybe(MaybeMaybe v) { + return imp::Maybefier >::convert(v); +} + +//=== TypedArrayContents ======================================================= + +#include "nan_typedarray_contents.h" // NOLINT(build/include) + +//=== JSON ===================================================================== + +#include "nan_json.h" // NOLINT(build/include) + +//=== ScriptOrigin ============================================================= + +#include "nan_scriptorigin.h" // NOLINT(build/include) + +} // end of namespace Nan + +#endif // NAN_H_ diff --git a/node_modules/nan/nan_callbacks.h b/node_modules/nan/nan_callbacks.h new file mode 100644 index 0000000..2c54857 --- /dev/null +++ b/node_modules/nan/nan_callbacks.h @@ -0,0 +1,128 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CALLBACKS_H_ +#define NAN_CALLBACKS_H_ + +template class FunctionCallbackInfo; +template class PropertyCallbackInfo; +template class Global; + +typedef void(*FunctionCallback)(const FunctionCallbackInfo&); +typedef void(*GetterCallback) + (v8::Local, const PropertyCallbackInfo&); +typedef void(*SetterCallback)( + v8::Local, + v8::Local, + const PropertyCallbackInfo&); + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted(*PropertyGetterCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef v8::Intercepted(*PropertySetterCallback)( + v8::Local, + v8::Local, + const PropertyCallbackInfo&); +#else +typedef void(*PropertyGetterCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef void(*PropertySetterCallback)( + v8::Local, + v8::Local, + const PropertyCallbackInfo&); +#endif +typedef void(*PropertyEnumeratorCallback) + (const PropertyCallbackInfo&); +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +typedef v8::Intercepted(*PropertyDeleterCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef v8::Intercepted(*PropertyQueryCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef v8::Intercepted(*IndexGetterCallback)( + uint32_t, + const PropertyCallbackInfo&); +typedef v8::Intercepted(*IndexSetterCallback)( + uint32_t, + v8::Local, + const PropertyCallbackInfo&); +typedef v8::Intercepted(*IndexEnumeratorCallback) + (const PropertyCallbackInfo&); +typedef v8::Intercepted(*IndexDeleterCallback)( + uint32_t, + const PropertyCallbackInfo&); +typedef v8::Intercepted(*IndexQueryCallback)( + uint32_t, + const PropertyCallbackInfo&); +#else +typedef void(*PropertyDeleterCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef void(*PropertyQueryCallback)( + v8::Local, + const PropertyCallbackInfo&); +typedef void(*IndexGetterCallback)( + uint32_t, + const PropertyCallbackInfo&); +typedef void(*IndexSetterCallback)( + uint32_t, + v8::Local, + const PropertyCallbackInfo&); +typedef void(*IndexEnumeratorCallback) + (const PropertyCallbackInfo&); +typedef void(*IndexDeleterCallback)( + uint32_t, + const PropertyCallbackInfo&); +typedef void(*IndexQueryCallback)( + uint32_t, + const PropertyCallbackInfo&); +#endif +namespace imp { +#if (NODE_MODULE_VERSION < NODE_16_0_MODULE_VERSION) +typedef v8::Local Sig; +#else +typedef v8::Local Sig; +#endif + +static const int kDataIndex = 0; + +static const int kFunctionIndex = 1; +static const int kFunctionFieldCount = 2; + +static const int kGetterIndex = 1; +static const int kSetterIndex = 2; +static const int kAccessorFieldCount = 3; + +static const int kPropertyGetterIndex = 1; +static const int kPropertySetterIndex = 2; +static const int kPropertyEnumeratorIndex = 3; +static const int kPropertyDeleterIndex = 4; +static const int kPropertyQueryIndex = 5; +static const int kPropertyFieldCount = 6; + +static const int kIndexPropertyGetterIndex = 1; +static const int kIndexPropertySetterIndex = 2; +static const int kIndexPropertyEnumeratorIndex = 3; +static const int kIndexPropertyDeleterIndex = 4; +static const int kIndexPropertyQueryIndex = 5; +static const int kIndexPropertyFieldCount = 6; + +} // end of namespace imp + +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +# include "nan_callbacks_12_inl.h" // NOLINT(build/include) +#else +# include "nan_callbacks_pre_12_inl.h" // NOLINT(build/include) +#endif + +#endif // NAN_CALLBACKS_H_ diff --git a/node_modules/nan/nan_callbacks_12_inl.h b/node_modules/nan/nan_callbacks_12_inl.h new file mode 100644 index 0000000..f953989 --- /dev/null +++ b/node_modules/nan/nan_callbacks_12_inl.h @@ -0,0 +1,676 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CALLBACKS_12_INL_H_ +#define NAN_CALLBACKS_12_INL_H_ + +template +class ReturnValue { + v8::ReturnValue value_; + + public: + template + explicit inline ReturnValue(const v8::ReturnValue &value) : + value_(value) {} + template + explicit inline ReturnValue(const ReturnValue& that) + : value_(that.value_) { + TYPE_CHECK(T, S); + } + + // Handle setters + template inline void Set(const v8::Local &handle) { + TYPE_CHECK(T, S); + value_.Set(handle); + } + + template inline void Set(const Global &handle) { + TYPE_CHECK(T, S); +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && \ + (V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 && \ + defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8)))) + value_.Set(handle); +#else + value_.Set(*reinterpret_cast*>(&handle)); + const_cast &>(handle).Reset(); +#endif + } + + // Fast primitive setters + inline void Set(bool value) { + TYPE_CHECK(T, v8::Boolean); + value_.Set(value); + } + + inline void Set(double i) { + TYPE_CHECK(T, v8::Number); + value_.Set(i); + } + + inline void Set(int32_t i) { + TYPE_CHECK(T, v8::Integer); + value_.Set(i); + } + + inline void Set(uint32_t i) { + TYPE_CHECK(T, v8::Integer); + value_.Set(i); + } + + // Fast JS primitive setters + inline void SetNull() { + TYPE_CHECK(T, v8::Primitive); + value_.SetNull(); + } + + inline void SetUndefined() { + TYPE_CHECK(T, v8::Primitive); + value_.SetUndefined(); + } + + inline void SetEmptyString() { + TYPE_CHECK(T, v8::String); + value_.SetEmptyString(); + } + + // Convenience getter for isolate + inline v8::Isolate *GetIsolate() const { + return value_.GetIsolate(); + } + + // Pointer setter: Uncompilable to prevent inadvertent misuse. + template + inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); } +}; + +template +class FunctionCallbackInfo { + const v8::FunctionCallbackInfo &info_; + const v8::Local data_; + + public: + explicit inline FunctionCallbackInfo( + const v8::FunctionCallbackInfo &info + , v8::Local data) : + info_(info) + , data_(data) {} + + inline ReturnValue GetReturnValue() const { + return ReturnValue(info_.GetReturnValue()); + } + +#if NODE_MAJOR_VERSION < 10 + inline v8::Local Callee() const { return info_.Callee(); } +#endif + inline v8::Local Data() const { return data_; } + inline v8::Local Holder() const { return info_.Holder(); } + inline bool IsConstructCall() const { return info_.IsConstructCall(); } + inline int Length() const { return info_.Length(); } + inline v8::Local operator[](int i) const { return info_[i]; } + inline v8::Local This() const { return info_.This(); } + inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); } + + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kCalleeIndex = 5; + static const int kContextSaveIndex = 6; + static const int kArgsLength = 7; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo) +}; + +template +class PropertyCallbackInfo { + const v8::PropertyCallbackInfo &info_; + const v8::Local data_; + + public: + explicit inline PropertyCallbackInfo( + const v8::PropertyCallbackInfo &info + , const v8::Local data) : + info_(info) + , data_(data) {} + + inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); } + inline v8::Local Data() const { return data_; } + inline v8::Local This() const { return info_.This(); } + inline v8::Local Holder() const { return info_.Holder(); } + inline ReturnValue GetReturnValue() const { + return ReturnValue(info_.GetReturnValue()); + } + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kThisIndex = 5; + static const int kArgsLength = 6; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo) +}; + +namespace imp { +static +void FunctionCallbackWrapper(const v8::FunctionCallbackInfo &info) { + v8::Local obj = info.Data().As(); + FunctionCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kFunctionIndex) + .As().As()->Value())); + FunctionCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + callback(cbinfo); +} + +typedef void (*NativeFunction)(const v8::FunctionCallbackInfo &); + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +static +void GetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + GetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kGetterIndex) + .As().As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (*NativeGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void SetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + SetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kSetterIndex) + .As().As()->Value())); + callback(property.As(), value, cbinfo); +} + +typedef void (*NativeSetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); +#else +static +void GetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + GetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kGetterIndex) + .As().As()->Value())); + callback(property, cbinfo); +} + +typedef void (*NativeGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void SetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + SetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kSetterIndex) + .As().As()->Value())); + callback(property, value, cbinfo); +} + +typedef void (*NativeSetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); +#endif + +#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +static +v8::Intercepted PropertyGetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As().As()->Value())); + return callback(property.As(), cbinfo); +} + +typedef v8::Intercepted (*NativePropertyGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +v8::Intercepted PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As().As()->Value())); + return callback(property.As(), value, cbinfo); +} + +typedef v8::Intercepted (*NativePropertySetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); + +#else +static +void PropertyGetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As().As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (*NativePropertyGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As().As()->Value())); + callback(property.As(), value, cbinfo); +} + +typedef void (*NativePropertySetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); +#endif + +static +void PropertyEnumeratorCallbackWrapper( + const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyEnumeratorCallback callback = + reinterpret_cast(reinterpret_cast( + obj->GetInternalField(kPropertyEnumeratorIndex) + .As().As()->Value())); + callback(cbinfo); +} + +typedef void (*NativePropertyEnumerator) + (const v8::PropertyCallbackInfo &); + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +static +v8::Intercepted PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As().As()->Value())); + return callback(property.As(), cbinfo); +} + +typedef v8::Intercepted (NativePropertyDeleter) + (v8::Local, const v8::PropertyCallbackInfo &); + + +static +v8::Intercepted PropertyQueryCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As().As()->Value())); + return callback(property.As(), cbinfo); +} + +typedef v8::Intercepted (*NativePropertyQuery) + (v8::Local, const v8::PropertyCallbackInfo &); +#else +static +void PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As().As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (NativePropertyDeleter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertyQueryCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As().As()->Value())); + callback(property.As(), cbinfo); +} + +typedef void (*NativePropertyQuery) + (v8::Local, const v8::PropertyCallbackInfo &); +#endif +#else +static +void PropertyGetterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As().As()->Value())); + callback(property, cbinfo); +} + +typedef void (*NativePropertyGetter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As().As()->Value())); + callback(property, value, cbinfo); +} + +typedef void (*NativePropertySetter)( + v8::Local + , v8::Local + , const v8::PropertyCallbackInfo &); + +static +void PropertyEnumeratorCallbackWrapper( + const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyEnumeratorCallback callback = + reinterpret_cast(reinterpret_cast( + obj->GetInternalField(kPropertyEnumeratorIndex) + .As().As()->Value())); + callback(cbinfo); +} + +typedef void (*NativePropertyEnumerator) + (const v8::PropertyCallbackInfo &); + +static +void PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As().As()->Value())); + callback(property, cbinfo); +} + +typedef void (NativePropertyDeleter) + (v8::Local, const v8::PropertyCallbackInfo &); + +static +void PropertyQueryCallbackWrapper( + v8::Local property + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As().As()->Value())); + callback(property, cbinfo); +} + +typedef void (*NativePropertyQuery) + (v8::Local, const v8::PropertyCallbackInfo &); +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +static +v8::Intercepted IndexGetterCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyGetterIndex) + .As().As()->Value())); + return callback(index, cbinfo); +} + +typedef v8::Intercepted (*NativeIndexGetter) + (uint32_t, const v8::PropertyCallbackInfo &); + +static +v8::Intercepted IndexSetterCallbackWrapper( + uint32_t index + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexSetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertySetterIndex) + .As().As()->Value())); + return callback(index, value, cbinfo); +} + +typedef v8::Intercepted (*NativeIndexSetter)( + uint32_t + , v8::Local + , const v8::PropertyCallbackInfo &); + +#else +static +void IndexGetterCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyGetterIndex) + .As().As()->Value())); + callback(index, cbinfo); +} + +typedef void (*NativeIndexGetter) + (uint32_t, const v8::PropertyCallbackInfo &); +static +void IndexSetterCallbackWrapper( + uint32_t index + , v8::Local value + , const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexSetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertySetterIndex) + .As().As()->Value())); + callback(index, value, cbinfo); +} + +typedef void (*NativeIndexSetter)( + uint32_t + , v8::Local + , const v8::PropertyCallbackInfo &); + +#endif + +static +void IndexEnumeratorCallbackWrapper( + const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexEnumeratorCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField( + kIndexPropertyEnumeratorIndex) + .As().As()->Value())); + callback(cbinfo); +} + +typedef void (*NativeIndexEnumerator) + (const v8::PropertyCallbackInfo &); + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) +static +v8::Intercepted IndexDeleterCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyDeleterIndex) + .As().As()->Value())); + return callback(index, cbinfo); +} + +typedef v8::Intercepted (*NativeIndexDeleter) + (uint32_t, const v8::PropertyCallbackInfo &); + +static +v8::Intercepted IndexQueryCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyQueryIndex) + .As().As()->Value())); + return callback(index, cbinfo); +} + +typedef v8::Intercepted (*NativeIndexQuery) + (uint32_t, const v8::PropertyCallbackInfo &); +#else +static +void IndexDeleterCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyDeleterIndex) + .As().As()->Value())); + callback(index, cbinfo); +} + +typedef void (*NativeIndexDeleter) + (uint32_t, const v8::PropertyCallbackInfo &); + +static +void IndexQueryCallbackWrapper( + uint32_t index, const v8::PropertyCallbackInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex).As()); + IndexQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyQueryIndex) + .As().As()->Value())); + callback(index, cbinfo); +} + +typedef void (*NativeIndexQuery) + (uint32_t, const v8::PropertyCallbackInfo &); + +#endif +} // end of namespace imp + +#endif // NAN_CALLBACKS_12_INL_H_ diff --git a/node_modules/nan/nan_callbacks_pre_12_inl.h b/node_modules/nan/nan_callbacks_pre_12_inl.h new file mode 100644 index 0000000..c9ba499 --- /dev/null +++ b/node_modules/nan/nan_callbacks_pre_12_inl.h @@ -0,0 +1,520 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CALLBACKS_PRE_12_INL_H_ +#define NAN_CALLBACKS_PRE_12_INL_H_ + +namespace imp { +template class ReturnValueImp; +} // end of namespace imp + +template +class ReturnValue { + v8::Isolate *isolate_; + v8::Persistent *value_; + friend class imp::ReturnValueImp; + + public: + template + explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent *p) : + isolate_(isolate), value_(p) {} + template + explicit inline ReturnValue(const ReturnValue& that) + : isolate_(that.isolate_), value_(that.value_) { + TYPE_CHECK(T, S); + } + + // Handle setters + template inline void Set(const v8::Local &handle) { + TYPE_CHECK(T, S); + value_->Dispose(); + *value_ = v8::Persistent::New(handle); + } + + template inline void Set(const Global &handle) { + TYPE_CHECK(T, S); + value_->Dispose(); + *value_ = v8::Persistent::New(handle.persistent); + const_cast &>(handle).Reset(); + } + + // Fast primitive setters + inline void Set(bool value) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Boolean); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Boolean::New(value)); + } + + inline void Set(double i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Number); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Number::New(i)); + } + + inline void Set(int32_t i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Integer); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Int32::New(i)); + } + + inline void Set(uint32_t i) { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Integer); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Uint32::NewFromUnsigned(i)); + } + + // Fast JS primitive setters + inline void SetNull() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Primitive); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Null()); + } + + inline void SetUndefined() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::Primitive); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::Undefined()); + } + + inline void SetEmptyString() { + v8::HandleScope scope; + + TYPE_CHECK(T, v8::String); + value_->Dispose(); + *value_ = v8::Persistent::New(v8::String::Empty()); + } + + // Convenience getter for isolate + inline v8::Isolate *GetIsolate() const { + return isolate_; + } + + // Pointer setter: Uncompilable to prevent inadvertent misuse. + template + inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); } +}; + +template +class FunctionCallbackInfo { + const v8::Arguments &args_; + v8::Local data_; + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline FunctionCallbackInfo( + const v8::Arguments &args + , v8::Local data) : + args_(args) + , data_(data) + , return_value_(args.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Undefined())) {} + + inline ~FunctionCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return ReturnValue(return_value_); + } + + inline v8::Local Callee() const { return args_.Callee(); } + inline v8::Local Data() const { return data_; } + inline v8::Local Holder() const { return args_.Holder(); } + inline bool IsConstructCall() const { return args_.IsConstructCall(); } + inline int Length() const { return args_.Length(); } + inline v8::Local operator[](int i) const { return args_[i]; } + inline v8::Local This() const { return args_.This(); } + inline v8::Isolate *GetIsolate() const { return args_.GetIsolate(); } + + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kCalleeIndex = 5; + static const int kContextSaveIndex = 6; + static const int kArgsLength = 7; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo) +}; + +template +class PropertyCallbackInfoBase { + const v8::AccessorInfo &info_; + const v8::Local data_; + + public: + explicit inline PropertyCallbackInfoBase( + const v8::AccessorInfo &info + , const v8::Local data) : + info_(info) + , data_(data) {} + + inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); } + inline v8::Local Data() const { return data_; } + inline v8::Local This() const { return info_.This(); } + inline v8::Local Holder() const { return info_.Holder(); } + + protected: + static const int kHolderIndex = 0; + static const int kIsolateIndex = 1; + static const int kReturnValueDefaultValueIndex = 2; + static const int kReturnValueIndex = 3; + static const int kDataIndex = 4; + static const int kThisIndex = 5; + static const int kArgsLength = 6; + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfoBase) +}; + +template +class PropertyCallbackInfo : public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Undefined())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { return return_value_; } +}; + +template<> +class PropertyCallbackInfo : + public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Local())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return return_value_; + } +}; + +template<> +class PropertyCallbackInfo : + public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Local())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return return_value_; + } +}; + +template<> +class PropertyCallbackInfo : + public PropertyCallbackInfoBase { + ReturnValue return_value_; + v8::Persistent retval_; + + public: + explicit inline PropertyCallbackInfo( + const v8::AccessorInfo &info + , const v8::Local data) : + PropertyCallbackInfoBase(info, data) + , return_value_(info.GetIsolate(), &retval_) + , retval_(v8::Persistent::New(v8::Local())) {} + + inline ~PropertyCallbackInfo() { + retval_.Dispose(); + retval_.Clear(); + } + + inline ReturnValue GetReturnValue() const { + return return_value_; + } +}; + +namespace imp { +template +class ReturnValueImp : public ReturnValue { + public: + explicit ReturnValueImp(ReturnValue that) : + ReturnValue(that) {} + inline v8::Handle Value() { + return *ReturnValue::value_; + } +}; + +static +v8::Handle FunctionCallbackWrapper(const v8::Arguments &args) { + v8::Local obj = args.Data().As(); + FunctionCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kFunctionIndex).As()->Value())); + FunctionCallbackInfo + cbinfo(args, obj->GetInternalField(kDataIndex)); + callback(cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeFunction)(const v8::Arguments &); + +static +v8::Handle GetterCallbackWrapper( + v8::Local property, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + GetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kGetterIndex).As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeGetter) + (v8::Local, const v8::AccessorInfo &); + +static +void SetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + SetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kSetterIndex).As()->Value())); + callback(property, value, cbinfo); +} + +typedef void (*NativeSetter) + (v8::Local, v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertyGetterCallbackWrapper( + v8::Local property, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyGetterIndex) + .As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertyGetter) + (v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertySetterCallbackWrapper( + v8::Local property + , v8::Local value + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertySetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertySetterIndex) + .As()->Value())); + callback(property, value, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertySetter) + (v8::Local, v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertyEnumeratorCallbackWrapper( + const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyEnumeratorCallback callback = + reinterpret_cast(reinterpret_cast( + obj->GetInternalField(kPropertyEnumeratorIndex) + .As()->Value())); + callback(cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertyEnumerator) + (const v8::AccessorInfo &); + +static +v8::Handle PropertyDeleterCallbackWrapper( + v8::Local property + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyDeleterIndex) + .As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (NativePropertyDeleter) + (v8::Local, const v8::AccessorInfo &); + +static +v8::Handle PropertyQueryCallbackWrapper( + v8::Local property, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + PropertyQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kPropertyQueryIndex) + .As()->Value())); + callback(property, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativePropertyQuery) + (v8::Local, const v8::AccessorInfo &); + +static +v8::Handle IndexGetterCallbackWrapper( + uint32_t index, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexGetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyGetterIndex) + .As()->Value())); + callback(index, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexGetter) + (uint32_t, const v8::AccessorInfo &); + +static +v8::Handle IndexSetterCallbackWrapper( + uint32_t index + , v8::Local value + , const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexSetterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertySetterIndex) + .As()->Value())); + callback(index, value, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexSetter) + (uint32_t, v8::Local, const v8::AccessorInfo &); + +static +v8::Handle IndexEnumeratorCallbackWrapper( + const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexEnumeratorCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyEnumeratorIndex) + .As()->Value())); + callback(cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexEnumerator) + (const v8::AccessorInfo &); + +static +v8::Handle IndexDeleterCallbackWrapper( + uint32_t index, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexDeleterCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyDeleterIndex) + .As()->Value())); + callback(index, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexDeleter) + (uint32_t, const v8::AccessorInfo &); + +static +v8::Handle IndexQueryCallbackWrapper( + uint32_t index, const v8::AccessorInfo &info) { + v8::Local obj = info.Data().As(); + PropertyCallbackInfo + cbinfo(info, obj->GetInternalField(kDataIndex)); + IndexQueryCallback callback = reinterpret_cast( + reinterpret_cast( + obj->GetInternalField(kIndexPropertyQueryIndex) + .As()->Value())); + callback(index, cbinfo); + return ReturnValueImp(cbinfo.GetReturnValue()).Value(); +} + +typedef v8::Handle (*NativeIndexQuery) + (uint32_t, const v8::AccessorInfo &); +} // end of namespace imp + +#endif // NAN_CALLBACKS_PRE_12_INL_H_ diff --git a/node_modules/nan/nan_converters.h b/node_modules/nan/nan_converters.h new file mode 100644 index 0000000..c0b3272 --- /dev/null +++ b/node_modules/nan/nan_converters.h @@ -0,0 +1,72 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CONVERTERS_H_ +#define NAN_CONVERTERS_H_ + +namespace imp { +template struct ToFactoryBase { + typedef MaybeLocal return_t; +}; +template struct ValueFactoryBase { typedef Maybe return_t; }; + +template struct ToFactory; + +template<> +struct ToFactory : ToFactoryBase { + static inline return_t convert(v8::Local val) { + if (val.IsEmpty() || !val->IsFunction()) return MaybeLocal(); + return MaybeLocal(val.As()); + } +}; + +#define X(TYPE) \ + template<> \ + struct ToFactory : ToFactoryBase { \ + static inline return_t convert(v8::Local val); \ + }; + +X(Boolean) +X(Number) +X(String) +X(Object) +X(Integer) +X(Uint32) +X(Int32) + +#undef X + +#define X(TYPE) \ + template<> \ + struct ToFactory : ValueFactoryBase { \ + static inline return_t convert(v8::Local val); \ + }; + +X(bool) +X(double) +X(int64_t) +X(uint32_t) +X(int32_t) + +#undef X +} // end of namespace imp + +template +inline +typename imp::ToFactory::return_t To(v8::Local val) { + return imp::ToFactory::convert(val); +} + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +# include "nan_converters_43_inl.h" +#else +# include "nan_converters_pre_43_inl.h" +#endif + +#endif // NAN_CONVERTERS_H_ diff --git a/node_modules/nan/nan_converters_43_inl.h b/node_modules/nan/nan_converters_43_inl.h new file mode 100644 index 0000000..41b72de --- /dev/null +++ b/node_modules/nan/nan_converters_43_inl.h @@ -0,0 +1,68 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CONVERTERS_43_INL_H_ +#define NAN_CONVERTERS_43_INL_H_ + +#define X(TYPE) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ + v8::EscapableHandleScope scope(isolate); \ + return scope.Escape( \ + val->To ## TYPE(isolate->GetCurrentContext()) \ + .FromMaybe(v8::Local())); \ +} + +X(Number) +X(String) +X(Object) +X(Integer) +X(Uint32) +X(Int32) +// V8 <= 7.0 +#if V8_MAJOR_VERSION < 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION == 0) +X(Boolean) +#else +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ + v8::EscapableHandleScope scope(isolate); \ + return scope.Escape(val->ToBoolean(isolate)); \ +} +#endif + +#undef X + +#define X(TYPE, NAME) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ + v8::HandleScope scope(isolate); \ + return val->NAME ## Value(isolate->GetCurrentContext()); \ +} + +X(double, Number) +X(int64_t, Integer) +X(uint32_t, Uint32) +X(int32_t, Int32) +// V8 <= 7.0 +#if V8_MAJOR_VERSION < 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION == 0) +X(bool, Boolean) +#else +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + v8::Isolate *isolate = v8::Isolate::GetCurrent(); \ + v8::HandleScope scope(isolate); \ + return Just(val->BooleanValue(isolate)); \ +} +#endif + +#undef X + +#endif // NAN_CONVERTERS_43_INL_H_ diff --git a/node_modules/nan/nan_converters_pre_43_inl.h b/node_modules/nan/nan_converters_pre_43_inl.h new file mode 100644 index 0000000..ae0518a --- /dev/null +++ b/node_modules/nan/nan_converters_pre_43_inl.h @@ -0,0 +1,42 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_CONVERTERS_PRE_43_INL_H_ +#define NAN_CONVERTERS_PRE_43_INL_H_ + +#define X(TYPE) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + return val->To ## TYPE(); \ +} + +X(Boolean) +X(Number) +X(String) +X(Object) +X(Integer) +X(Uint32) +X(Int32) + +#undef X + +#define X(TYPE, NAME) \ +imp::ToFactory::return_t \ +imp::ToFactory::convert(v8::Local val) { \ + return Just(val->NAME ## Value()); \ +} + +X(bool, Boolean) +X(double, Number) +X(int64_t, Integer) +X(uint32_t, Uint32) +X(int32_t, Int32) + +#undef X + +#endif // NAN_CONVERTERS_PRE_43_INL_H_ diff --git a/node_modules/nan/nan_define_own_property_helper.h b/node_modules/nan/nan_define_own_property_helper.h new file mode 100644 index 0000000..d710ef2 --- /dev/null +++ b/node_modules/nan/nan_define_own_property_helper.h @@ -0,0 +1,29 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_DEFINE_OWN_PROPERTY_HELPER_H_ +#define NAN_DEFINE_OWN_PROPERTY_HELPER_H_ + +namespace imp { + +inline Maybe DefineOwnPropertyHelper( + v8::PropertyAttribute current + , v8::Handle obj + , v8::Handle key + , v8::Handle value + , v8::PropertyAttribute attribs = v8::None) { + return !(current & v8::DontDelete) || // configurable OR + (!(current & v8::ReadOnly) && // writable AND + !((attribs ^ current) & ~v8::ReadOnly)) // same excluding RO + ? Just(obj->ForceSet(key, value, attribs)) + : Nothing(); +} + +} // end of namespace imp + +#endif // NAN_DEFINE_OWN_PROPERTY_HELPER_H_ diff --git a/node_modules/nan/nan_implementation_12_inl.h b/node_modules/nan/nan_implementation_12_inl.h new file mode 100644 index 0000000..255293a --- /dev/null +++ b/node_modules/nan/nan_implementation_12_inl.h @@ -0,0 +1,430 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_IMPLEMENTATION_12_INL_H_ +#define NAN_IMPLEMENTATION_12_INL_H_ +//============================================================================== +// node v0.11 implementation +//============================================================================== + +namespace imp { + +//=== Array ==================================================================== + +Factory::return_t +Factory::New() { + return v8::Array::New(v8::Isolate::GetCurrent()); +} + +Factory::return_t +Factory::New(int length) { + return v8::Array::New(v8::Isolate::GetCurrent(), length); +} + +//=== Boolean ================================================================== + +Factory::return_t +Factory::New(bool value) { + return v8::Boolean::New(v8::Isolate::GetCurrent(), value); +} + +//=== Boolean Object =========================================================== + +Factory::return_t +Factory::New(bool value) { +#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) + return v8::BooleanObject::New( + v8::Isolate::GetCurrent(), value).As(); +#else + return v8::BooleanObject::New(value).As(); +#endif +} + +//=== Context ================================================================== + +Factory::return_t +Factory::New( v8::ExtensionConfiguration* extensions + , v8::Local tmpl + , v8::Local obj) { + return v8::Context::New(v8::Isolate::GetCurrent(), extensions, tmpl, obj); +} + +//=== Date ===================================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(double value) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(v8::Date::New(isolate->GetCurrentContext(), value) + .FromMaybe(v8::Local()).As()); +} +#else +Factory::return_t +Factory::New(double value) { + return v8::Date::New(v8::Isolate::GetCurrent(), value).As(); +} +#endif + +//=== External ================================================================= + +Factory::return_t +Factory::New(void * value) { + return v8::External::New(v8::Isolate::GetCurrent(), value); +} + +//=== Function ================================================================= + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::Local tpl = v8::ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(tpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , v8::External::New(isolate, reinterpret_cast(callback))); + + v8::Local val = v8::Local::New(isolate, data); + + if (!val.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, val); + } + +#if NODE_MAJOR_VERSION >= 10 + v8::Local context = isolate->GetCurrentContext(); + v8::Local function = + v8::Function::New(context, imp::FunctionCallbackWrapper, obj) + .ToLocalChecked(); +#else + v8::Local function = + v8::Function::New(isolate, imp::FunctionCallbackWrapper, obj); +#endif + + return scope.Escape(function); +} + +//=== Function Template ======================================================== + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data + , v8::Local signature) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + if (callback) { + v8::EscapableHandleScope scope(isolate); + v8::Local tpl = v8::ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = NewInstance(tpl).ToLocalChecked(); + + obj->SetInternalField( + imp::kFunctionIndex + , v8::External::New(isolate, reinterpret_cast(callback))); + v8::Local val = v8::Local::New(isolate, data); + + if (!val.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, val); + } + + return scope.Escape(v8::FunctionTemplate::New( isolate + , imp::FunctionCallbackWrapper + , obj + , signature)); + } else { + return v8::FunctionTemplate::New(isolate, 0, data, signature); + } +} + +//=== Number =================================================================== + +Factory::return_t +Factory::New(double value) { + return v8::Number::New(v8::Isolate::GetCurrent(), value); +} + +//=== Number Object ============================================================ + +Factory::return_t +Factory::New(double value) { + return v8::NumberObject::New( v8::Isolate::GetCurrent() + , value).As(); +} + +//=== Integer, Int32 and Uint32 ================================================ + +template +typename IntegerFactory::return_t +IntegerFactory::New(int32_t value) { + return To(T::New(v8::Isolate::GetCurrent(), value)); +} + +template +typename IntegerFactory::return_t +IntegerFactory::New(uint32_t value) { + return To(T::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); +} + +Factory::return_t +Factory::New(int32_t value) { + return To( + v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); +} + +Factory::return_t +Factory::New(uint32_t value) { + return To( + v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value)); +} + +//=== Object =================================================================== + +Factory::return_t +Factory::New() { + return v8::Object::New(v8::Isolate::GetCurrent()); +} + +//=== Object Template ========================================================== + +Factory::return_t +Factory::New() { + return v8::ObjectTemplate::New(v8::Isolate::GetCurrent()); +} + +//=== RegExp =================================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New( + v8::Local pattern + , v8::RegExp::Flags flags) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + v8::RegExp::New(isolate->GetCurrentContext(), pattern, flags) + .FromMaybe(v8::Local())); +} +#else +Factory::return_t +Factory::New( + v8::Local pattern + , v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); +} +#endif + +//=== Script =================================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New( v8::Local source) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source src(source); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src) + .FromMaybe(v8::Local())); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::ScriptCompiler::Source src(source, origin); + return scope.Escape( + v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src) + .FromMaybe(v8::Local())); +} +#else +Factory::return_t +Factory::New( v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); +} +#endif + +//=== Signature ================================================================ + +Factory::return_t +Factory::New(Factory::FTH receiver) { + return v8::Signature::New(v8::Isolate::GetCurrent(), receiver); +} + +//=== String =================================================================== + +Factory::return_t +Factory::New() { + return v8::String::Empty(v8::Isolate::GetCurrent()); +} + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::NewFromUtf8( + v8::Isolate::GetCurrent(), value, v8::NewStringType::kNormal, length); +} + +Factory::return_t +Factory::New(std::string const& value) { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), + value.data(), v8::NewStringType::kNormal, static_cast(value.size())); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, + v8::NewStringType::kNormal, length); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternalTwoByte(v8::Isolate::GetCurrent(), value); +} + +Factory::return_t +Factory::New(ExternalOneByteStringResource * value) { + return v8::String::NewExternalOneByte(v8::Isolate::GetCurrent(), value); +} +#else +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length); +} + +Factory::return_t +Factory::New( + std::string const& value) /* NOLINT(build/include_what_you_use) */ { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value.data(), + v8::String::kNormalString, + static_cast(value.size())); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); +} + +Factory::return_t +Factory::New(ExternalOneByteStringResource * value) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); +} +#endif + +//=== String Object ============================================================ + +// See https://github.com/nodejs/nan/pull/811#discussion_r224594980. +// Disable the warning as there is no way around it. +// TODO(bnoordhuis) Use isolate-based version in Node.js v12. +Factory::return_t +Factory::New(v8::Local value) { +// V8 > 7.0 +#if V8_MAJOR_VERSION > 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION > 0) + return v8::StringObject::New(v8::Isolate::GetCurrent(), value) + .As(); +#else +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + return v8::StringObject::New(value).As(); +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif +#endif +} + +//=== Unbound Script =========================================================== + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::CompileUnboundScript( + v8::Isolate::GetCurrent(), &src); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::CompileUnboundScript( + v8::Isolate::GetCurrent(), &src); +} +#else +Factory::return_t +Factory::New(v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src); +} +#endif + +} // end of namespace imp + +//=== Presistents and Handles ================================================== + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION +template +inline v8::Local New(v8::Handle h) { + return v8::Local::New(v8::Isolate::GetCurrent(), h); +} +#endif + +template +inline v8::Local New(v8::Persistent const& p) { + return v8::Local::New(v8::Isolate::GetCurrent(), p); +} + +template +inline v8::Local New(Persistent const& p) { + return v8::Local::New(v8::Isolate::GetCurrent(), p); +} + +template +inline v8::Local New(Global const& p) { + return v8::Local::New(v8::Isolate::GetCurrent(), p); +} + +#endif // NAN_IMPLEMENTATION_12_INL_H_ diff --git a/node_modules/nan/nan_implementation_pre_12_inl.h b/node_modules/nan/nan_implementation_pre_12_inl.h new file mode 100644 index 0000000..1472421 --- /dev/null +++ b/node_modules/nan/nan_implementation_pre_12_inl.h @@ -0,0 +1,263 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_IMPLEMENTATION_PRE_12_INL_H_ +#define NAN_IMPLEMENTATION_PRE_12_INL_H_ + +//============================================================================== +// node v0.10 implementation +//============================================================================== + +namespace imp { + +//=== Array ==================================================================== + +Factory::return_t +Factory::New() { + return v8::Array::New(); +} + +Factory::return_t +Factory::New(int length) { + return v8::Array::New(length); +} + +//=== Boolean ================================================================== + +Factory::return_t +Factory::New(bool value) { + return v8::Boolean::New(value)->ToBoolean(); +} + +//=== Boolean Object =========================================================== + +Factory::return_t +Factory::New(bool value) { + return v8::BooleanObject::New(value).As(); +} + +//=== Context ================================================================== + +Factory::return_t +Factory::New( v8::ExtensionConfiguration* extensions + , v8::Local tmpl + , v8::Local obj) { + v8::Persistent ctx = v8::Context::New(extensions, tmpl, obj); + v8::Local lctx = v8::Local::New(ctx); + ctx.Dispose(); + return lctx; +} + +//=== Date ===================================================================== + +Factory::return_t +Factory::New(double value) { + return v8::Date::New(value).As(); +} + +//=== External ================================================================= + +Factory::return_t +Factory::New(void * value) { + return v8::External::New(value); +} + +//=== Function ================================================================= + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data) { + v8::HandleScope scope; + + return scope.Close(Factory::New( + callback, data, v8::Local()) + ->GetFunction()); +} + + +//=== FunctionTemplate ========================================================= + +Factory::return_t +Factory::New( FunctionCallback callback + , v8::Local data + , v8::Local signature) { + if (callback) { + v8::HandleScope scope; + + v8::Local tpl = v8::ObjectTemplate::New(); + tpl->SetInternalFieldCount(imp::kFunctionFieldCount); + v8::Local obj = tpl->NewInstance(); + + obj->SetInternalField( + imp::kFunctionIndex + , v8::External::New(reinterpret_cast(callback))); + + v8::Local val = v8::Local::New(data); + + if (!val.IsEmpty()) { + obj->SetInternalField(imp::kDataIndex, val); + } + + // Note(agnat): Emulate length argument here. Unfortunately, I couldn't find + // a way. Have at it though... + return scope.Close( + v8::FunctionTemplate::New(imp::FunctionCallbackWrapper + , obj + , signature)); + } else { + return v8::FunctionTemplate::New(0, data, signature); + } +} + +//=== Number =================================================================== + +Factory::return_t +Factory::New(double value) { + return v8::Number::New(value); +} + +//=== Number Object ============================================================ + +Factory::return_t +Factory::New(double value) { + return v8::NumberObject::New(value).As(); +} + +//=== Integer, Int32 and Uint32 ================================================ + +template +typename IntegerFactory::return_t +IntegerFactory::New(int32_t value) { + return To(T::New(value)); +} + +template +typename IntegerFactory::return_t +IntegerFactory::New(uint32_t value) { + return To(T::NewFromUnsigned(value)); +} + +Factory::return_t +Factory::New(int32_t value) { + return To(v8::Uint32::NewFromUnsigned(value)); +} + +Factory::return_t +Factory::New(uint32_t value) { + return To(v8::Uint32::NewFromUnsigned(value)); +} + + +//=== Object =================================================================== + +Factory::return_t +Factory::New() { + return v8::Object::New(); +} + +//=== Object Template ========================================================== + +Factory::return_t +Factory::New() { + return v8::ObjectTemplate::New(); +} + +//=== RegExp =================================================================== + +Factory::return_t +Factory::New( + v8::Local pattern + , v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); +} + +//=== Script =================================================================== + +Factory::return_t +Factory::New( v8::Local source) { + return v8::Script::New(source); +} +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + return v8::Script::New(source, const_cast(&origin)); +} + +//=== Signature ================================================================ + +Factory::return_t +Factory::New(Factory::FTH receiver) { + return v8::Signature::New(receiver); +} + +//=== String =================================================================== + +Factory::return_t +Factory::New() { + return v8::String::Empty(); +} + +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::New(value, length); +} + +Factory::return_t +Factory::New( + std::string const& value) /* NOLINT(build/include_what_you_use) */ { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::New(value.data(), static_cast(value.size())); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::New(value, length); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternal(value); +} + +Factory::return_t +Factory::New(v8::String::ExternalAsciiStringResource * value) { + return v8::String::NewExternal(value); +} + +//=== String Object ============================================================ + +Factory::return_t +Factory::New(v8::Local value) { + return v8::StringObject::New(value).As(); +} + +} // end of namespace imp + +//=== Presistents and Handles ================================================== + +template +inline v8::Local New(v8::Handle h) { + return v8::Local::New(h); +} + +template +inline v8::Local New(v8::Persistent const& p) { + return v8::Local::New(p); +} + +template +inline v8::Local New(Persistent const& p) { + return v8::Local::New(p.persistent); +} + +template +inline v8::Local New(Global const& p) { + return v8::Local::New(p.persistent); +} + +#endif // NAN_IMPLEMENTATION_PRE_12_INL_H_ diff --git a/node_modules/nan/nan_json.h b/node_modules/nan/nan_json.h new file mode 100644 index 0000000..33ac8ba --- /dev/null +++ b/node_modules/nan/nan_json.h @@ -0,0 +1,166 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_JSON_H_ +#define NAN_JSON_H_ + +#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION +#define NAN_JSON_H_NEED_PARSE 1 +#else +#define NAN_JSON_H_NEED_PARSE 0 +#endif // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION + +#if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION +#define NAN_JSON_H_NEED_STRINGIFY 0 +#else +#define NAN_JSON_H_NEED_STRINGIFY 1 +#endif // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION + +class JSON { + public: + JSON() { +#if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY + Nan::HandleScope scope; + + Nan::MaybeLocal maybe_global_json = Nan::Get( + Nan::GetCurrentContext()->Global(), + Nan::New("JSON").ToLocalChecked() + ); + + assert(!maybe_global_json.IsEmpty() && "global JSON is empty"); + v8::Local val_global_json = maybe_global_json.ToLocalChecked(); + + assert(val_global_json->IsObject() && "global JSON is not an object"); + Nan::MaybeLocal maybe_obj_global_json = + Nan::To(val_global_json); + + assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty"); + v8::Local global_json = maybe_obj_global_json.ToLocalChecked(); + +#if NAN_JSON_H_NEED_PARSE + Nan::MaybeLocal maybe_parse_method = Nan::Get( + global_json, Nan::New("parse").ToLocalChecked() + ); + + assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty"); + v8::Local parse_method = maybe_parse_method.ToLocalChecked(); + + assert(parse_method->IsFunction() && "JSON.parse is not a function"); + parse_cb_.Reset(parse_method.As()); +#endif // NAN_JSON_H_NEED_PARSE + +#if NAN_JSON_H_NEED_STRINGIFY + Nan::MaybeLocal maybe_stringify_method = Nan::Get( + global_json, Nan::New("stringify").ToLocalChecked() + ); + + assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty"); + v8::Local stringify_method = + maybe_stringify_method.ToLocalChecked(); + + assert( + stringify_method->IsFunction() && "JSON.stringify is not a function" + ); + stringify_cb_.Reset(stringify_method.As()); +#endif // NAN_JSON_H_NEED_STRINGIFY +#endif // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY + } + + inline + Nan::MaybeLocal Parse(v8::Local json_string) { + Nan::EscapableHandleScope scope; +#if NAN_JSON_H_NEED_PARSE + return scope.Escape(parse(json_string)); +#else + Nan::MaybeLocal result; +#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION && \ + NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION + result = v8::JSON::Parse(json_string); +#else +#if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION + v8::Local context_or_isolate = Nan::GetCurrentContext(); +#else + v8::Isolate* context_or_isolate = v8::Isolate::GetCurrent(); +#endif // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION + result = v8::JSON::Parse(context_or_isolate, json_string); +#endif // NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION && + // NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION + if (result.IsEmpty()) return v8::Local(); + return scope.Escape(result.ToLocalChecked()); +#endif // NAN_JSON_H_NEED_PARSE + } + + inline + Nan::MaybeLocal Stringify(v8::Local json_object) { + Nan::EscapableHandleScope scope; + Nan::MaybeLocal result = +#if NAN_JSON_H_NEED_STRINGIFY + Nan::To(stringify(json_object)); +#else + v8::JSON::Stringify(Nan::GetCurrentContext(), json_object); +#endif // NAN_JSON_H_NEED_STRINGIFY + if (result.IsEmpty()) return v8::Local(); + return scope.Escape(result.ToLocalChecked()); + } + + inline + Nan::MaybeLocal Stringify(v8::Local json_object, + v8::Local gap) { + Nan::EscapableHandleScope scope; + Nan::MaybeLocal result = +#if NAN_JSON_H_NEED_STRINGIFY + Nan::To(stringify(json_object, gap)); +#else + v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap); +#endif // NAN_JSON_H_NEED_STRINGIFY + if (result.IsEmpty()) return v8::Local(); + return scope.Escape(result.ToLocalChecked()); + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON) +#if NAN_JSON_H_NEED_PARSE + Nan::Callback parse_cb_; +#endif // NAN_JSON_H_NEED_PARSE +#if NAN_JSON_H_NEED_STRINGIFY + Nan::Callback stringify_cb_; +#endif // NAN_JSON_H_NEED_STRINGIFY + +#if NAN_JSON_H_NEED_PARSE + inline v8::Local parse(v8::Local arg) { + assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty"); + AsyncResource resource("nan:JSON.parse"); + return parse_cb_.Call(1, &arg, &resource).FromMaybe(v8::Local()); + } +#endif // NAN_JSON_H_NEED_PARSE + +#if NAN_JSON_H_NEED_STRINGIFY + inline v8::Local stringify(v8::Local arg) { + assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty"); + AsyncResource resource("nan:JSON.stringify"); + return stringify_cb_.Call(1, &arg, &resource) + .FromMaybe(v8::Local()); + } + + inline v8::Local stringify(v8::Local arg, + v8::Local gap) { + assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty"); + + v8::Local argv[] = { + arg, + Nan::Null(), + gap + }; + AsyncResource resource("nan:JSON.stringify"); + return stringify_cb_.Call(3, argv, &resource) + .FromMaybe(v8::Local()); + } +#endif // NAN_JSON_H_NEED_STRINGIFY +}; + +#endif // NAN_JSON_H_ diff --git a/node_modules/nan/nan_maybe_43_inl.h b/node_modules/nan/nan_maybe_43_inl.h new file mode 100644 index 0000000..c04ce30 --- /dev/null +++ b/node_modules/nan/nan_maybe_43_inl.h @@ -0,0 +1,356 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_MAYBE_43_INL_H_ +#define NAN_MAYBE_43_INL_H_ + +template +using MaybeLocal = v8::MaybeLocal; + +inline +MaybeLocal ToDetailString(v8::Local val) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(val->ToDetailString(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal ToArrayIndex(v8::Local val) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +Maybe Equals(v8::Local a, v8::Local(b)) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return a->Equals(isolate->GetCurrentContext(), b); +} + +inline +MaybeLocal NewInstance(v8::Local h) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(h->NewInstance(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal NewInstance( + v8::Local h + , int argc + , v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal NewInstance(v8::Local h) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(h->NewInstance(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + + +inline MaybeLocal GetFunction( + v8::Local t) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(t->GetFunction(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe Set( + v8::Local obj + , v8::Local key + , v8::Local value) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Set(isolate->GetCurrentContext(), key, value); +} + +inline Maybe Set( + v8::Local obj + , uint32_t index + , v8::Local value) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Set(isolate->GetCurrentContext(), index, value); +} + +#if NODE_MODULE_VERSION < NODE_4_0_MODULE_VERSION +#include "nan_define_own_property_helper.h" // NOLINT(build/include) +#endif + +inline Maybe DefineOwnProperty( + v8::Local obj + , v8::Local key + , v8::Local value + , v8::PropertyAttribute attribs = v8::None) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); +#if NODE_MODULE_VERSION >= NODE_4_0_MODULE_VERSION + return obj->DefineOwnProperty(isolate->GetCurrentContext(), key, value, + attribs); +#else + Maybe maybeCurrent = + obj->GetPropertyAttributes(isolate->GetCurrentContext(), key); + if (maybeCurrent.IsNothing()) { + return Nothing(); + } + v8::PropertyAttribute current = maybeCurrent.FromJust(); + return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs); +#endif +} + +NAN_DEPRECATED inline Maybe ForceSet( + v8::Local obj + , v8::Local key + , v8::Local value + , v8::PropertyAttribute attribs = v8::None) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); +#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION + return key->IsName() + ? obj->DefineOwnProperty(isolate->GetCurrentContext(), + key.As(), value, attribs) + : Nothing(); +#else + return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs); +#endif +} + +inline MaybeLocal Get( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->Get(isolate->GetCurrentContext(), key) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal Get(v8::Local obj, uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->Get(isolate->GetCurrentContext(), index) + .FromMaybe(v8::Local())); +} + +inline v8::PropertyAttribute GetPropertyAttributes( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key) + .FromJust(); +} + +inline Maybe Has( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Has(isolate->GetCurrentContext(), key); +} + +inline Maybe Has(v8::Local obj, uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Has(isolate->GetCurrentContext(), index); +} + +inline Maybe Delete( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Delete(isolate->GetCurrentContext(), key); +} + +inline +Maybe Delete(v8::Local obj, uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->Delete(isolate->GetCurrentContext(), index); +} + +inline +MaybeLocal GetPropertyNames(v8::Local obj) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal GetOwnPropertyNames(v8::Local obj) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe SetPrototype( + v8::Local obj + , v8::Local prototype) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->SetPrototype(isolate->GetCurrentContext(), prototype); +} + +inline MaybeLocal ObjectProtoToString( + v8::Local obj) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe HasOwnProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasOwnProperty(isolate->GetCurrentContext(), key); +} + +inline Maybe HasRealNamedProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key); +} + +inline Maybe HasRealIndexedProperty( + v8::Local obj + , uint32_t index) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index); +} + +inline Maybe HasRealNamedCallbackProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key); +} + +inline MaybeLocal GetRealNamedPropertyInPrototypeChain( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain( + isolate->GetCurrentContext(), key) + .FromMaybe(v8::Local())); +} + +inline MaybeLocal GetRealNamedProperty( + v8::Local obj + , v8::Local key) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + obj->GetRealNamedProperty(isolate->GetCurrentContext(), key) + .FromMaybe(v8::Local())); +} + +inline MaybeLocal CallAsFunction( + v8::Local obj + , v8::Local recv + , int argc + , v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv) + .FromMaybe(v8::Local())); +} + +inline MaybeLocal CallAsConstructor( + v8::Local obj + , int argc, v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape( + obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv) + .FromMaybe(v8::Local())); +} + +inline +MaybeLocal GetSourceLine(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext()) + .FromMaybe(v8::Local())); +} + +inline Maybe GetLineNumber(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return msg->GetLineNumber(isolate->GetCurrentContext()); +} + +inline Maybe GetStartColumn(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return msg->GetStartColumn(isolate->GetCurrentContext()); +} + +inline Maybe GetEndColumn(v8::Local msg) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + return msg->GetEndColumn(isolate->GetCurrentContext()); +} + +inline MaybeLocal CloneElementAt( + v8::Local array + , uint32_t index) { +#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION) + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::Local context = isolate->GetCurrentContext(); + v8::Local elem; + v8::Local obj; + if (!array->Get(context, index).ToLocal(&elem)) { + return scope.Escape(obj); + } + if (!elem->ToObject(context).ToLocal(&obj)) { + return scope.Escape(v8::Local()); + } + return scope.Escape(obj->Clone()); +#else + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index) + .FromMaybe(v8::Local())); +#endif +} + +inline MaybeLocal Call( + v8::Local fun + , v8::Local recv + , int argc + , v8::Local argv[]) { + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv) + .FromMaybe(v8::Local())); +} + +#endif // NAN_MAYBE_43_INL_H_ diff --git a/node_modules/nan/nan_maybe_pre_43_inl.h b/node_modules/nan/nan_maybe_pre_43_inl.h new file mode 100644 index 0000000..83325ae --- /dev/null +++ b/node_modules/nan/nan_maybe_pre_43_inl.h @@ -0,0 +1,268 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_MAYBE_PRE_43_INL_H_ +#define NAN_MAYBE_PRE_43_INL_H_ + +template +class MaybeLocal { + public: + inline MaybeLocal() : val_(v8::Local()) {} + + template +# if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION + inline + MaybeLocal(v8::Local that) : val_(that) {} // NOLINT(runtime/explicit) +# else + inline + MaybeLocal(v8::Local that) : // NOLINT(runtime/explicit) + val_(*reinterpret_cast*>(&that)) {} +# endif + + inline bool IsEmpty() const { return val_.IsEmpty(); } + + template + inline bool ToLocal(v8::Local *out) const { + *out = val_; + return !IsEmpty(); + } + + inline v8::Local ToLocalChecked() const { +#if defined(V8_ENABLE_CHECKS) + assert(!IsEmpty() && "ToLocalChecked is Empty"); +#endif // V8_ENABLE_CHECKS + return val_; + } + + template + inline v8::Local FromMaybe(v8::Local default_value) const { + return IsEmpty() ? default_value : v8::Local(val_); + } + + private: + v8::Local val_; +}; + +inline +MaybeLocal ToDetailString(v8::Handle val) { + return MaybeLocal(val->ToDetailString()); +} + +inline +MaybeLocal ToArrayIndex(v8::Handle val) { + return MaybeLocal(val->ToArrayIndex()); +} + +inline +Maybe Equals(v8::Handle a, v8::Handle(b)) { + return Just(a->Equals(b)); +} + +inline +MaybeLocal NewInstance(v8::Handle h) { + return MaybeLocal(h->NewInstance()); +} + +inline +MaybeLocal NewInstance( + v8::Local h + , int argc + , v8::Local argv[]) { + return MaybeLocal(h->NewInstance(argc, argv)); +} + +inline +MaybeLocal NewInstance(v8::Handle h) { + return MaybeLocal(h->NewInstance()); +} + +inline +MaybeLocal GetFunction(v8::Handle t) { + return MaybeLocal(t->GetFunction()); +} + +inline Maybe Set( + v8::Handle obj + , v8::Handle key + , v8::Handle value) { + return Just(obj->Set(key, value)); +} + +inline Maybe Set( + v8::Handle obj + , uint32_t index + , v8::Handle value) { + return Just(obj->Set(index, value)); +} + +#include "nan_define_own_property_helper.h" // NOLINT(build/include) + +inline Maybe DefineOwnProperty( + v8::Handle obj + , v8::Handle key + , v8::Handle value + , v8::PropertyAttribute attribs = v8::None) { + v8::PropertyAttribute current = obj->GetPropertyAttributes(key); + return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs); +} + +NAN_DEPRECATED inline Maybe ForceSet( + v8::Handle obj + , v8::Handle key + , v8::Handle value + , v8::PropertyAttribute attribs = v8::None) { + return Just(obj->ForceSet(key, value, attribs)); +} + +inline MaybeLocal Get( + v8::Handle obj + , v8::Handle key) { + return MaybeLocal(obj->Get(key)); +} + +inline MaybeLocal Get( + v8::Handle obj + , uint32_t index) { + return MaybeLocal(obj->Get(index)); +} + +inline Maybe GetPropertyAttributes( + v8::Handle obj + , v8::Handle key) { + return Just(obj->GetPropertyAttributes(key)); +} + +inline Maybe Has( + v8::Handle obj + , v8::Handle key) { + return Just(obj->Has(key)); +} + +inline Maybe Has( + v8::Handle obj + , uint32_t index) { + return Just(obj->Has(index)); +} + +inline Maybe Delete( + v8::Handle obj + , v8::Handle key) { + return Just(obj->Delete(key)); +} + +inline Maybe Delete( + v8::Handle obj + , uint32_t index) { + return Just(obj->Delete(index)); +} + +inline +MaybeLocal GetPropertyNames(v8::Handle obj) { + return MaybeLocal(obj->GetPropertyNames()); +} + +inline +MaybeLocal GetOwnPropertyNames(v8::Handle obj) { + return MaybeLocal(obj->GetOwnPropertyNames()); +} + +inline Maybe SetPrototype( + v8::Handle obj + , v8::Handle prototype) { + return Just(obj->SetPrototype(prototype)); +} + +inline MaybeLocal ObjectProtoToString( + v8::Handle obj) { + return MaybeLocal(obj->ObjectProtoToString()); +} + +inline Maybe HasOwnProperty( + v8::Handle obj + , v8::Handle key) { + return Just(obj->HasOwnProperty(key)); +} + +inline Maybe HasRealNamedProperty( + v8::Handle obj + , v8::Handle key) { + return Just(obj->HasRealNamedProperty(key)); +} + +inline Maybe HasRealIndexedProperty( + v8::Handle obj + , uint32_t index) { + return Just(obj->HasRealIndexedProperty(index)); +} + +inline Maybe HasRealNamedCallbackProperty( + v8::Handle obj + , v8::Handle key) { + return Just(obj->HasRealNamedCallbackProperty(key)); +} + +inline MaybeLocal GetRealNamedPropertyInPrototypeChain( + v8::Handle obj + , v8::Handle key) { + return MaybeLocal( + obj->GetRealNamedPropertyInPrototypeChain(key)); +} + +inline MaybeLocal GetRealNamedProperty( + v8::Handle obj + , v8::Handle key) { + return MaybeLocal(obj->GetRealNamedProperty(key)); +} + +inline MaybeLocal CallAsFunction( + v8::Handle obj + , v8::Handle recv + , int argc + , v8::Handle argv[]) { + return MaybeLocal(obj->CallAsFunction(recv, argc, argv)); +} + +inline MaybeLocal CallAsConstructor( + v8::Handle obj + , int argc + , v8::Local argv[]) { + return MaybeLocal(obj->CallAsConstructor(argc, argv)); +} + +inline +MaybeLocal GetSourceLine(v8::Handle msg) { + return MaybeLocal(msg->GetSourceLine()); +} + +inline Maybe GetLineNumber(v8::Handle msg) { + return Just(msg->GetLineNumber()); +} + +inline Maybe GetStartColumn(v8::Handle msg) { + return Just(msg->GetStartColumn()); +} + +inline Maybe GetEndColumn(v8::Handle msg) { + return Just(msg->GetEndColumn()); +} + +inline MaybeLocal CloneElementAt( + v8::Handle array + , uint32_t index) { + return MaybeLocal(array->CloneElementAt(index)); +} + +inline MaybeLocal Call( + v8::Local fun + , v8::Local recv + , int argc + , v8::Local argv[]) { + return MaybeLocal(fun->Call(recv, argc, argv)); +} + +#endif // NAN_MAYBE_PRE_43_INL_H_ diff --git a/node_modules/nan/nan_new.h b/node_modules/nan/nan_new.h new file mode 100644 index 0000000..cdf8bbe --- /dev/null +++ b/node_modules/nan/nan_new.h @@ -0,0 +1,340 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_NEW_H_ +#define NAN_NEW_H_ + +namespace imp { // scnr + +// TODO(agnat): Generalize +template v8::Local To(v8::Local i); + +template <> +inline +v8::Local +To(v8::Local i) { + return Nan::To(i).ToLocalChecked(); +} + +template <> +inline +v8::Local +To(v8::Local i) { + return Nan::To(i).ToLocalChecked(); +} + +template <> +inline +v8::Local +To(v8::Local i) { + return Nan::To(i).ToLocalChecked(); +} + +template struct FactoryBase { + typedef v8::Local return_t; +}; + +template struct MaybeFactoryBase { + typedef MaybeLocal return_t; +}; + +template struct Factory; + +template <> +struct Factory : FactoryBase { + static inline return_t New(); + static inline return_t New(int length); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(bool value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(bool value); +}; + +template <> +struct Factory : FactoryBase { + static inline + return_t + New( v8::ExtensionConfiguration* extensions = NULL + , v8::Local tmpl = v8::Local() + , v8::Local obj = v8::Local()); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New(double value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(void *value); +}; + +template <> +struct Factory : FactoryBase { + static inline + return_t + New( FunctionCallback callback + , v8::Local data = v8::Local()); +}; + +template <> +struct Factory : FactoryBase { + static inline + return_t + New( FunctionCallback callback = NULL + , v8::Local data = v8::Local() + , v8::Local signature = v8::Local()); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(double value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(double value); +}; + +template +struct IntegerFactory : FactoryBase { + typedef typename FactoryBase::return_t return_t; + static inline return_t New(int32_t value); + static inline return_t New(uint32_t value); +}; + +template <> +struct Factory : IntegerFactory {}; + +template <> +struct Factory : IntegerFactory {}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(int32_t value); + static inline return_t New(uint32_t value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New( + v8::Local pattern, v8::RegExp::Flags flags); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New( v8::Local source); + static inline return_t New( v8::Local source + , v8::ScriptOrigin const& origin); +}; + +template <> +struct Factory : FactoryBase { + typedef v8::Local FTH; + static inline return_t New(FTH receiver = FTH()); +}; + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New(); + static inline return_t New(const char *value, int length = -1); + static inline return_t New(const uint16_t *value, int length = -1); + static inline return_t New(std::string const& value); + + static inline return_t New(v8::String::ExternalStringResource * value); + static inline return_t New(ExternalOneByteStringResource * value); +}; + +template <> +struct Factory : FactoryBase { + static inline return_t New(v8::Local value); +}; + +} // end of namespace imp + +#if (NODE_MODULE_VERSION >= 12) + +namespace imp { + +template <> +struct Factory : MaybeFactoryBase { + static inline return_t New( v8::Local source); + static inline return_t New( v8::Local source + , v8::ScriptOrigin const& origin); +}; + +} // end of namespace imp + +# include "nan_implementation_12_inl.h" + +#else // NODE_MODULE_VERSION >= 12 + +# include "nan_implementation_pre_12_inl.h" + +#endif + +//=== API ====================================================================== + +template +typename imp::Factory::return_t +New() { + return imp::Factory::New(); +} + +template +typename imp::Factory::return_t +New(A0 arg0) { + return imp::Factory::New(arg0); +} + +template +typename imp::Factory::return_t +New(A0 arg0, A1 arg1) { + return imp::Factory::New(arg0, arg1); +} + +template +typename imp::Factory::return_t +New(A0 arg0, A1 arg1, A2 arg2) { + return imp::Factory::New(arg0, arg1, arg2); +} + +template +typename imp::Factory::return_t +New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) { + return imp::Factory::New(arg0, arg1, arg2, arg3); +} + +// Note(agnat): When passing overloaded function pointers to template functions +// as generic arguments the compiler needs help in picking the right overload. +// These two functions handle New and New with +// all argument variations. + +// v8::Function and v8::FunctionTemplate with one or two arguments +template +typename imp::Factory::return_t +New( FunctionCallback callback + , v8::Local data = v8::Local()) { + return imp::Factory::New(callback, data); +} + +// v8::Function and v8::FunctionTemplate with three arguments +template +typename imp::Factory::return_t +New( FunctionCallback callback + , v8::Local data = v8::Local() + , A2 a2 = A2()) { + return imp::Factory::New(callback, data, a2); +} + +// Convenience + +#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION +template inline v8::Local New(v8::Handle h); +#endif + +#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +template + inline v8::Local New(v8::Persistent const& p); +#else +template inline v8::Local New(v8::Persistent const& p); +#endif +template +inline v8::Local New(Persistent const& p); +template +inline v8::Local New(Global const& p); + +inline +imp::Factory::return_t +New(bool value) { + return New(value); +} + +inline +imp::Factory::return_t +New(int32_t value) { + return New(value); +} + +inline +imp::Factory::return_t +New(uint32_t value) { + return New(value); +} + +inline +imp::Factory::return_t +New(double value) { + return New(value); +} + +inline +imp::Factory::return_t +New(std::string const& value) { // NOLINT(build/include_what_you_use) + return New(value); +} + +inline +imp::Factory::return_t +New(const char * value, int length) { + return New(value, length); +} + +inline +imp::Factory::return_t +New(const uint16_t * value, int length) { + return New(value, length); +} + +inline +imp::Factory::return_t +New(const char * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(const uint16_t * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(v8::String::ExternalStringResource * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(ExternalOneByteStringResource * value) { + return New(value); +} + +inline +imp::Factory::return_t +New(v8::Local pattern, v8::RegExp::Flags flags) { + return New(pattern, flags); +} + +#endif // NAN_NEW_H_ diff --git a/node_modules/nan/nan_object_wrap.h b/node_modules/nan/nan_object_wrap.h new file mode 100644 index 0000000..78712f9 --- /dev/null +++ b/node_modules/nan/nan_object_wrap.h @@ -0,0 +1,156 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_OBJECT_WRAP_H_ +#define NAN_OBJECT_WRAP_H_ + +class ObjectWrap { + public: + ObjectWrap() { + refs_ = 0; + } + + + virtual ~ObjectWrap() { + if (persistent().IsEmpty()) { + return; + } + + persistent().ClearWeak(); + persistent().Reset(); + } + + + template + static inline T* Unwrap(v8::Local object) { + assert(!object.IsEmpty()); + assert(object->InternalFieldCount() > 0); + // Cast to ObjectWrap before casting to T. A direct cast from void + // to T won't work right when T has more than one base class. + void* ptr = GetInternalFieldPointer(object, 0); + ObjectWrap* wrap = static_cast(ptr); + return static_cast(wrap); + } + + + inline v8::Local handle() const { + return New(handle_); + } + + + inline Persistent& persistent() { + return handle_; + } + + + protected: + inline void Wrap(v8::Local object) { + assert(persistent().IsEmpty()); + assert(object->InternalFieldCount() > 0); + SetInternalFieldPointer(object, 0, this); + persistent().Reset(object); + MakeWeak(); + } + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + + inline void MakeWeak() { + persistent().v8::PersistentBase::SetWeak( + this, WeakCallback, v8::WeakCallbackType::kParameter); +#if NODE_MAJOR_VERSION < 10 + // FIXME(bnoordhuis) Probably superfluous in older Node.js versions too. + persistent().MarkIndependent(); +#endif + } + +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + + inline void MakeWeak() { + persistent().v8::PersistentBase::SetWeak(this, WeakCallback); + persistent().MarkIndependent(); + } + +#else + + inline void MakeWeak() { + persistent().persistent.MakeWeak(this, WeakCallback); + persistent().MarkIndependent(); + } + +#endif + + /* Ref() marks the object as being attached to an event loop. + * Refed objects will not be garbage collected, even if + * all references are lost. + */ + virtual void Ref() { + assert(!persistent().IsEmpty()); + persistent().ClearWeak(); + refs_++; + } + + /* Unref() marks an object as detached from the event loop. This is its + * default state. When an object with a "weak" reference changes from + * attached to detached state it will be freed. Be careful not to access + * the object after making this call as it might be gone! + * (A "weak reference" means an object that only has a + * persistent handle.) + * + * DO NOT CALL THIS FROM DESTRUCTOR + */ + virtual void Unref() { + assert(!persistent().IsEmpty()); + assert(!persistent().IsWeak()); + assert(refs_ > 0); + if (--refs_ == 0) + MakeWeak(); + } + + int refs_; // ro + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(ObjectWrap) +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + + static void + WeakCallback(v8::WeakCallbackInfo const& info) { + ObjectWrap* wrap = info.GetParameter(); + assert(wrap->refs_ == 0); + wrap->handle_.Reset(); + delete wrap; + } + +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + + static void + WeakCallback(v8::WeakCallbackData const& data) { + ObjectWrap* wrap = data.GetParameter(); + assert(wrap->refs_ == 0); + assert(wrap->handle_.IsNearDeath()); + wrap->handle_.Reset(); + delete wrap; + } + +#else + + static void WeakCallback(v8::Persistent value, void *data) { + ObjectWrap *wrap = static_cast(data); + assert(wrap->refs_ == 0); + assert(wrap->handle_.IsNearDeath()); + wrap->handle_.Reset(); + delete wrap; + } + +#endif + Persistent handle_; +}; + + +#endif // NAN_OBJECT_WRAP_H_ diff --git a/node_modules/nan/nan_persistent_12_inl.h b/node_modules/nan/nan_persistent_12_inl.h new file mode 100644 index 0000000..d9649e8 --- /dev/null +++ b/node_modules/nan/nan_persistent_12_inl.h @@ -0,0 +1,132 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_PERSISTENT_12_INL_H_ +#define NAN_PERSISTENT_12_INL_H_ + +template class Persistent : + public v8::Persistent { + public: + inline Persistent() : v8::Persistent() {} + + template inline Persistent(v8::Local that) : + v8::Persistent(v8::Isolate::GetCurrent(), that) {} + + template + inline + Persistent(const v8::Persistent &that) : // NOLINT(runtime/explicit) + v8::Persistent(v8::Isolate::GetCurrent(), that) {} + + inline void Reset() { v8::PersistentBase::Reset(); } + + template + inline void Reset(const v8::Local &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void Reset(const v8::PersistentBase &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type); + + private: + inline T *operator*() const { return *PersistentBase::persistent; } + + template + inline void Copy(const Persistent &that) { + TYPE_CHECK(T, S); + + this->Reset(); + + if (!that.IsEmpty()) { + this->Reset(that); + M::Copy(that, this); + } + } +}; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +template +class Global : public v8::Global { + public: + inline Global() : v8::Global() {} + + template inline Global(v8::Local that) : + v8::Global(v8::Isolate::GetCurrent(), that) {} + + template + inline + Global(const v8::PersistentBase &that) : // NOLINT(runtime/explicit) + v8::Global(v8::Isolate::GetCurrent(), that) {} + + inline void Reset() { v8::PersistentBase::Reset(); } + + template + inline void Reset(const v8::Local &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void Reset(const v8::PersistentBase &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + reinterpret_cast*>(this)->SetWeak( + parameter, callback, type); + } +}; +#else +template +class Global : public v8::UniquePersistent { + public: + inline Global() : v8::UniquePersistent() {} + + template inline Global(v8::Local that) : + v8::UniquePersistent(v8::Isolate::GetCurrent(), that) {} + + template + inline + Global(const v8::PersistentBase &that) : // NOLINT(runtime/explicit) + v8::UniquePersistent(v8::Isolate::GetCurrent(), that) {} + + inline void Reset() { v8::PersistentBase::Reset(); } + + template + inline void Reset(const v8::Local &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void Reset(const v8::PersistentBase &other) { + v8::PersistentBase::Reset(v8::Isolate::GetCurrent(), other); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + reinterpret_cast*>(this)->SetWeak( + parameter, callback, type); + } +}; +#endif + +#endif // NAN_PERSISTENT_12_INL_H_ diff --git a/node_modules/nan/nan_persistent_pre_12_inl.h b/node_modules/nan/nan_persistent_pre_12_inl.h new file mode 100644 index 0000000..4c9c59d --- /dev/null +++ b/node_modules/nan/nan_persistent_pre_12_inl.h @@ -0,0 +1,242 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_PERSISTENT_PRE_12_INL_H_ +#define NAN_PERSISTENT_PRE_12_INL_H_ + +template +class PersistentBase { + v8::Persistent persistent; + template + friend v8::Local New(const PersistentBase &p); + template + friend v8::Local New(const Persistent &p); + template + friend v8::Local New(const Global &p); + template friend class ReturnValue; + + public: + inline PersistentBase() : + persistent() {} + + inline void Reset() { + persistent.Dispose(); + persistent.Clear(); + } + + template + inline void Reset(const v8::Local &other) { + TYPE_CHECK(T, S); + + if (!persistent.IsEmpty()) { + persistent.Dispose(); + } + + if (other.IsEmpty()) { + persistent.Clear(); + } else { + persistent = v8::Persistent::New(other); + } + } + + template + inline void Reset(const PersistentBase &other) { + TYPE_CHECK(T, S); + + if (!persistent.IsEmpty()) { + persistent.Dispose(); + } + + if (other.IsEmpty()) { + persistent.Clear(); + } else { + persistent = v8::Persistent::New(other.persistent); + } + } + + inline bool IsEmpty() const { return persistent.IsEmpty(); } + + inline void Empty() { persistent.Clear(); } + + template + inline bool operator==(const PersistentBase &that) const { + return this->persistent == that.persistent; + } + + template + inline bool operator==(const v8::Local &that) const { + return this->persistent == that; + } + + template + inline bool operator!=(const PersistentBase &that) const { + return !operator==(that); + } + + template + inline bool operator!=(const v8::Local &that) const { + return !operator==(that); + } + + template + inline void SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type); + + inline void ClearWeak() { persistent.ClearWeak(); } + + inline void MarkIndependent() { persistent.MarkIndependent(); } + + inline bool IsIndependent() const { return persistent.IsIndependent(); } + + inline bool IsNearDeath() const { return persistent.IsNearDeath(); } + + inline bool IsWeak() const { return persistent.IsWeak(); } + + private: + inline explicit PersistentBase(v8::Persistent that) : + persistent(that) { } + inline explicit PersistentBase(T *val) : persistent(val) {} + template friend class Persistent; + template friend class Global; + friend class ObjectWrap; +}; + +template +class NonCopyablePersistentTraits { + public: + typedef Persistent > + NonCopyablePersistent; + static const bool kResetInDestructor = false; + template + inline static void Copy(const Persistent &source, + NonCopyablePersistent *dest) { + Uncompilable(); + } + + template inline static void Uncompilable() { + TYPE_CHECK(O, v8::Primitive); + } +}; + +template +struct CopyablePersistentTraits { + typedef Persistent > CopyablePersistent; + static const bool kResetInDestructor = true; + template + static inline void Copy(const Persistent &source, + CopyablePersistent *dest) {} +}; + +template class Persistent : + public PersistentBase { + public: + inline Persistent() {} + + template inline Persistent(v8::Handle that) + : PersistentBase(v8::Persistent::New(that)) { + TYPE_CHECK(T, S); + } + + inline Persistent(const Persistent &that) : PersistentBase() { + Copy(that); + } + + template + inline Persistent(const Persistent &that) : + PersistentBase() { + Copy(that); + } + + inline Persistent &operator=(const Persistent &that) { + Copy(that); + return *this; + } + + template + inline Persistent &operator=(const Persistent &that) { + Copy(that); + return *this; + } + + inline ~Persistent() { + if (M::kResetInDestructor) this->Reset(); + } + + private: + inline T *operator*() const { return *PersistentBase::persistent; } + + template + inline void Copy(const Persistent &that) { + TYPE_CHECK(T, S); + + this->Reset(); + + if (!that.IsEmpty()) { + this->persistent = v8::Persistent::New(that.persistent); + M::Copy(that, this); + } + } +}; + +template +class Global : public PersistentBase { + struct RValue { + inline explicit RValue(Global* obj) : object(obj) {} + Global* object; + }; + + public: + inline Global() : PersistentBase(0) { } + + template + inline Global(v8::Local that) // NOLINT(runtime/explicit) + : PersistentBase(v8::Persistent::New(that)) { + TYPE_CHECK(T, S); + } + + template + inline Global(const PersistentBase &that) // NOLINT(runtime/explicit) + : PersistentBase(that) { + TYPE_CHECK(T, S); + } + /** + * Move constructor. + */ + inline Global(RValue rvalue) // NOLINT(runtime/explicit) + : PersistentBase(rvalue.object->persistent) { + rvalue.object->Reset(); + } + inline ~Global() { this->Reset(); } + /** + * Move via assignment. + */ + template + inline Global &operator=(Global rhs) { + TYPE_CHECK(T, S); + this->Reset(rhs.persistent); + rhs.Reset(); + return *this; + } + /** + * Cast operator for moves. + */ + inline operator RValue() { return RValue(this); } + /** + * Pass allows returning uniques from functions, etc. + */ + Global Pass() { return Global(RValue(this)); } + + private: + Global(Global &); + void operator=(Global &); + template friend class ReturnValue; +}; + +#endif // NAN_PERSISTENT_PRE_12_INL_H_ diff --git a/node_modules/nan/nan_private.h b/node_modules/nan/nan_private.h new file mode 100644 index 0000000..15f44cc --- /dev/null +++ b/node_modules/nan/nan_private.h @@ -0,0 +1,73 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_PRIVATE_H_ +#define NAN_PRIVATE_H_ + +inline Maybe +HasPrivate(v8::Local object, v8::Local key) { + HandleScope scope; +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::Local context = isolate->GetCurrentContext(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + return object->HasPrivate(context, private_key); +#else + return Just(!object->GetHiddenValue(key).IsEmpty()); +#endif +} + +inline MaybeLocal +GetPrivate(v8::Local object, v8::Local key) { +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::EscapableHandleScope scope(isolate); + v8::Local context = isolate->GetCurrentContext(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + v8::MaybeLocal v = object->GetPrivate(context, private_key); + return scope.Escape(v.ToLocalChecked()); +#else + EscapableHandleScope scope; + v8::Local v = object->GetHiddenValue(key); + if (v.IsEmpty()) { + v = Undefined(); + } + return scope.Escape(v); +#endif +} + +inline Maybe SetPrivate( + v8::Local object, + v8::Local key, + v8::Local value) { +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + HandleScope scope; + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::Local context = isolate->GetCurrentContext(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + return object->SetPrivate(context, private_key, value); +#else + return Just(object->SetHiddenValue(key, value)); +#endif +} + +inline Maybe DeletePrivate( + v8::Local object, + v8::Local key) { +#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION + HandleScope scope; + v8::Isolate *isolate = v8::Isolate::GetCurrent(); + v8::Local private_key = v8::Private::ForApi(isolate, key); + return object->DeletePrivate(isolate->GetCurrentContext(), private_key); +#else + return Just(object->DeleteHiddenValue(key)); +#endif +} + +#endif // NAN_PRIVATE_H_ + diff --git a/node_modules/nan/nan_scriptorigin.h b/node_modules/nan/nan_scriptorigin.h new file mode 100644 index 0000000..f107299 --- /dev/null +++ b/node_modules/nan/nan_scriptorigin.h @@ -0,0 +1,95 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2021 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_SCRIPTORIGIN_H_ +#define NAN_SCRIPTORIGIN_H_ + +class ScriptOrigin : public v8::ScriptOrigin { + public: + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 6\ + || (V8_MINOR_VERSION == 6 && defined(V8_BUILD_NUMBER) \ + && V8_BUILD_NUMBER >= 175))))) + explicit ScriptOrigin(v8::Local name) : + v8::ScriptOrigin(name) {} + + ScriptOrigin(v8::Local name + , v8::Local line) : + v8::ScriptOrigin(name + , To(line).FromMaybe(0)) {} + + ScriptOrigin(v8::Local name + , v8::Local line + , v8::Local column) : + v8::ScriptOrigin(name + , To(line).FromMaybe(0) + , To(column).FromMaybe(0)) {} +#elif defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 9 || \ + (V8_MAJOR_VERSION == 9 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 0\ + || (V8_MINOR_VERSION == 0 && defined(V8_BUILD_NUMBER) \ + && V8_BUILD_NUMBER >= 1))))) + explicit ScriptOrigin(v8::Local name) : + v8::ScriptOrigin(v8::Isolate::GetCurrent(), name) {} + + ScriptOrigin(v8::Local name + , v8::Local line) : + v8::ScriptOrigin(v8::Isolate::GetCurrent() + , name + , To(line).FromMaybe(0)) {} + + ScriptOrigin(v8::Local name + , v8::Local line + , v8::Local column) : + v8::ScriptOrigin(v8::Isolate::GetCurrent() + , name + , To(line).FromMaybe(0) + , To(column).FromMaybe(0)) {} +#elif defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 8 || \ + (V8_MAJOR_VERSION == 8 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 9\ + || (V8_MINOR_VERSION == 9 && defined(V8_BUILD_NUMBER) \ + && V8_BUILD_NUMBER >= 45))))) + explicit ScriptOrigin(v8::Local name) : v8::ScriptOrigin(name) {} + + ScriptOrigin(v8::Local name + , v8::Local line) : + v8::ScriptOrigin(name, To(line).FromMaybe(0)) {} + + ScriptOrigin(v8::Local name + , v8::Local line + , v8::Local column) : + v8::ScriptOrigin(name + , To(line).FromMaybe(0) + , To(column).FromMaybe(0)) {} +#else + explicit ScriptOrigin(v8::Local name) : v8::ScriptOrigin(name) {} + + ScriptOrigin(v8::Local name + , v8::Local line) : v8::ScriptOrigin(name, line) {} + + ScriptOrigin(v8::Local name + , v8::Local line + , v8::Local column) : + v8::ScriptOrigin(name, line, column) {} +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 8 || \ + (V8_MAJOR_VERSION == 8 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 9\ + || (V8_MINOR_VERSION == 9 && defined(V8_BUILD_NUMBER) \ + && V8_BUILD_NUMBER >= 45))))) + v8::Local ResourceLineOffset() const { + return New(LineOffset()); + } + + v8::Local ResourceColumnOffset() const { + return New(ColumnOffset()); + } +#endif +}; + +#endif // NAN_SCRIPTORIGIN_H_ diff --git a/node_modules/nan/nan_string_bytes.h b/node_modules/nan/nan_string_bytes.h new file mode 100644 index 0000000..a2e6437 --- /dev/null +++ b/node_modules/nan/nan_string_bytes.h @@ -0,0 +1,305 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +#ifndef NAN_STRING_BYTES_H_ +#define NAN_STRING_BYTES_H_ + +// Decodes a v8::Local or Buffer to a raw char* + +namespace imp { + +using v8::Local; +using v8::Object; +using v8::String; +using v8::Value; + + +//// Base 64 //// + +#define base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4) + + + +//// HEX //// + +static bool contains_non_ascii_slow(const char* buf, size_t len) { + for (size_t i = 0; i < len; ++i) { + if (buf[i] & 0x80) return true; + } + return false; +} + + +static bool contains_non_ascii(const char* src, size_t len) { + if (len < 16) { + return contains_non_ascii_slow(src, len); + } + + const unsigned bytes_per_word = sizeof(void*); + const unsigned align_mask = bytes_per_word - 1; + const unsigned unaligned = reinterpret_cast(src) & align_mask; + + if (unaligned > 0) { + const unsigned n = bytes_per_word - unaligned; + if (contains_non_ascii_slow(src, n)) return true; + src += n; + len -= n; + } + + +#if defined(__x86_64__) || defined(_WIN64) + const uintptr_t mask = 0x8080808080808080ll; +#else + const uintptr_t mask = 0x80808080l; +#endif + + const uintptr_t* srcw = reinterpret_cast(src); + + for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { + if (srcw[i] & mask) return true; + } + + const unsigned remainder = len & align_mask; + if (remainder > 0) { + const size_t offset = len - remainder; + if (contains_non_ascii_slow(src + offset, remainder)) return true; + } + + return false; +} + + +static void force_ascii_slow(const char* src, char* dst, size_t len) { + for (size_t i = 0; i < len; ++i) { + dst[i] = src[i] & 0x7f; + } +} + + +static void force_ascii(const char* src, char* dst, size_t len) { + if (len < 16) { + force_ascii_slow(src, dst, len); + return; + } + + const unsigned bytes_per_word = sizeof(void*); + const unsigned align_mask = bytes_per_word - 1; + const unsigned src_unalign = reinterpret_cast(src) & align_mask; + const unsigned dst_unalign = reinterpret_cast(dst) & align_mask; + + if (src_unalign > 0) { + if (src_unalign == dst_unalign) { + const unsigned unalign = bytes_per_word - src_unalign; + force_ascii_slow(src, dst, unalign); + src += unalign; + dst += unalign; + len -= src_unalign; + } else { + force_ascii_slow(src, dst, len); + return; + } + } + +#if defined(__x86_64__) || defined(_WIN64) + const uintptr_t mask = ~0x8080808080808080ll; +#else + const uintptr_t mask = ~0x80808080l; +#endif + + const uintptr_t* srcw = reinterpret_cast(src); + uintptr_t* dstw = reinterpret_cast(dst); + + for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) { + dstw[i] = srcw[i] & mask; + } + + const unsigned remainder = len & align_mask; + if (remainder > 0) { + const size_t offset = len - remainder; + force_ascii_slow(src + offset, dst + offset, remainder); + } +} + + +static size_t base64_encode(const char* src, + size_t slen, + char* dst, + size_t dlen) { + // We know how much we'll write, just make sure that there's space. + assert(dlen >= base64_encoded_size(slen) && + "not enough space provided for base64 encode"); + + dlen = base64_encoded_size(slen); + + unsigned a; + unsigned b; + unsigned c; + unsigned i; + unsigned k; + unsigned n; + + static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + i = 0; + k = 0; + n = slen / 3 * 3; + + while (i < n) { + a = src[i + 0] & 0xff; + b = src[i + 1] & 0xff; + c = src[i + 2] & 0xff; + + dst[k + 0] = table[a >> 2]; + dst[k + 1] = table[((a & 3) << 4) | (b >> 4)]; + dst[k + 2] = table[((b & 0x0f) << 2) | (c >> 6)]; + dst[k + 3] = table[c & 0x3f]; + + i += 3; + k += 4; + } + + if (n != slen) { + switch (slen - n) { + case 1: + a = src[i + 0] & 0xff; + dst[k + 0] = table[a >> 2]; + dst[k + 1] = table[(a & 3) << 4]; + dst[k + 2] = '='; + dst[k + 3] = '='; + break; + + case 2: + a = src[i + 0] & 0xff; + b = src[i + 1] & 0xff; + dst[k + 0] = table[a >> 2]; + dst[k + 1] = table[((a & 3) << 4) | (b >> 4)]; + dst[k + 2] = table[(b & 0x0f) << 2]; + dst[k + 3] = '='; + break; + } + } + + return dlen; +} + + +static size_t hex_encode(const char* src, size_t slen, char* dst, size_t dlen) { + // We know how much we'll write, just make sure that there's space. + assert(dlen >= slen * 2 && + "not enough space provided for hex encode"); + + dlen = slen * 2; + for (uint32_t i = 0, k = 0; k < dlen; i += 1, k += 2) { + static const char hex[] = "0123456789abcdef"; + uint8_t val = static_cast(src[i]); + dst[k + 0] = hex[val >> 4]; + dst[k + 1] = hex[val & 15]; + } + + return dlen; +} + + + +static Local Encode(const char* buf, + size_t buflen, + enum Encoding encoding) { + assert(buflen <= node::Buffer::kMaxLength); + if (!buflen && encoding != BUFFER) + return New("").ToLocalChecked(); + + Local val; + switch (encoding) { + case BUFFER: + return CopyBuffer(buf, buflen).ToLocalChecked(); + + case ASCII: + if (contains_non_ascii(buf, buflen)) { + char* out = new char[buflen]; + force_ascii(buf, out, buflen); + val = New(out, buflen).ToLocalChecked(); + delete[] out; + } else { + val = New(buf, buflen).ToLocalChecked(); + } + break; + + case UTF8: + val = New(buf, buflen).ToLocalChecked(); + break; + + case BINARY: { + // TODO(isaacs) use ExternalTwoByteString? + const unsigned char *cbuf = reinterpret_cast(buf); + uint16_t * twobytebuf = new uint16_t[buflen]; + for (size_t i = 0; i < buflen; i++) { + // XXX is the following line platform independent? + twobytebuf[i] = cbuf[i]; + } + val = New(twobytebuf, buflen).ToLocalChecked(); + delete[] twobytebuf; + break; + } + + case BASE64: { + size_t dlen = base64_encoded_size(buflen); + char* dst = new char[dlen]; + + size_t written = base64_encode(buf, buflen, dst, dlen); + assert(written == dlen); + + val = New(dst, dlen).ToLocalChecked(); + delete[] dst; + break; + } + + case UCS2: { + const uint16_t* data = reinterpret_cast(buf); + val = New(data, buflen / 2).ToLocalChecked(); + break; + } + + case HEX: { + size_t dlen = buflen * 2; + char* dst = new char[dlen]; + size_t written = hex_encode(buf, buflen, dst, dlen); + assert(written == dlen); + + val = New(dst, dlen).ToLocalChecked(); + delete[] dst; + break; + } + + default: + assert(0 && "unknown encoding"); + break; + } + + return val; +} + +#undef base64_encoded_size + +} // end of namespace imp + +#endif // NAN_STRING_BYTES_H_ diff --git a/node_modules/nan/nan_typedarray_contents.h b/node_modules/nan/nan_typedarray_contents.h new file mode 100644 index 0000000..c6ac8a4 --- /dev/null +++ b/node_modules/nan/nan_typedarray_contents.h @@ -0,0 +1,96 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_TYPEDARRAY_CONTENTS_H_ +#define NAN_TYPEDARRAY_CONTENTS_H_ + +template +class TypedArrayContents { + public: + inline explicit TypedArrayContents(v8::Local from) : + length_(0), data_(NULL) { + HandleScope scope; + + size_t length = 0; + void* data = NULL; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + + if (from->IsArrayBufferView()) { + v8::Local array = + v8::Local::Cast(from); + + const size_t byte_length = array->ByteLength(); + const ptrdiff_t byte_offset = array->ByteOffset(); + v8::Local buffer = array->Buffer(); + + length = byte_length / sizeof(T); +// Actually it's 7.9 here but this would lead to ABI issues with Node.js 13 +// using 7.8 till 13.2.0. +#if (V8_MAJOR_VERSION >= 8) + data = static_cast(buffer->GetBackingStore()->Data()) + byte_offset; +#else + data = static_cast(buffer->GetContents().Data()) + byte_offset; +#endif + } + +#else + + if (from->IsObject() && !from->IsNull()) { + v8::Local array = v8::Local::Cast(from); + + MaybeLocal buffer = Get(array, + New("buffer").ToLocalChecked()); + MaybeLocal byte_length = Get(array, + New("byteLength").ToLocalChecked()); + MaybeLocal byte_offset = Get(array, + New("byteOffset").ToLocalChecked()); + + if (!buffer.IsEmpty() && + !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() && + !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) { + data = array->GetIndexedPropertiesExternalArrayData(); + if(data) { + length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T); + } + } + } + +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L + assert(reinterpret_cast(data) % alignof (T) == 0); +#elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__) + assert(reinterpret_cast(data) % __alignof(T) == 0); +#else + assert(reinterpret_cast(data) % sizeof (T) == 0); +#endif + + length_ = length; + data_ = static_cast(data); + } + + inline size_t length() const { return length_; } + inline T* operator*() { return data_; } + inline const T* operator*() const { return data_; } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents) + + //Disable heap allocation + void *operator new(size_t size); + void operator delete(void *, size_t) { + abort(); + } + + size_t length_; + T* data_; +}; + +#endif // NAN_TYPEDARRAY_CONTENTS_H_ diff --git a/node_modules/nan/nan_weak.h b/node_modules/nan/nan_weak.h new file mode 100644 index 0000000..7e7ab07 --- /dev/null +++ b/node_modules/nan/nan_weak.h @@ -0,0 +1,437 @@ +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +#ifndef NAN_WEAK_H_ +#define NAN_WEAK_H_ + +static const int kInternalFieldsInWeakCallback = 2; +static const int kNoInternalFieldIndex = -1; + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ + v8::WeakCallbackInfo > const& +# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION +# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ + v8::PhantomCallbackData > const& +# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \ + v8::PhantomCallbackData > const& +# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \ + v8::InternalFieldsCallbackData, void> const& +# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +# define NAN_WEAK_CALLBACK_DATA_TYPE_ \ + v8::WeakCallbackData > const& +# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_ +#else +# define NAN_WEAK_CALLBACK_DATA_TYPE_ void * +# define NAN_WEAK_CALLBACK_SIG_ \ + v8::Persistent, NAN_WEAK_CALLBACK_DATA_TYPE_ +#endif + +template +class WeakCallbackInfo { + public: + typedef void (*Callback)(const WeakCallbackInfo& data); + WeakCallbackInfo( + Persistent *persistent + , Callback callback + , void *parameter + , void *field1 = 0 + , void *field2 = 0) : + callback_(callback), isolate_(0), parameter_(parameter) { + std::memcpy(&persistent_, persistent, sizeof (v8::Persistent)); + internal_fields_[0] = field1; + internal_fields_[1] = field2; + } + inline v8::Isolate *GetIsolate() const { return isolate_; } + inline T *GetParameter() const { return static_cast(parameter_); } + inline void *GetInternalField(int index) const { + assert((index == 0 || index == 1) && "internal field index out of bounds"); + if (index == 0) { + return internal_fields_[0]; + } else { + return internal_fields_[1]; + } + } + + private: + NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo) + Callback callback_; + v8::Isolate *isolate_; + void *parameter_; + void *internal_fields_[kInternalFieldsInWeakCallback]; + v8::Persistent persistent_; + template friend class Persistent; + template friend class PersistentBase; +#if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION +# if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + template + static void invoke(NAN_WEAK_CALLBACK_SIG_ data); + template + static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); +# else + static void invoke(NAN_WEAK_CALLBACK_SIG_ data); + static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data); +# endif +#else +# if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + template + static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data); + template + static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data); +# else + static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data); + static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data); +# endif + static WeakCallbackInfo *unwrapparameter( + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data); + static WeakCallbackInfo *unwraptwofield( + NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data); +#endif +}; + + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + +template +template +void +WeakCallbackInfo::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrapparameter(data); + if (isFirstPass) { + cbinfo->persistent_.Reset(); + data.SetSecondPassCallback(invokeparameter); + } else { + cbinfo->callback_(*cbinfo); + delete cbinfo; + } +} + +template +template +void +WeakCallbackInfo::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwraptwofield(data); + if (isFirstPass) { + cbinfo->persistent_.Reset(); + data.SetSecondPassCallback(invoketwofield); + } else { + cbinfo->callback_(*cbinfo); + delete cbinfo; + } +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwrapparameter( + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetParameter()); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwraptwofield( + NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetInternalField(0)); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_ +#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +# elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION + +template +void +WeakCallbackInfo::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrapparameter(data); + cbinfo->persistent_.Reset(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +void +WeakCallbackInfo::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwraptwofield(data); + cbinfo->persistent_.Reset(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwrapparameter( + NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetParameter()); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwraptwofield( + NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data.GetInternalField1()); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_ +#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ +#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION + +template +template +void WeakCallbackInfo::invoke(NAN_WEAK_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrap(data); + cbinfo->persistent_.Reset(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +template +WeakCallbackInfo *WeakCallbackInfo::unwrap( + NAN_WEAK_CALLBACK_DATA_TYPE_ data) { + void *parameter = data.GetParameter(); + WeakCallbackInfo *cbinfo = + static_cast*>(parameter); + cbinfo->isolate_ = data.GetIsolate(); + return cbinfo; +} + +#undef NAN_WEAK_CALLBACK_SIG_ +#undef NAN_WEAK_CALLBACK_DATA_TYPE_ +#else + +template +void WeakCallbackInfo::invoke(NAN_WEAK_CALLBACK_SIG_ data) { + WeakCallbackInfo *cbinfo = unwrap(data); + cbinfo->persistent_.Dispose(); + cbinfo->persistent_.Clear(); + cbinfo->callback_(*cbinfo); + delete cbinfo; +} + +template +WeakCallbackInfo *WeakCallbackInfo::unwrap( + NAN_WEAK_CALLBACK_DATA_TYPE_ data) { + WeakCallbackInfo *cbinfo = + static_cast*>(data); + cbinfo->isolate_ = v8::Isolate::GetCurrent(); + return cbinfo; +} + +#undef NAN_WEAK_CALLBACK_SIG_ +#undef NAN_WEAK_CALLBACK_DATA_TYPE_ +#endif + +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetWeak( + wcbd + , WeakCallbackInfo

::template invokeparameter + , type); + } else { + v8::Local* self_v(reinterpret_cast*>(this)); + assert((*self_v)->IsObject()); + v8::Local self((*self_v).As()); + int count = self->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = self->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + self->SetAlignedPointerInInternalField(0, wcbd); + v8::PersistentBase::SetWeak( + static_cast*>(0) + , WeakCallbackInfo

::template invoketwofield + , type); + } +} +#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetPhantom( + wcbd + , WeakCallbackInfo

::invokeparameter); + } else { + v8::Local* self_v(reinterpret_cast*>(this)); + assert((*self_v)->IsObject()); + v8::Local self((*self_v).As()); + int count = self->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = self->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + self->SetAlignedPointerInInternalField(0, wcbd); + v8::PersistentBase::SetPhantom( + static_cast*>(0) + , WeakCallbackInfo

::invoketwofield + , 0 + , count > 1 ? 1 : kNoInternalFieldIndex); + } +} +#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetPhantom( + wcbd + , WeakCallbackInfo

::invokeparameter); + } else { + v8::Local* self_v(reinterpret_cast*>(this)); + assert((*self_v)->IsObject()); + v8::Local self((*self_v).As()); + int count = self->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = self->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + self->SetAlignedPointerInInternalField(0, wcbd); + v8::PersistentBase::SetPhantom( + WeakCallbackInfo

::invoketwofield + , 0 + , count > 1 ? 1 : kNoInternalFieldIndex); + } +} +#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION +template +template +inline void Persistent::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + v8::PersistentBase::SetWeak(wcbd, WeakCallbackInfo

::invoke); + } else { + v8::Local* self_v(reinterpret_cast*>(this)); + assert((*self_v)->IsObject()); + v8::Local self((*self_v).As()); + int count = self->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = self->GetAlignedPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + v8::PersistentBase::SetWeak(wcbd, WeakCallbackInfo

::invoke); + } +} +#else +template +template +inline void PersistentBase::SetWeak( + P *parameter + , typename WeakCallbackInfo

::Callback callback + , WeakCallbackType type) { + WeakCallbackInfo

*wcbd; + if (type == WeakCallbackType::kParameter) { + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , parameter); + persistent.MakeWeak(wcbd, WeakCallbackInfo

::invoke); + } else { + v8::Local* self_v(reinterpret_cast*>(this)); + assert((*self_v)->IsObject()); + v8::Local self((*self_v).As()); + int count = self->InternalFieldCount(); + void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0}; + for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) { + internal_fields[i] = self->GetPointerFromInternalField(i); + } + wcbd = new WeakCallbackInfo

( + reinterpret_cast*>(this) + , callback + , 0 + , internal_fields[0] + , internal_fields[1]); + persistent.MakeWeak(wcbd, WeakCallbackInfo

::invoke); + } +} +#endif + +#endif // NAN_WEAK_H_ diff --git a/node_modules/nan/package.json b/node_modules/nan/package.json new file mode 100644 index 0000000..b678f3e --- /dev/null +++ b/node_modules/nan/package.json @@ -0,0 +1,38 @@ +{ + "name": "nan", + "version": "2.22.2", + "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 22 compatibility", + "main": "include_dirs.js", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/nan.git" + }, + "scripts": { + "test": "tap --gc --stderr test/js/*-test.js", + "test:worker": "node --experimental-worker test/tap-as-worker.js --gc --stderr test/js/*-test.js", + "rebuild-tests-2015": "node-gyp rebuild --msvs_version=2015 --directory test", + "rebuild-tests": "node-gyp rebuild --directory test", + "docs": "doc/.build.sh" + }, + "contributors": [ + "Rod Vagg (https://github.com/rvagg)", + "Benjamin Byholm (https://github.com/kkoopa/)", + "Trevor Norris (https://github.com/trevnorris)", + "Nathan Rajlich (https://github.com/TooTallNate)", + "Brett Lawson (https://github.com/brett19)", + "Ben Noordhuis (https://github.com/bnoordhuis)", + "David Siegel (https://github.com/agnat)", + "Michael Ira Krufky (https://github.com/mkrufky)" + ], + "devDependencies": { + "bindings": "~1.2.1", + "commander": "^2.8.1", + "glob": "^5.0.14", + "request": "=2.81.0", + "node-gyp": "~v10.3.1", + "readable-stream": "^2.1.4", + "tap": "~0.7.1", + "xtend": "~4.0.0" + }, + "license": "MIT" +} diff --git a/node_modules/nan/tools/1to2.js b/node_modules/nan/tools/1to2.js new file mode 100755 index 0000000..bc44151 --- /dev/null +++ b/node_modules/nan/tools/1to2.js @@ -0,0 +1,412 @@ +#!/usr/bin/env node +/********************************************************************* + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2018 NAN contributors + * + * MIT License + ********************************************************************/ + +var commander = require('commander'), + fs = require('fs'), + glob = require('glob'), + groups = [], + total = 0, + warning1 = '/* ERROR: Rewrite using Buffer */\n', + warning2 = '\\/\\* ERROR\\: Rewrite using Buffer \\*\\/\\n', + length, + i; + +fs.readFile(__dirname + '/package.json', 'utf8', function (err, data) { + if (err) { + throw err; + } + + commander + .version(JSON.parse(data).version) + .usage('[options] ') + .parse(process.argv); + + if (!process.argv.slice(2).length) { + commander.outputHelp(); + } +}); + +/* construct strings representing regular expressions + each expression contains a unique group allowing for identification of the match + the index of this key group, relative to the regular expression in question, + is indicated by the first array member */ + +/* simple substistutions, key group is the entire match, 0 */ +groups.push([0, [ + '_NAN_', + 'NODE_SET_METHOD', + 'NODE_SET_PROTOTYPE_METHOD', + 'NanAsciiString', + 'NanEscapeScope', + 'NanReturnValue', + 'NanUcs2String'].join('|')]); + +/* substitutions of parameterless macros, key group is 1 */ +groups.push([1, ['(', [ + 'NanEscapableScope', + 'NanReturnNull', + 'NanReturnUndefined', + 'NanScope'].join('|'), ')\\(\\)'].join('')]); + +/* replace TryCatch with NanTryCatch once, gobbling possible namespace, key group 2 */ +groups.push([2, '(?:(?:v8\\:\\:)?|(Nan)?)(TryCatch)']); + +/* NanNew("string") will likely not fail a ToLocalChecked(), key group 1 */ +groups.push([1, ['(NanNew)', '(\\("[^\\"]*"[^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]); + +/* Removed v8 APIs, warn that the code needs rewriting using node::Buffer, key group 2 */ +groups.push([2, ['(', warning2, ')?', '^.*?(', [ + 'GetIndexedPropertiesExternalArrayDataLength', + 'GetIndexedPropertiesExternalArrayData', + 'GetIndexedPropertiesExternalArrayDataType', + 'GetIndexedPropertiesPixelData', + 'GetIndexedPropertiesPixelDataLength', + 'HasIndexedPropertiesInExternalArrayData', + 'HasIndexedPropertiesInPixelData', + 'SetIndexedPropertiesToExternalArrayData', + 'SetIndexedPropertiesToPixelData'].join('|'), ')'].join('')]); + +/* No need for NanScope in V8-exposed methods, key group 2 */ +groups.push([2, ['((', [ + 'NAN_METHOD', + 'NAN_GETTER', + 'NAN_SETTER', + 'NAN_PROPERTY_GETTER', + 'NAN_PROPERTY_SETTER', + 'NAN_PROPERTY_ENUMERATOR', + 'NAN_PROPERTY_DELETER', + 'NAN_PROPERTY_QUERY', + 'NAN_INDEX_GETTER', + 'NAN_INDEX_SETTER', + 'NAN_INDEX_ENUMERATOR', + 'NAN_INDEX_DELETER', + 'NAN_INDEX_QUERY'].join('|'), ')\\([^\\)]*\\)\\s*\\{)\\s*NanScope\\(\\)\\s*;'].join('')]); + +/* v8::Value::ToXXXXXXX returns v8::MaybeLocal, key group 3 */ +groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->(', [ + 'Boolean', + 'Number', + 'String', + 'Object', + 'Integer', + 'Uint32', + 'Int32'].join('|'), ')\\('].join('')]); + +/* v8::Value::XXXXXXXValue returns v8::Maybe, key group 3 */ +groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->((?:', [ + 'Boolean', + 'Number', + 'Integer', + 'Uint32', + 'Int32'].join('|'), ')Value)\\('].join('')]); + +/* NAN_WEAK_CALLBACK macro was removed, write out callback definition, key group 1 */ +groups.push([1, '(NAN_WEAK_CALLBACK)\\(([^\\s\\)]+)\\)']); + +/* node::ObjectWrap and v8::Persistent have been replaced with Nan implementations, key group 1 */ +groups.push([1, ['(', [ + 'NanDisposePersistent', + 'NanObjectWrapHandle'].join('|'), ')\\s*\\(\\s*([^\\s\\)]+)'].join('')]); + +/* Since NanPersistent there is no need for NanMakeWeakPersistent, key group 1 */ +groups.push([1, '(NanMakeWeakPersistent)\\s*\\(\\s*([^\\s,]+)\\s*,\\s*']); + +/* Many methods of v8::Object and others now return v8::MaybeLocal, key group 3 */ +groups.push([3, ['([\\s])([^\\s]+)->(', [ + 'GetEndColumn', + 'GetFunction', + 'GetLineNumber', + 'NewInstance', + 'GetPropertyNames', + 'GetOwnPropertyNames', + 'GetSourceLine', + 'GetStartColumn', + 'ObjectProtoToString', + 'ToArrayIndex', + 'ToDetailString', + 'CallAsConstructor', + 'CallAsFunction', + 'CloneElementAt', + 'Delete', + 'ForceSet', + 'Get', + 'GetPropertyAttributes', + 'GetRealNamedProperty', + 'GetRealNamedPropertyInPrototypeChain', + 'Has', + 'HasOwnProperty', + 'HasRealIndexedProperty', + 'HasRealNamedCallbackProperty', + 'HasRealNamedProperty', + 'Set', + 'SetAccessor', + 'SetIndexedPropertyHandler', + 'SetNamedPropertyHandler', + 'SetPrototype'].join('|'), ')\\('].join('')]); + +/* You should get an error if any of these fail anyways, + or handle the error better, it is indicated either way, key group 2 */ +groups.push([2, ['NanNew(<(?:v8\\:\\:)?(', ['Date', 'String', 'RegExp'].join('|'), ')>)(\\([^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]); + +/* v8::Value::Equals now returns a v8::Maybe, key group 3 */ +groups.push([3, '([\\s\\(\\)])([^\\s\\(\\)]+)->(Equals)\\(([^\\s\\)]+)']); + +/* NanPersistent makes this unnecessary, key group 1 */ +groups.push([1, '(NanAssignPersistent)(?:]+>)?\\(([^,]+),\\s*']); + +/* args has been renamed to info, key group 2 */ +groups.push([2, '(\\W)(args)(\\W)']) + +/* node::ObjectWrap was replaced with NanObjectWrap, key group 2 */ +groups.push([2, '(\\W)(?:node\\:\\:)?(ObjectWrap)(\\W)']); + +/* v8::Persistent was replaced with NanPersistent, key group 2 */ +groups.push([2, '(\\W)(?:v8\\:\\:)?(Persistent)(\\W)']); + +/* counts the number of capturing groups in a well-formed regular expression, + ignoring non-capturing groups and escaped parentheses */ +function groupcount(s) { + var positive = s.match(/\((?!\?)/g), + negative = s.match(/\\\(/g); + return (positive ? positive.length : 0) - (negative ? negative.length : 0); +} + +/* compute the absolute position of each key group in the joined master RegExp */ +for (i = 1, length = groups.length; i < length; i++) { + total += groupcount(groups[i - 1][1]); + groups[i][0] += total; +} + +/* create the master RegExp, which is the union of all the groups' expressions */ +master = new RegExp(groups.map(function (a) { return a[1]; }).join('|'), 'gm'); + +/* replacement function for String.replace, receives 21 arguments */ +function replace() { + /* simple expressions */ + switch (arguments[groups[0][0]]) { + case '_NAN_': + return 'NAN_'; + case 'NODE_SET_METHOD': + return 'NanSetMethod'; + case 'NODE_SET_PROTOTYPE_METHOD': + return 'NanSetPrototypeMethod'; + case 'NanAsciiString': + return 'NanUtf8String'; + case 'NanEscapeScope': + return 'scope.Escape'; + case 'NanReturnNull': + return 'info.GetReturnValue().SetNull'; + case 'NanReturnValue': + return 'info.GetReturnValue().Set'; + case 'NanUcs2String': + return 'v8::String::Value'; + default: + } + + /* macros without arguments */ + switch (arguments[groups[1][0]]) { + case 'NanEscapableScope': + return 'NanEscapableScope scope' + case 'NanReturnUndefined': + return 'return'; + case 'NanScope': + return 'NanScope scope'; + default: + } + + /* TryCatch, emulate negative backref */ + if (arguments[groups[2][0]] === 'TryCatch') { + return arguments[groups[2][0] - 1] ? arguments[0] : 'NanTryCatch'; + } + + /* NanNew("foo") --> NanNew("foo").ToLocalChecked() */ + if (arguments[groups[3][0]] === 'NanNew') { + return [arguments[0], '.ToLocalChecked()'].join(''); + } + + /* insert warning for removed functions as comment on new line above */ + switch (arguments[groups[4][0]]) { + case 'GetIndexedPropertiesExternalArrayData': + case 'GetIndexedPropertiesExternalArrayDataLength': + case 'GetIndexedPropertiesExternalArrayDataType': + case 'GetIndexedPropertiesPixelData': + case 'GetIndexedPropertiesPixelDataLength': + case 'HasIndexedPropertiesInExternalArrayData': + case 'HasIndexedPropertiesInPixelData': + case 'SetIndexedPropertiesToExternalArrayData': + case 'SetIndexedPropertiesToPixelData': + return arguments[groups[4][0] - 1] ? arguments[0] : [warning1, arguments[0]].join(''); + default: + } + + /* remove unnecessary NanScope() */ + switch (arguments[groups[5][0]]) { + case 'NAN_GETTER': + case 'NAN_METHOD': + case 'NAN_SETTER': + case 'NAN_INDEX_DELETER': + case 'NAN_INDEX_ENUMERATOR': + case 'NAN_INDEX_GETTER': + case 'NAN_INDEX_QUERY': + case 'NAN_INDEX_SETTER': + case 'NAN_PROPERTY_DELETER': + case 'NAN_PROPERTY_ENUMERATOR': + case 'NAN_PROPERTY_GETTER': + case 'NAN_PROPERTY_QUERY': + case 'NAN_PROPERTY_SETTER': + return arguments[groups[5][0] - 1]; + default: + } + + /* Value conversion */ + switch (arguments[groups[6][0]]) { + case 'Boolean': + case 'Int32': + case 'Integer': + case 'Number': + case 'Object': + case 'String': + case 'Uint32': + return [arguments[groups[6][0] - 2], 'NanTo(', arguments[groups[6][0] - 1]].join(''); + default: + } + + /* other value conversion */ + switch (arguments[groups[7][0]]) { + case 'BooleanValue': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + case 'Int32Value': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + case 'IntegerValue': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + case 'Uint32Value': + return [arguments[groups[7][0] - 2], 'NanTo(', arguments[groups[7][0] - 1]].join(''); + default: + } + + /* NAN_WEAK_CALLBACK */ + if (arguments[groups[8][0]] === 'NAN_WEAK_CALLBACK') { + return ['template\nvoid ', + arguments[groups[8][0] + 1], '(const NanWeakCallbackInfo &data)'].join(''); + } + + /* use methods on NAN classes instead */ + switch (arguments[groups[9][0]]) { + case 'NanDisposePersistent': + return [arguments[groups[9][0] + 1], '.Reset('].join(''); + case 'NanObjectWrapHandle': + return [arguments[groups[9][0] + 1], '->handle('].join(''); + default: + } + + /* use method on NanPersistent instead */ + if (arguments[groups[10][0]] === 'NanMakeWeakPersistent') { + return arguments[groups[10][0] + 1] + '.SetWeak('; + } + + /* These return Maybes, the upper ones take no arguments */ + switch (arguments[groups[11][0]]) { + case 'GetEndColumn': + case 'GetFunction': + case 'GetLineNumber': + case 'GetOwnPropertyNames': + case 'GetPropertyNames': + case 'GetSourceLine': + case 'GetStartColumn': + case 'NewInstance': + case 'ObjectProtoToString': + case 'ToArrayIndex': + case 'ToDetailString': + return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1]].join(''); + case 'CallAsConstructor': + case 'CallAsFunction': + case 'CloneElementAt': + case 'Delete': + case 'ForceSet': + case 'Get': + case 'GetPropertyAttributes': + case 'GetRealNamedProperty': + case 'GetRealNamedPropertyInPrototypeChain': + case 'Has': + case 'HasOwnProperty': + case 'HasRealIndexedProperty': + case 'HasRealNamedCallbackProperty': + case 'HasRealNamedProperty': + case 'Set': + case 'SetAccessor': + case 'SetIndexedPropertyHandler': + case 'SetNamedPropertyHandler': + case 'SetPrototype': + return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1], ', '].join(''); + default: + } + + /* Automatic ToLocalChecked(), take it or leave it */ + switch (arguments[groups[12][0]]) { + case 'Date': + case 'String': + case 'RegExp': + return ['NanNew', arguments[groups[12][0] - 1], arguments[groups[12][0] + 1], '.ToLocalChecked()'].join(''); + default: + } + + /* NanEquals is now required for uniformity */ + if (arguments[groups[13][0]] === 'Equals') { + return [arguments[groups[13][0] - 1], 'NanEquals(', arguments[groups[13][0] - 1], ', ', arguments[groups[13][0] + 1]].join(''); + } + + /* use method on replacement class instead */ + if (arguments[groups[14][0]] === 'NanAssignPersistent') { + return [arguments[groups[14][0] + 1], '.Reset('].join(''); + } + + /* args --> info */ + if (arguments[groups[15][0]] === 'args') { + return [arguments[groups[15][0] - 1], 'info', arguments[groups[15][0] + 1]].join(''); + } + + /* ObjectWrap --> NanObjectWrap */ + if (arguments[groups[16][0]] === 'ObjectWrap') { + return [arguments[groups[16][0] - 1], 'NanObjectWrap', arguments[groups[16][0] + 1]].join(''); + } + + /* Persistent --> NanPersistent */ + if (arguments[groups[17][0]] === 'Persistent') { + return [arguments[groups[17][0] - 1], 'NanPersistent', arguments[groups[17][0] + 1]].join(''); + } + + /* This should not happen. A switch is probably missing a case if it does. */ + throw 'Unhandled match: ' + arguments[0]; +} + +/* reads a file, runs replacement and writes it back */ +function processFile(file) { + fs.readFile(file, {encoding: 'utf8'}, function (err, data) { + if (err) { + throw err; + } + + /* run replacement twice, might need more runs */ + fs.writeFile(file, data.replace(master, replace).replace(master, replace), function (err) { + if (err) { + throw err; + } + }); + }); +} + +/* process file names from command line and process the identified files */ +for (i = 2, length = process.argv.length; i < length; i++) { + glob(process.argv[i], function (err, matches) { + if (err) { + throw err; + } + matches.forEach(processFile); + }); +} diff --git a/node_modules/nan/tools/README.md b/node_modules/nan/tools/README.md new file mode 100644 index 0000000..7f07e4b --- /dev/null +++ b/node_modules/nan/tools/README.md @@ -0,0 +1,14 @@ +1to2 naively converts source code files from NAN 1 to NAN 2. There will be erroneous conversions, +false positives and missed opportunities. The input files are rewritten in place. Make sure that +you have backups. You will have to manually review the changes afterwards and do some touchups. + +```sh +$ tools/1to2.js + + Usage: 1to2 [options] + + Options: + + -h, --help output usage information + -V, --version output the version number +``` diff --git a/node_modules/nan/tools/package.json b/node_modules/nan/tools/package.json new file mode 100644 index 0000000..2dcdd78 --- /dev/null +++ b/node_modules/nan/tools/package.json @@ -0,0 +1,19 @@ +{ + "name": "1to2", + "version": "1.0.0", + "description": "NAN 1 -> 2 Migration Script", + "main": "1to2.js", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/nan.git" + }, + "contributors": [ + "Benjamin Byholm (https://github.com/kkoopa/)", + "Mathias Küsel (https://github.com/mathiask88/)" + ], + "dependencies": { + "glob": "~5.0.10", + "commander": "~2.8.1" + }, + "license": "MIT" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7cd29c0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,60 @@ +{ + "name": "portal", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "portal", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "adafruit-i2c-lcd": "^2.0.0" + } + }, + "node_modules/adafruit-i2c-lcd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adafruit-i2c-lcd/-/adafruit-i2c-lcd-2.0.0.tgz", + "integrity": "sha512-L23HBVbNyr1yGXwO0RsT6modQgqOe98EDA4OR8oo74Rhwy5xaqPjSSBFvvBc7IX7hgjjBS12udSzguCehSzrxw==", + "license": "BSD-2-Clause", + "dependencies": { + "i2c-bus": "^5.1.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/i2c-bus": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/i2c-bus/-/i2c-bus-5.2.3.tgz", + "integrity": "sha512-kzFgU0OSIZlaeUUa+VK7L+kkxnj4feimCVQDOPrzj0cTaB+hNweTsO8/j7QvW2gRgWQ7ds5IpfFjpBrX+fMNng==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.17.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..aff7459 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "portal", + "version": "1.0.0", + "description": "https://blackportaldetroit.com", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git@git.featherboaz.com:boazsender/portal.git" + }, + "author": "", + "license": "ISC", + "dependencies": { + "adafruit-i2c-lcd": "^2.0.0" + } +}