{"_id":"wingbot-facebook","_rev":"46-ec18f430e7ec2709b51eaed786577181","name":"wingbot-facebook","dist-tags":{"latest":"3.1.0","next":"3.0.0-alpha.10"},"versions":{"1.0.0-alpha.1":{"name":"wingbot-facebook","version":"1.0.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.224.1","chai":"^4.1.2","eslint":"^4.19.1","eslint-config-airbnb":"^16.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.10.0","eslint-plugin-jsdoc":"^3.6.2","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-mocha":"^5.0.0","eslint-plugin-react":"^7.7.0","jsdoc-to-markdown":"^4.0.1","mocha":"^5.0.5","nyc":"^11.6.0","sinon":"^4.5.0","wingbot":"^0.9.0-alpha.4"},"dependencies":{"fast-deep-equal":"^1.1.0","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^0.9.0-alpha.4"},"gitHead":"a719d7a0d58ca0b66d503a9d3e356d83af08a01f","_id":"wingbot-facebook@1.0.0-alpha.1","_npmVersion":"5.8.0","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-DuBrRV2N4s25E0pqjmV+KIxpm6gO3KC2wg8Yy1KpWgzjjBTVPDALDMVRV0hZBGjnAWY0aQzOMRrZdNtXErcZ/w==","shasum":"59c598e48ebcd1ec63a8de31cd847fdd84104715","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.0.0-alpha.1.tgz","fileCount":13,"unpackedSize":50906,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa1l7yCRA9TVsSAnZWagAA/z8P/2z+VU6zxAVfq/HXGE9i\nC/n81jsesti1RV0yybxc+HEZgpRX1aGOaeIFayJu8doWxnYO83kAVy8SlTAJ\ng35GkIS8Khj6NPAPe7BP29cctJyoG6BSYO8pKsFii25U99CS1/W+a8KRgR2U\ngfh2SF6ja3FfIA6DZgy+kw5N1EBKMBhRkLb/1oKs84f9GrjPjmKZ5qhrmQfw\nuO6jLROLl94vmJyYEnUYEXVGA2f/FNMloebMJNR9UcCHFsVg5WB9mxhOjqIc\nYRwV95DmvqL/eN0uHas5uxI7vc9fp7Vw4yxm6hfH9viBa7bNKAlzwA3myxTw\np+is995tF2dDpO9t6Gy+pYUDtwg6ZMRM5Qgb7AK8W8hmi610jk9CAl857cF8\nrygl3XHB3Do6x6NbLmWr8SzoeJGJ+VQuKlFRa4ZFkbTVKF/rHTNTbmBJZVMj\nqPND7L6VJttnhtIu2okLpfc15qENFjKnFlh/nzo/8LCFsdqw0zM7DSC1cjwR\nmSeXzDtkqRi6wtbil6MwteagXrJs6ynn79pH6k59vvuNjoz0cwuaaIzA1R0+\nFyDmWAWlXZCHmw7wQs8k5WowpploL4XZMw2ZdPSWlXiEDaS+4ZiWsV0gO39/\nKHEYO4yh3JlJJ+e1l9tI4C2HOwQSr2Q/2cBViCjBG/f+fa3kdnzeFbKEgtRJ\nNWkL\r\n=GCu/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICepFnziB6WP2YJzw4Hy+g3gGyHUNRfMHspJ6b6bxxV+AiEA9mY09huvp7mRf59jFbXiX+EXQUkeFIX8fLqXtaV06HM="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.0.0-alpha.1_1523998449320_0.6778201097447267"},"_hasShrinkwrap":false},"1.0.0":{"name":"wingbot-facebook","version":"1.0.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.224.1","chai":"^4.1.2","eslint":"^4.19.1","eslint-config-airbnb":"^16.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.10.0","eslint-plugin-jsdoc":"^3.6.2","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-mocha":"^5.0.0","eslint-plugin-react":"^7.7.0","jsdoc-to-markdown":"^4.0.1","mocha":"^5.0.5","nyc":"^11.6.0","sinon":"^4.5.0","wingbot":"^1.0.0"},"dependencies":{"fast-deep-equal":"^1.1.0","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"b7a41aed4b746a468ac12be335666cdf0ffea88d","_id":"wingbot-facebook@1.0.0","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-WiPjorShuwPpn/p7r5Mi4jMvC/wn54oRUFx+J+8EWq2H1lvB3nj02CJ//Y9KEKI9i+2Kaia5C/Bmegy2oZl1nA==","shasum":"03dfb3f51966f86dfb939c2de89853cad0a35cec","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.0.0.tgz","fileCount":13,"unpackedSize":55114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbB9osCRA9TVsSAnZWagAA06YP/2nygGIXte5812qx9bQv\nIK8WqtLi4t5zLxXyKVvcQCBwe3HX9GJ77lJSJEH5CSdjrU1pK2XR6B0P1xWy\nPmrL76N8E7knLDyY5u8X1GLhlIbJhQH6AGM2ep/1uWTcAZqmwexuePWv2moP\n1KM7hTxc3BOg4wU0v9sRRNo/EtO9KEkrm5PH5F7qvxMiHvT7rCSR6E0mUqkV\nlA2h6JB7cuxK16slzhKS6wmcSmmX51kz0G2ubxOd1PYDVaGi40h6HE4wBKf8\nM8ArFR3D0AwfncqefcROAc27GE60bU8xtdlyvXz7XbdA6AHFboUPQPiZeBXk\n7K23cYvOl17bUMRTF3m1E5b0X9yrMieTq2plqFxdkfwsw10h95mMmgNlY1xA\n2Ip7gD4ZEfsgAJiqus81aDL+svuW3QZN1P97ZDcs2/EzKdYYhUHiA/CL3MVK\nXurAMfo8nOe/vZoTzuWn85MnlxFj8jolv5jWCuXbm5ugOSL+PlBRhd+WgDOw\nGuB446SAkfMP3Tvz5jXp4gZn2RL+bBJJ/ER9pQQMHVVUcfCX4O7CZHPkFHKy\nOLcyY71+wlMKJN21gD7uDgBn3+v2z1VlsIrFbdthazt6wey4p+ixpiH6HShX\nCYnV8MquzDnhK77cxhgQvZ7+tNZpHGTdcdcZxZ7lK8m7Qs2cwL/cNoOp74lN\nWI2L\r\n=ffVr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFDuz6ttpbNFRoP96NtGo2zIV+giFLeZb1cZu/euGuCLAiEArUopYMsIYnZtImsI4AKbznWvjop1TV7vkc921Q/6W+s="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.0.0_1527241259300_0.04957882821012416"},"_hasShrinkwrap":false},"1.0.1":{"name":"wingbot-facebook","version":"1.0.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.224.1","chai":"^4.1.2","eslint":"^4.19.1","eslint-config-airbnb":"^16.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.10.0","eslint-plugin-jsdoc":"^3.6.2","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-mocha":"^5.0.0","eslint-plugin-react":"^7.7.0","jsdoc-to-markdown":"^4.0.1","mocha":"^5.0.5","nyc":"^11.6.0","sinon":"^4.5.0","wingbot":"^1.0.0"},"dependencies":{"fast-deep-equal":"^1.1.0","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"b7a41aed4b746a468ac12be335666cdf0ffea88d","_id":"wingbot-facebook@1.0.1","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-85nTKpMJG2yqRgiJ4NbzJvKdlUV2iAjA1A+jLF/x/nU7Et5WiEaaqqT7VgGyFXt8FakZZCT2age4lOECrAoo0Q==","shasum":"b3c935d19b4ef9b02827207d3d3d77fb66ff68ad","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.0.1.tgz","fileCount":13,"unpackedSize":55167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbCrgPCRA9TVsSAnZWagAA2FYP/311x5F5ukK4JP1SEhaP\njL6X3qkflz1TwYlVwv30Io8uJwIjNimKtzzivTTi2dnNqcSnHdbnj6IlN4CV\nvS5eCxSbR7k8IRc5TSxVtDclRIAoksVgkxBNdWlcuXaYiq6wLF33NWnl+mlb\n/fvEImstXqm0TaZwxMLi0pGEpqpXDATua4morlxV23zdVbto+7loDj2dqYZN\nDajLcJxwDmwf1Zr/W1oZTL6ss+zpK6BA7yxcgtxNkgszm6phX3BgT+0c6lt/\nUgn0ifyU1gYJhhj7HpTVziXg+7BujNd4CamfDIDa6QfVnzQ6//xia1P36l5E\nWHQQ58+6RjdpION0FWnGZwJWhOMCgZMOrrvCgn5o2JuNC68liesbBJqI/LHH\ntZLZM3Upb26QLui+VPZU37gARLkEV7V45wZZQvul7FpOLxYdopbHFIB7UBWq\noeCJ8ytJ++jzGyUNBKgERvsfQWlViHvVBJFCoGAtqlttuIIsSCOj3u7Zw+9P\n0Rr7EA1nKXAu5Jtvn7hfjI8U7JsXls6bCZ8P7nFfQwbI43j6KKqRVrpVdUpq\neaGBKx0qcoJWN3YTPE0t1x7aSQirO9NlK3jER7kj0IhAD2Len7q7P+O84GWa\nMneyRDpqQlk0NohQVIsnw2sWZlPjLo56mciMzBrtS86GQHGqd3CRWGa/q66W\nbREk\r\n=WkFj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCyWqGZZh/E081/T0EpQc9YuLZa2IwL09HVruX39MbRVgIgFhepvGYYGoWzzilXKO6jtpVKPn7cK8iQyZCWt4uAxr0="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.0.1_1527429133887_0.9833851533626716"},"_hasShrinkwrap":false},"1.1.0-alpha.1":{"name":"wingbot-facebook","version":"1.1.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.224.1","chai":"^4.1.2","eslint":"^4.19.1","eslint-config-airbnb":"^16.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.10.0","eslint-plugin-jsdoc":"^3.6.2","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-mocha":"^5.0.0","eslint-plugin-react":"^7.7.0","jsdoc-to-markdown":"^4.0.1","mocha":"^5.0.5","nyc":"^11.6.0","sinon":"^4.5.0","wingbot":"^1.0.0"},"dependencies":{"fast-deep-equal":"^1.1.0","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"b13429f5e989781240de60c726745eee84e5d97b","_id":"wingbot-facebook@1.1.0-alpha.1","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-R9iIDjg2DFAQ732FqxSzI2IwqqougkJW1ofZfP2ufsdcxjLPEIO9O76D5Hs3TPyVPbEMvxpN77B6kxzMAWLgaQ==","shasum":"5a127074253e019f84da8508a334bbdc7d46e353","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.1.0-alpha.1.tgz","fileCount":13,"unpackedSize":55418,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbH4Y3CRA9TVsSAnZWagAAK6sP/2dieU8lhz4e0F4emZWL\ngHBofK5zOEWuZe71Tuq0VfK78VQ4WnVWm1n/F6h6Q0YhA2nZreRxB/BvZmR3\nE4C+alMct0oj5Sn3rXRvy+Ak532m5j2PjEZ6SAAuEzLUdLlEcIRzf+JAuuFW\nl7b6jRgTNoSofUeyjT1IadknGM8BV4SpzzABVcEYY5GOOAz+ebN2pJtuDlwM\n8qbFv6sOCQxMwsLditnh7dVrGFH7SB3nUUSPDjPwyog+AOoX0bWm0IOHQrv1\nyPMOyv8V0Zdy1cLo6AkkZY9VuhawXeJSLe2YjDloQE4jnLIDzk/csmHqnKC3\nTSFb8vPlX+v6xMI5el9if5YTW5LMldSkoMdNO0phneyT/kW9ZwuYb5A3He/u\n/ZJbwJR7o02C6MPA9kZdh8URMqnsDgf5lcjM9wis/zsSKNlt5msyxKUP1A3x\nwSPpihJC6HH6MRPhFFBH0hA0Lu5Vj8M8QzFgSX1kuK2tjgoGbCeKACb0WVrE\nIyhZztKqhJqjIEMAzK2jmgDBoTHZxhp0D4aW7CqLfKzQiedazyFl0rMXm9X/\nsGBVqxmIA8efRTqnXOGzI2grEwl0YCl52qkFyNG7FSCahLcr5/IMRZbgbXHe\n2g9zIB9BiVUbxKV01O027BiZWDkBmKaYCiDwePXetFXn/E5GaEjM1P1P6yRg\nc7Bx\r\n=dzkj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGiDZ+0bwo1k15Zb6CaePlb03sXiCqa1FU+MrD+7kN9sAiEA3zx9Zyhq3vFbU3Em9SaC31GYbnlfq/nylAA0u6A+SoE="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.1.0-alpha.1_1528792630308_0.24553956768104768"},"_hasShrinkwrap":false},"1.1.0":{"name":"wingbot-facebook","version":"1.1.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.224.1","chai":"^4.1.2","eslint":"^4.19.1","eslint-config-airbnb":"^16.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.10.0","eslint-plugin-jsdoc":"^3.6.2","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-mocha":"^5.0.0","eslint-plugin-react":"^7.7.0","jsdoc-to-markdown":"^4.0.1","mocha":"^5.0.5","nyc":"^11.6.0","sinon":"^4.5.0","wingbot":"^1.0.0"},"dependencies":{"fast-deep-equal":"^1.1.0","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"b13429f5e989781240de60c726745eee84e5d97b","_id":"wingbot-facebook@1.1.0","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-XqJSYDLBTjQrVYQAPaeFe4Ixp97CzsmaVdAtLx9ms/2dYlLBkxRjJM1ZrUUCwTxqdPRy2jDQ7dsVKOpxu2rVYg==","shasum":"38211c12ee790a1df9cd69f1087965869534600e","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.1.0.tgz","fileCount":13,"unpackedSize":55410,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIMduCRA9TVsSAnZWagAAhY0QAJjaCoTHK04ufuhDNH3z\n4n25oD0b2raZg4zD3Q2Y5VdbG0CLqfWBSuoui4NcOaDxTBrgocaUEXOVj+Dz\nVV5vqJbVuWU4Lv2u8/negQUp1xDlh5BXjwDtCn4OWYwNurRQBF7eVUJ/Vojl\n19XI3ZQ9eB3ZDyxAA6wsLgqk0bgUdelM8P79+ST/QwfiBDsmrVPqCL2kvu5K\n3gkh488eec2m+6qbLMz9HK7iuhQOCnlecxuEC+I7TYMiO5WdJaRAPvsq0GbG\nNP7IG0RicgCM29o6rzGcYZSNhp1ezr54AyfFXoENH3yZaTFcDZStrP4d4JFP\nbgJfpQGz0xg2F7aWLbS93I0NYBN5vVl0nKSbL8NSlR/+ZLCmynDwCDmLmhql\n/E9wwMZlzw1PmnfYoUZmgXghEVlfsSShjgr8zGQR99vco3KFmC0kLciZ+BGC\n010shStjbGssnZ0lvNjf80Tq5ZtS1B6ZghGnjFhyn6KZ3uCMvxwGD2ab+mNs\nLKGOMlJEfBsKI/QRliHcU7MXwOx3epPO2U1ltNEf01Rld1amDtOqOM3bGTLs\nhUvC0Z7LeyQQ6G8YubGxa50ORORC8b7xNrm01VdhBsYDCo2VBT6YRS2vvSop\no6Fh7ZoKPdVJP5xfK8QyhkJGro/v5T4u6CrEDe8837mNi7YkNhK9H61gKlZJ\nAuoA\r\n=GxA7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID2DUwiXyjtTx4NvCDj5kCVAcDlaYVaNaqUQ6thbn0c+AiEAmKrCfkL8jFMi9vPzIRlw7KSFdjBdC52Y9S/8tjwLVms="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.1.0_1528874862032_0.5537870524210222"},"_hasShrinkwrap":false},"1.2.0-alpha.1":{"name":"wingbot-facebook","version":"1.2.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.224.1","chai":"^4.1.2","eslint":"^4.19.1","eslint-config-airbnb":"^16.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.10.0","eslint-plugin-jsdoc":"^3.6.2","eslint-plugin-jsx-a11y":"^6.0.3","eslint-plugin-mocha":"^5.0.0","eslint-plugin-react":"^7.7.0","jsdoc-to-markdown":"^4.0.1","mocha":"^5.0.5","nyc":"^11.6.0","sinon":"^4.5.0","wingbot":"^1.0.0"},"dependencies":{"fast-deep-equal":"^1.1.0","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"c34c2ddebb7e3528bbd632ad250a34537184e58b","_id":"wingbot-facebook@1.2.0-alpha.1","_npmVersion":"6.3.0","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-rHzfX54Fs1hoRvC6hcjWdEpFSp/TLGXmjmnR2qpbmT2p6vFk9udzeBj2Nx0ZvB5rbac9gla8Lml3eNjiHoXlkw==","shasum":"83f1e2b485dcb0e34fca4ae308b0da0e0493779c","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.2.0-alpha.1.tgz","fileCount":13,"unpackedSize":57625,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbatPnCRA9TVsSAnZWagAA794P/iFZ4kCwkguX4q/nrm2/\nwYSxMR1aYe4d8U7lQVOJFzqIfXAeSVejO5FIHcwlViBizhyWvrcw02LyHIvG\nYLAUo2DXKsMb4XzNdx2o3BuHQJvf7hipLiYgn0XIVx0JxHnthg0gzWeh3YX3\nRi/PfD0v6AGrgCXnIFh5D48MUTGCXS0XjyoJ4oefnijfEBueWJwrmKJ73APx\nbF7gsLtyuS9tiMi/c4Ma1VqT2nLx9pqtS10HxSE7/zC+OQAjLK+s0C15JNHp\n+F+lDY2LCnBfYxboEoEY2tqu8WYySH1YfP2xHkchLiNhl8aqbARwqIyReHxo\nDIuh6TSuOhhtHUzVmksvi9TjD9jdVGlpMSdsI52cepXV8Z4Y1sTOPrgqMQrI\ndcxfdgl0Ig0MJ82TjxYlxcfBRuzgRKQL7gHsfRVSvRY3QYZmopT0mwn/ja0Z\niFHH1gw1Iyt5Ds8ylqOMF6gEL/wsAdmvQYRtfA2TKtKhUN3zjdfsCVwqveXc\nvq2bqekHVVUFPjBGCYxscbCdifXHOnI5HV9jxv2RkdzJy8u8bkHAFhQLL9m3\nEXXHwyD+1XOU04EodWihkXgXCrXCK1UGEx7MphEVhKKLVcY3ojNlQJT3abMA\n7uT73j7zws2Um0WCJKIUjIrN1c1ZOPmt2LMVrwxXuk2bTaoP9sJ5DE4i3lRa\nX7XJ\r\n=pLg/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEQe+s8B1iZpSc6iSt469n4wwA9B34GFVX0BXa7TdMQSAiA8Nm5sO4cr7EvM2FW9XNiJYOrCoaIb7uLJly2thAhylg=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.2.0-alpha.1_1533727719483_0.7776756065029289"},"_hasShrinkwrap":false},"1.2.0":{"name":"wingbot-facebook","version":"1.2.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^1.3.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"a8bb249ade6bc7263f74a4341eecdfc43b2fb66f","_id":"wingbot-facebook@1.2.0","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-48z0D/+ZpVkdhmVvttoWDE7lyVu/IUZWuFB9LK9iIstQSoeUT9WrJULp4Wu8Tez2w5Te4Eoo12LBu18m9X8Lgg==","shasum":"76a63dac9c3debd1db3e8c69e00f99ad40eb3f3f","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-1.2.0.tgz","fileCount":13,"unpackedSize":64231,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvOXyCRA9TVsSAnZWagAAUmEP/jhXdq/jornC+QRi/02W\nUCQtbKaSptyaqQcEfzQ4q5ALc2+RSkrAb/5iF/XKIcNODqt2fqXT7KBYOWIy\n5dX9r7f2ICGSeFWWaKaT5KqoWui01wi6M99jjlwK3ubaCgkyGBIe7Ob8nT/U\nGX3IJIa3wx+5DFMfOtbXvrRuWg5sgIdh9RILNglpiK/gREuJS9lvFPYo5u97\n7sxb4h8F9w+fjNFQ+zWHNjI7BOlHe8O3IMqLokC1uZejppP+Lr2l1HAZ9Wz8\nUT8UJNTh9Z2yKak5rlnVpHE6OvDL4PH6WkmNyTbQi6obJNOe3ENkD+Dm/s4F\n6r+9jP+PMI6hdrHioscnGYK1dEMJU2DzdH2ROA2dRWx9jYy9ppSb63mHD0ut\n5qzbPRx2+8TjsL/OZG6dLpQORpuYLZiT5NKgSdwp7iOB2Sps2sKpbXj6xD/i\nzClSG9qzRhS+22u9mlBowq/pkreUM8H1Xpr0MNSWBhmWClRnJHs6ec6tXBCI\ncx8p13oDFbDdq8rwzi+uoEbek2t+JvMMMXqhgY2ejke8siCsadXH1ebpmnyb\nuBouvjBsAXp2peMsuz3RSmgxeQTBhsDk6IeDAvaKCXJnBofyFTCMxoDG+mWe\nB0jKeNGS95Xb8U34kQAj0MA7bQIC8VM3w6bF0njtZTrx0WoldmXREkdYvE/H\nc6LP\r\n=3TCs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHenJnfkJoGvMY0uplOPfGuZU/LlrWiP4D/pm1JESoYZAiEAotGqq8B/I/s8GabWA/YC3USxJBYamchOXTPys2mgCAg="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_1.2.0_1539106290214_0.25561826600781834"},"_hasShrinkwrap":false},"2.0.0-alpha.1":{"name":"wingbot-facebook","version":"2.0.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^1.3.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^1.0.0"},"gitHead":"8b0d3a024c4e3bc2a1347201c9a4bcdb95c276ed","_id":"wingbot-facebook@2.0.0-alpha.1","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-58Uio+JsiGnDmym0OgxPexcBGbFuD07Xp2lk5Hm3NcQJyRJe4XELbbXNQxbvtbLhvJ7vG3Fkrnp1WcR7Ala1pw==","shasum":"d897e5ad947620da05da8e7bc0854d676c392abd","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.0.0-alpha.1.tgz","fileCount":13,"unpackedSize":64262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb3Ld6CRA9TVsSAnZWagAA4vEP/RNBVK0SGV4pkUGmSuKH\nP3X6vLVRSeLL0ulQecYwzRgKfNSnYJitmhgSBZSh+evf1zlXR/eTl5xKdaVB\nc1KxMYKoCSXuHHsodI8oGNcgLxInsLmN/uussZC673PaZ2lTYK1Tpuq2p4+Q\nRxIfOgW0h+AARQDirfzUdPXO4TVInKwwnC8LcJbf8e8vhgc5rgfVNfYdf3aj\n0qmlTP0yvK534f/ugg3PeiyUT/U/Yz8vlanGT9n0WSXOP5C9ua3x0GBimFW0\nvjw+fo1VUkc9shB/JwYsnOl33/Kzdk5U+iLvuz+b49cYlDxd/62r9jwwf70U\n+UYN6ldg44MJC5YyrNAVza+UE4TQTLqTkPBPJho/BXAL6+NAgP6T2MJyIT+f\nozzRRPvnDBLCe2s4A6G5PXyvlj6Yhr7NAMv3crWEm+ffubbtk9h0OtqVeZ6m\n5VNOaMx+8KL5p+5QmY/cMYW7yW64JC1L+WcT1w/4e7cywO9JmT2Wbqlmj176\nO8jcZUKbNrdCWa37BfWEB023nPIwI2QRaX/QBhM6h6mLDBHEUVazZjvwjxqK\nGVH1SnnsAkBTeteidQ4nUF4HAc9BEIkWr/7VKB+HNize3M9Q5NvH2L9P/1WE\ntVfhSqSZQ0bVsg+P+E7WJEe2hr+816CbW/r3iLPKt8dQgtSj8zf4nKpB79iv\ntKhH\r\n=M3Hy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCc3LOGzWPIkQKPGdKDJi7Q60S6CQJwEmWmhBMm2ouOeQIhAPQ9sFYWaHHZlM717xzAqZSOzSBUmZuCefnQTD+enkEN"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.0.0-alpha.1_1541191545576_0.6694693333751685"},"_hasShrinkwrap":false},"2.0.0":{"name":"wingbot-facebook","version":"2.0.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^1.3.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"d99c467e19d5a61b223926d17c6eb2f5f91b6c64","_id":"wingbot-facebook@2.0.0","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-KuXumKnJqMTCUonfVG9drtXbw/jv4tnN7apzDEhOpE7HmgN0ynj1j2Qn+EjIXNm1qlhD7z46gl9I/DnZQ/Hqpg==","shasum":"6e231c369205ff76e2a27c459c7c4c9e9013dd79","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.0.0.tgz","fileCount":13,"unpackedSize":64332,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb6YqqCRA9TVsSAnZWagAA7kkP/0dMDO3xYbn7XqV5i9hu\nB2FYh6/k/ogdE0Q1uK/unvVdkbkpbM58MFaV3kx5sIGBjnNeFgL5EKX5Sh4/\nxAQQ/LKHIFBx7nO0tUjIlpHbzBNsHirtMO08llDN3UTJfC5gpWI+S62yvM2k\nVgQge5pNZVTz05lqfjB4Cnx+zUm/SQPtoFSEjaWoxOVNl4jEOt/WaDDm3D3K\nE96jrtpkonCCAS+6+pczHMEgbJptjQBCKq0xzjxRMSDDa/A4xIS4Q60IKdX1\n3bsJWBjhSHJq2rqDolkVfhOgZvzKqTUVB+mdgm9ZjhrYQIE2/BhZPs6/QYcv\n14bF70qPkmGMd9zANenUurRfdnJLXFQC2bFCDFWSbY4OQo43eRYzFhFrEoMh\nAcQYWg/cHpjo5cDkpHtF/jFszJC9iJEaOQKUWvvx4IRp8bDsv68RhFxMDNtY\nOTDZoaVgPf4CKU2xmfg0rQR7o3Kw3IvChaM/+Jzeg9hA6FPz+7UuDvNlniZt\nju/gbjXVMdnhMWdKlFMtlIBcntDiIHaSCXBoaRQHW+lOEzeiwD1sdx7x7iHM\nNn6l+1b/t91r7onsiXXc0sxHGopY+VfGAKnIUo21X/5Q8MvvcP3YNRn11IRL\n/s2qHFoDuYxoSr9EpuhYfioxfLW+PKnlkAsJvoe+73f6Z7ut3LBUNhTLsd88\nPqOV\r\n=LZEg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBocO6UE7joDJb1SzSM/ngXn4AzzxPTzFJgmPKULZdTxAiAbBpKhM1u5LfZCsywwg0fqML5m4Q48mRDRXuzsLSSpIw=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.0.0_1542032041536_0.24531046290356073"},"_hasShrinkwrap":false},"2.1.0":{"name":"wingbot-facebook","version":"2.1.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.0.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"054b2d20dc5a28b04431240b011bed18291cf289","_id":"wingbot-facebook@2.1.0","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-i3UG/tH2KyAwU3hlUthpf/LXoX72qAfaDv4xN8/VvxUpQltKZ/ev+B3FKoCsAC/G+Wj8xxrdQxSSoVojdYbxoQ==","shasum":"069d16435792024447502e2d617865357b1f49e5","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.1.0.tgz","fileCount":13,"unpackedSize":69333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb6uPbCRA9TVsSAnZWagAAOIoP/RYUflxU74ACnFbdhOMI\n5FZHq9veMZcsrN590C1AA1HdigZdurotWkS4sRdDp09IgvQtDft5EeLiUscs\nx8wA+nXbqjE/AD1Jv2dwxFKmSFNq+5KtV359xOvIauUwTJUMvagRsZg/pwwG\nVEnESjhTu+1vdltNQ97Gibm6W53n0okOczP6bdNENOE5j7LTrdZhpU6TID37\npUZxCOVBtIAahJzF+aA2cc7Qt75NOABKB53Z6D1u65fqR6XW3lwRvvCPa/GS\nVaOjAVaBp7OgPlqJ8dpu4X45KHtkWgxdpnPV77T9GTYRi4bMUl9u3Ijj1gBl\ncIYbpRTT6UnqVfOoJbJGo4AMTZj+PI0PYr58wVJgRuuR40tUFCi45HyjQPBL\ne6QJGP4rLEgyO9WC9kxGroVD1A64mfo1fa6pnJyEB0GvgaqYpDhGjXXSWr5v\nDmmQKm4xmWDtIEfGvnCczo9gh9RCT4GncWfVosxAvg7N+qNA7hLIeivwtAoe\nTij8+oB2MrAuM1kcZy8xP/VwYqPYKStLLMHU01UVsg9o4G+GlRp9xqkKhlx7\nqdhdNgoxdcHG5T29rUSJHD14nTPxXhOSMfAomHyRZ/agwaWjwxthFUVls5tW\nEwdFa0Rx7gJz9wYwAsqMnVF5bbr1Hb/a7JTuRSNTUp1iCTBtfAKtMSdffBqK\nyoBV\r\n=KGTS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHxO+TSEmNjJ6o4htU+WKBO3D900CqPzDqqDNU8Cgkd7AiAeXJQ5uzL5bxnwZWNQGlWYZNS4Kxqd1fRu9XD3ETtM6g=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.1.0_1542120410997_0.6545523227724055"},"_hasShrinkwrap":false},"2.1.1":{"name":"wingbot-facebook","version":"2.1.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.0.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"967d46bb0aa1ee48c539ce1e0e11bce0db1152f6","_id":"wingbot-facebook@2.1.1","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-Et6PIgJ5ctid6oqtAT//XbXe+vBz4PqOWNjhHnr39VJMQqZZY9PE1AgCJHRYzVHyGT7vvmR0CQhPoGm8j4Anyg==","shasum":"27da9711a38d0fba8d099784e1deeaf0ecb2824b","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.1.1.tgz","fileCount":13,"unpackedSize":69352,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcMxo3CRA9TVsSAnZWagAAUSoQAJ2heXpEawY1d3hYMHet\nYdviODStyk1vRMQ9S226O4EyZzOAXQsUjzQvop7Yfa1J49NELfyyU90XMnXg\n7RQizvpbu/zgV4slxBVYmqyZzcpQfhYxNbXqxMfVFDN2RHkQd12pLH7//BpM\nbrUfvpYRmEvsxCmupb0UR55WQpmHmQibGbg9y9ixrbsoKbVUYkCPj2zH9/ui\nhCqW7DL/slQYAf8ncgIFYqSjNj4ESJeXTiTAxii8VJr/27wvs24TDujRMGeC\nTErN7KbLgQJQOMgtVgpWS8rWbpYiO0h/2Ds+VY1SBumNxcLXABJ0Z/50l3QX\nZKIyKMWP/Ddo6j+2WQIkdd9aBx3OoUIrylE+eg4Sn1hi6H/LnmLtG4mrdQKr\nNLOWpvI9jb+QI+KXaCoqmjBqdMfLjyL2e8fhOxH1dFQ3r7IHoPJ3sRk2sf88\n5kkDdMOgcw0/0xPFPnAeszDssoKsZ0mX1amD45i1dr7WnYDV8277Moy5E/SV\nz6wKiKR3+BDy3Om4vCrLVWrxzL7CcQ5IX+Pttl6bfYzbquqlfQ0yDy42cgaU\nzYA/YpAeLS5l3OjJXAbZHAtfn6pKYfWnAgaDhliF3IDx/S79WnKaSUo/2RIn\nShvzmcYdziS3iuu2GtDOwLnSlcZJ5Q5b8los0Vc2oc4uvn84gII5ZKf2SVYt\n8WRT\r\n=0oDu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7pDoxkqADyCDavQab+mY2ZxXkNQr8wYD9XtVfgt+WVAIhAOWPvQFv7PrYM5P/IKLEgAPSaipdgpOq2j+Wq3/bxSmE"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.1.1_1546852918386_0.3878726246853257"},"_hasShrinkwrap":false},"2.1.2":{"name":"wingbot-facebook","version":"2.1.2","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.0.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"a2e9f3f6cb0c8bbc9ef9d336f3f892f2c0947434","_id":"wingbot-facebook@2.1.2","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-IwftGHPj+S+56kyFbcKhLbZlgdXI/NAwtpFGgUM1mcVMSqrHbo69+sckUuCyUTwNpRtX4qiG1Hel2obEMxq2ig==","shasum":"79f89374b302e3be637f8e0af94d69f3bcc7321a","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.1.2.tgz","fileCount":13,"unpackedSize":69994,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRhElCRA9TVsSAnZWagAALkEP/RLemw1pJ14aI+uoPcWx\n4Gd4tIrHQ4ztc0EZkC/Gk6LvgRuOsyHc++xGImZlsuljrVjrCVrtKKV7H/Iy\nxqgCQmfG0YLPqkSKlZc9tTuWzNF4LOB3iWlmrT87tNtHnrjUi3XYfyF7Bhnp\nN6dbW8OXoP5wV3Ml9zVwUItrkzz7gZLs8QOFzZluTaoDE408DqNGdl5qutBC\nfV0MKfpOr4/XY+J7HxTSArInCxa8HiEoVEgdwQQ9d8GWZ5S/JBJvGU4Yb4O+\nh8UWCvPit51MFULdxFSKdILfdirc/JNfzMAhtVUrE2wPjAIPbSvtAAIikFWq\nsRl2GwO+Cne9n7dh90i9bgRAVedb+KKW62R9oZ09FKN2buHKHR2KGLwlM8z1\n9oPFYlNjfY+o03uFSzdD+dBZcnYN6hGoIVjvC6OgwXwwfryZ9Oi4V/T0ltDB\nev83x+QZnCWHCiS+6oziEVTjmaMz+FcwmQSH/z+zx8EsNlIPk68biiI09tWL\ngqSBnE+Q+t4IZd3imoM4PDB3za6oLh07WmzVtqRX9a2dF3FuE+DYrdSpqLt8\nl8luFqBXJ0IoNqM3ie27Gaq0JIXdr7u+h7oLsOgm+3762El5UlNZtmN7VJL+\ny9aXU7biy/gyEIx5AElv1tt6fvbToQveBxt6dMFLvNkjP7Xe5e3X7P7tulM7\n8tFM\r\n=Up6V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgbVTJv+a/0HTap+giWGu+zj7IqgeS4fmskZ2LAHFeTQIhANO4wPX5elKi/8gLdyRjub53MXS66cyHYg4fECyKztS6"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.1.2_1548095780430_0.8548947066545571"},"_hasShrinkwrap":false},"2.1.3":{"name":"wingbot-facebook","version":"2.1.3","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.0.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"98785a727842973db5c0c1d19a2b159bf13efeea","_id":"wingbot-facebook@2.1.3","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-rzrhAZCiklbRoNJ5wrQUqB4uZe5yHzUXP3ePSC2Uo99wG2V14i3AtefvPzvZevZECPqC1o/GuHlfh3B2doWaYg==","shasum":"f4a8493f151da1b0ad0c7d5d773cfbf440ffc566","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.1.3.tgz","fileCount":13,"unpackedSize":70004,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRhJZCRA9TVsSAnZWagAAMA0P/jS0M8NslRELDB97ljB+\nobiOUJlfOyDjpzXKkWzu2sNG05y8pDFcpCcntunBi0hqXWjiwdlPMqDJ3xoE\nghVhECMgDO1HGeg/EQtnYLXfmxkWHMOcWTdDHh1boifB9LeESBrWGbV9mGDE\n5pnTCA5BpK29gwsvHLjt0sIscqH3MTJMQpRcB3MKwNEPEj26+MSdh8m3/ccU\nX9okm6qPD7axuEW4/KH3r+Neaxp1S3j59FZuzve1PaahdkXpXoiw1pOg5o3a\nxpZ6XHwo2XXm7vkllmE2IzGNKmVWG2ADUHXAZ0kUjUWLKg5fOWL90g2epPQT\n5WQw62CuOJN4SBVbQlGxHSvbXq/KgFxaIFBF5slIcAPjAYs4a+3iGriEaoKS\n3z60VdA96zRrP6MF60LSMsEVwqLNucUkexHuFCGZsOajQchpzBRLwTLthAOy\ntqlWPNCX66MP9hkFhV1kxmPtqad4leaphMR00Y7eAUmdjRGUHUdyVcblhJF+\nAUhSkceynGxK7X3cSqeN08Rv+Pw56insvwCjzZrWAORLUkaLh/He/Q2N3QGs\nm1rp/YEf5o21kp3KtrJXgr3Y1FpA9YYR1SALPtuirRJQZQhnab714/bhMUqR\n+haUuB+iTO24B/Yh6Y9Z59aichsreu0nN0S9p/BTjNrMXpftciRv/RNUQ3Cn\nXqMd\r\n=/aEy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/Pn4FhJDtCHiwR45PGxttJWRvbdXXNrC9v1+o++BWNgIhAOI//9Xu5npogIBOWWQsEOPBye+Bx93f/hqbKoJCCqCE"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.1.3_1548096088957_0.5181652391757665"},"_hasShrinkwrap":false},"2.1.4":{"name":"wingbot-facebook","version":"2.1.4","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.0.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"98785a727842973db5c0c1d19a2b159bf13efeea","_id":"wingbot-facebook@2.1.4","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-L9VDZAiLjN4Jno9i5Nct+4U9C2XEH0mNZ95FWUAkuD498v7lxEFkiendwluZ2ENejoCu3jp+t/nGCNCmp0e+5g==","shasum":"6a3b26020a3dfdb632f90fc318d694e3789fc7fb","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.1.4.tgz","fileCount":13,"unpackedSize":70007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRhS4CRA9TVsSAnZWagAAdcwP/i+OGzSzTgEULrrnh6l9\naLERB0Z/tNzgfYrsqXeZzOsn11d775w6XY4LeLTAxajKlIeEI9C586FfPe8T\nXQq1qpsyvu4y3jEQKYZb0wAEgoV83MAzWqv4R4LVTevx6zNosDvVfJHr0PNU\nYqWsiS71pYCOKnEq2XVPF+sJDpxJ/4eV09hig6AZ10NFiasyC7UkP3rXdTaj\nzGbVUr+Hl7oJMIV0/H57+LM2kGzn0MRiVE4KTeKtIN2gc/Yt4AQnjVWY/EjX\nGyxHuClpIUYnwR3PYV9N1zyYBo9G/av2RG9C3jMqxZqDwGys6w/Gw44PTsFn\nkQheG+3nBTGuk8+jBpJDH7Cu3GK98NraJ3QZhuyDCTW41FN1iD8uOKPsss0J\nrOzqQgeNwcdtk5IZBecF3IlsQhCFKYfuSUB4Rof9XqJ2IYWyO9pC1/QF4jDX\nXri9FtEOQEJaNI1eLN1mDu+aSSnSlPmhje5wyYJ1YhXNyD149ApMOyxS3RaK\nf19u6J1g+ng5T25oZjU0h5oH7TsXcqoYmHBtOI9UIM4rnuYXsvYw6bNj1YD8\n+/671QZq1cktL9toV5AH8OGGMy4ntEenaLbvUYkq55pRkOSKW/upoz8xMsP6\niqyxw2A6/6s5vx1ycR2Ep4OIJNh709Q0UafCwNfpZ727JYkdJSYa3gxaS6sd\nfDRq\r\n=OzpR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBgAjsGf0rY/SOz5FVAg1iWM0Rn8uqGt5ou2Z0l94+zlAiEA/OCZgtzZEqsOhaOq7eTQ2zMAJYIoh0c6zjO+yAIbsQg="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.1.4_1548096696054_0.6111427676897552"},"_hasShrinkwrap":false},"2.1.5":{"name":"wingbot-facebook","version":"2.1.5","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.0.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.0.0"},"gitHead":"c60ecc3715056c6637b8f4fb8fd67f5e26b38b22","_id":"wingbot-facebook@2.1.5","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-TVtCjSWUB8L4ZaJuplKouCw4HxbKPYxuq3euLybgIHLjizB2/uRyrlOHUJp+q9HJfCnh5qVbr2hKkngR8dxE0A==","shasum":"d2c6deaa3fff0f903970caf2010c04fa32f29a29","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.1.5.tgz","fileCount":13,"unpackedSize":70138,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcRhVvCRA9TVsSAnZWagAAxdEP/3BXwYsolB2Uopm/BTSC\n21SaiDTDq33NCKzITEMmM4FL3A/GHkUy2k6MeBOfxlCovLtPN4rkFj0fotHk\n/kTxY6AYC06MxTWNuH2sQ3O1Aw+SLo3fQ/NvjtTUiEJc+9pB9CblyNVT8rev\n8NZmJfFOhg5MnC1cHLStuj6lfYjnaYJq9nvOHMVd9NnDH17hzEDIvwmhXSfy\nrqfIPK8MadsPEUCURU9nH9EfwgexATxaLi8TJzjn8CEjSu1pcqHvYPMt05E4\nXna/dGoImItg6YYUApYaITwbyKTaldkZn9iFhOVM7bm+C0omYgLugnWQG8fR\n8QEwgf3ae8wJBl8VWyAdAPfWYlMU2upXm6WILWOdbWbull2p2hNOsiccMK7l\nrjZ7oRb52T3B4RgGhTWnmmSLpPrhyYv2jwenjJqcmZ4CMfsVWDR9mUhAVcjW\nZXBvFEsxlWWtcfjkjqEq4QAPgGvrOi4MKk44qR0tbhDfWfnfQtO2dC7F43ZW\nC0UOZWcLgsy5nWCYvEZW0yrjjUHDkOiHGtIPGtSJTgZmkUplSHoKdZjq3S+q\nZMLrtHuWVXAIAhQodPypyf5nm90JBsB0/UtIZUuJ/iFS3j64OzIIfJO2Yzif\nl1V3fGrAvOUSwUAkfUfufRUZyDoECnls4uRWqDxF3hcScpfowX9HtEFcEjzA\nf00/\r\n=rblY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqugYOnixiHedKD80pAYHoT2vBYkLrXobAd502daU3LgIhANPbH/87LpxU+jcJ3GrrJheUaWvo3Bge1DDa1U+Xe1P8"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.1.5_1548096879123_0.433228460258708"},"_hasShrinkwrap":false},"2.5.0-alpha.1":{"name":"wingbot-facebook","version":"2.5.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.5.0-alpha.14"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0-alpha.14"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken)</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class  \n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> | \n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> | \n| headers | <code>Object</code> | \n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class  \n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**  \n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> | \n\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n**Example**  \n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)  \n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class  \n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  | \n| [isTopLevel] | <code>boolean</code> | <code>true</code> | \n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n| action | <code>string</code> | \n| [data] | <code>Object</code> | \n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  | \n| url | <code>string</code> |  | \n| [hasExtension] | <code>boolean</code> | <code>false</code> | \n| [webviewHeight] | <code>string</code> | <code>null</code> | \n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken)\nUser loader middleware\n\n**Kind**: global function  \n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> | \n\n**Example**  \n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef  \n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> | \n| saveAttachmentId | <code>function</code> | \n\n","readmeFilename":"README.md","gitHead":"c60ecc3715056c6637b8f4fb8fd67f5e26b38b22","_id":"wingbot-facebook@2.5.0-alpha.1","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-SfAijgHFC1z2Gumaw1LN9x05SylQ5y/rc6X8xCodvIXXX26JhS85j9FC6PhwM12FHjwtvowE9Iv72WQKEO1wrQ==","shasum":"d45caad25542959d1644310c3037ccfb05cbf422","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.0-alpha.1.tgz","fileCount":13,"unpackedSize":69972,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcScHhCRA9TVsSAnZWagAAkrsP/i5nAybeZYDn/QaMixqF\ngV0xXZhu9tnZunWqnZpUlKQRuI//sq4ZxLkBW3dRatyqVlOxNInlqwQRoprm\n3k0MueUApY4TWuM6N5trSsoN+P1/YhsMKGaDFewqTVoYlYT4H/Whmnfhy/u+\nruPBttWRkjaxE7afwQ5sJYMHdJYB9WfuP6XGaFp3rngtHPhlyosDHuXUovAh\n4orrguz2S74GpC1He++CGXoh08PI2kRbzpaMCy8kBWgrHZITrszJKI6CYkQ2\nP4b3wvJG/7Bjze8sS7hbPI34feHHmKbIlU13x5S3JV1RZ3u3iMOr858ExNC0\nENLkwhlq7uRTjiC88nza3rf34JBdCyMY9sU+lxtsXQe+yTkrtlYimxfxegNt\nB52De9PIG2WopyRJgdCh+mi0/pzrGt/RSOz3QyghjSZL9YhEuHJu8eP/o277\nTqBL4MGnGwljodMG3xv7LRAhNedmQ0Rs7gD9HV0/g07YvDWD+MSayXVz/AnV\nTG6u3atZnloMpNZDNAn+aOjb0Btx/Nc0dAJpV9qFr0jRpZ39h365zLyaUqPa\nVsBdse2LkpeoHJ8ILNdjK+qOyUDH5gLRs3SP0xPgdC7RBDh1ic1d8CZvSUPo\n3JWHLcZpVxhrJQHqEbTLzV4vDXSEwp0YUIZzR+VGnWiem0x0TqD6gmMulnAk\nfJMk\r\n=Gvk1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFZj59G07RjhKMvUUxw9Rcbw9MTxAPu96YF450l5L9iKAiEAmKhnt5yV0JJ7GliVEstIIHfVhU1Kg4SFrLNvkyosleA="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.0-alpha.1_1548337633301_0.26914836473691706"},"_hasShrinkwrap":false},"2.5.0-alpha.2":{"name":"wingbot-facebook","version":"2.5.0-alpha.2","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.5.0-alpha.14"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0-alpha.14"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken)</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class  \n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> | \n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> | \n| headers | <code>Object</code> | \n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class  \n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**  \n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> | \n\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n**Example**  \n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)  \n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class  \n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  | \n| [isTopLevel] | <code>boolean</code> | <code>true</code> | \n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n| action | <code>string</code> | \n| [data] | <code>Object</code> | \n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  | \n| url | <code>string</code> |  | \n| [hasExtension] | <code>boolean</code> | <code>false</code> | \n| [webviewHeight] | <code>string</code> | <code>null</code> | \n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken)\nUser loader middleware\n\n**Kind**: global function  \n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> | \n\n**Example**  \n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef  \n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> | \n| saveAttachmentId | <code>function</code> | \n\n","readmeFilename":"README.md","gitHead":"c60ecc3715056c6637b8f4fb8fd67f5e26b38b22","_id":"wingbot-facebook@2.5.0-alpha.2","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-N7GpgWqf+8KglOQltNcNBck9xAc0+36vnuS5d0KGJJ+eXWaNLWdtyPxkXvYsGlEJbcpY9HWUqc5QjPRMgZkFag==","shasum":"449e963251bd734b0c5e607cd4497f6d9e7ebd1e","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.0-alpha.2.tgz","fileCount":13,"unpackedSize":70075,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcScgaCRA9TVsSAnZWagAAXPoP/Aq/xz0t4Cq/4EQZcoUy\nwDxRFmkCJh9hNKvimDrqVkwoE7yNaHtXtWuYFTn4UnggEwZQLNTA8yclve8Q\nA0OmaRtH3jVlgriMtJK0nZ5da18A7OQiEKzeyKWoy15cPkr/Y5YACTkmk8p0\nNemDw+thSLXdPmW4tCM4CS4CcIplzGvpkt5BYFEmQjRAK/Uq1S5Zbhun+BTj\ne/JCwqw2tnsz2UBoU7NPQ1z0nwbClxpbBHVJITl/ofkCs1rzX7f2b5hGEf3z\nBXrpGfOvihIVDqwFDbjAk3qidN3zVDvR9YNrEidpTkC9s68NqBWYHZ5k/vGS\nnK0zPq4eui1sYwGKux6WoSlyztJ5ooiu679WP74WobbkWpCGkvaGEbtJXWBs\n/wykyxcMuTnzlmhrfbvRMoOcZFWZ5etWfA/zvu6wkmOleR9Kf0150ELqHU/w\ntGFRGXHkdGwncFNqTpVeZlF7IBSxJqlG3/ZgKZJ9pPsJaJd8xZBlEyba1MLY\njwHxTtkJwnPAlgPyNq+hyaKhPSrq+VQK4eTbZ7ATEYsk43lxsPWwJVCbetY3\n5aO1CF28iKxitz1uUK0oerdAOkKnlTWg889v1iDxcLreO8pgcUfVG5n56GDo\nNK6ctkuMvRdp62CGIIidOOFWeUVD+/BVDLZduN7+qvxTXVVsIWH9m9D8mj4K\nepha\r\n=l8f6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkn8Q2axvYv/9OZldWMHs4NGcBVzi4yANQBC4hCK7s5gIhAIRMcKJGBi2sdLHvvWUvQJDeLF42IXZ1f00IyPJN0red"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.0-alpha.2_1548339225660_0.7289458141009277"},"_hasShrinkwrap":false},"2.5.0-alpha.3":{"name":"wingbot-facebook","version":"2.5.0-alpha.3","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.5.0-alpha.14"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0-alpha.14"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken)</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class  \n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> | \n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> | \n| headers | <code>Object</code> | \n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class  \n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**  \n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> | \n\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n**Example**  \n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)  \n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class  \n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  | \n| [isTopLevel] | <code>boolean</code> | <code>true</code> | \n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n| action | <code>string</code> | \n| [data] | <code>Object</code> | \n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  | \n| url | <code>string</code> |  | \n| [hasExtension] | <code>boolean</code> | <code>false</code> | \n| [webviewHeight] | <code>string</code> | <code>null</code> | \n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken)\nUser loader middleware\n\n**Kind**: global function  \n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> | \n\n**Example**  \n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef  \n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> | \n| saveAttachmentId | <code>function</code> | \n\n","readmeFilename":"README.md","gitHead":"c60ecc3715056c6637b8f4fb8fd67f5e26b38b22","_id":"wingbot-facebook@2.5.0-alpha.3","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-QMci+sY3+phjWp8QnSXDYozsqii3FtP0oqr19qgIxOKLMIp0hFjKE7ru9KFFGLRjyZc1V5zvNcmYABg5U+z1bQ==","shasum":"2afabf509a5a17cfe5e29549008532d3a1cba8c1","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.0-alpha.3.tgz","fileCount":13,"unpackedSize":70693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTxUQCRA9TVsSAnZWagAAxsYP/3zihplMQ5jQQjb7Yb5L\nxJXulyxBWVt/zdcU/ui+RJPXUWcHranMuC68NMCMEPoa2E60oiFFETkJxVo5\n27lhbEOfss50oEtbzUn3isZLRuao3a5fzl2zKny89/ibzgT3YNYs4qEH4Abp\nQKO7nX0j0/S4DQUJjuTArIwyBEQPqwQ8sQcqM85+vTDKq/L1/+iLRMayogbt\nArVVJgEZmpmMdJ/3zXWX3ysB1u7kaQQmxFPjmGs01ebspusZP7J9QwQHUobu\nJvGQi68tC14XgekSH2yaL3ZC8VyErBCEeXk9mvL2HPCrJxdOZhyPmBsRBghE\nmFPHG/gc1yWnqOEFYVBvgiYo5znDRrlyTOAQpo0E55N4yQqiy9S/kYqSYtEb\nG8HjIUfV7CI24wMdiGPqQkMhNF/6uRRx1DyVsKqDbDG4GIBWENchZ3ZVSr1D\nzOiL2WZBxJw5id1ettkujCSjQ6RmsS3R+nHQ5WGpDccI3ghOwrVhUlNLB7R+\nEo5gjibJE6SWjh06RD/tN0VdSouZuVAISRdOIlkRSI/R8CPR/xwb0Au8wWPE\njW7Ql0jYeZa/4tYYzH/y8qWgPGYbqUxwNX/p0DXfcCMncpJsaxOcBZezF7Vm\nOtDGQw/smjHhFrBco+q/qy6kM8IXQ9GykI/R97r9SlLZMh+m+M9C3Y2v0Uji\n9h2R\r\n=OcwK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNX8DD0Rvrx7x0p8ysipWFgpRIiopprl0a2ukz0L0ISwIhAM+H8uOZJwLRVrLuTvwI43BMXvLWhL0CKNYGdzzXAZmY"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.0-alpha.3_1548686607484_0.1896757535300384"},"_hasShrinkwrap":false},"2.5.0-alpha.4":{"name":"wingbot-facebook","version":"2.5.0-alpha.4","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.6.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.4.0","eslint-plugin-import":"^2.14.0","eslint-plugin-jsdoc":"^3.8.0","eslint-plugin-jsx-a11y":"^6.1.2","eslint-plugin-mocha":"^5.2.0","eslint-plugin-react":"^7.11.1","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.0.1","sinon":"^6.3.5","wingbot":"^2.5.0-alpha.14"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0-alpha.14"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken)</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class  \n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> | \n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> | \n| headers | <code>Object</code> | \n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class  \n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**  \n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> | \n\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n**Example**  \n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)  \n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class  \n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  | \n| [isTopLevel] | <code>boolean</code> | <code>true</code> | \n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n| action | <code>string</code> | \n| [data] | <code>Object</code> | \n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  | \n| url | <code>string</code> |  | \n| [hasExtension] | <code>boolean</code> | <code>false</code> | \n| [webviewHeight] | <code>string</code> | <code>null</code> | \n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken)\nUser loader middleware\n\n**Kind**: global function  \n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> | \n\n**Example**  \n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef  \n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> | \n| saveAttachmentId | <code>function</code> | \n\n","readmeFilename":"README.md","gitHead":"c60ecc3715056c6637b8f4fb8fd67f5e26b38b22","_id":"wingbot-facebook@2.5.0-alpha.4","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-ohYuh7btTLkbktx0Nc+PdUM0jTllP5xvxNatJW1RXjjgZMnNqlT1HwXi/PQOMG+n5qKvliWiOXsrvRo0XxxVsQ==","shasum":"9d3553147ef45b7880a6433c5c6caa5e5424a7b9","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.0-alpha.4.tgz","fileCount":13,"unpackedSize":70912,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTxYzCRA9TVsSAnZWagAAtz4P/3C74th1KLJzK4RrZ4Zj\n0r2HxgqfUyPwS86sk9ODikPMA4aOQsBs8cOFhQPi3NrDRcGq7iW0Nb9/0LMj\n4jRg7CFoOvvVfZypeXElxa+cpVcdsWlm9YgCOkGqT3tb+GAMo2OS1betht85\nOW+V0kQiS8Cmtw043V+DDiArtN43eqQ8ME11Mp0ZZl+j6+efanUOnsMKQrIr\nQLTU7c1Np6QswcGFoChNAF4Z1oG6c5Ufb6y/K/CVwcdPyB+OTQOCLBDpunsZ\neuD0H8qaoGpDhm9Ur+xZA7Sfg5JqRTup4rnCSB1sGgIKIMdQHcnOiWMi6FSI\nQk7GD0EJEH5JDX9UWItIo1hhKBsG5z4c8QMeqlmFP6gZyMRNv9GqtgaIa9sD\nn2tQkz4BTDSbQKKLll/vHBtvKiZQEEiuYarEVUEXvDO/n3k7prJlO7UizsiN\n+SbFgd+kWDx9fkYsPfOjeWkQfnmGbdwD8eJBNSC+jPk1Jk2lNwqpO+Ho9LWP\ntunnWWmCrEEMOisivdtwbDxsQjOneko44cwQ1fjelO5ZqnCZFD4B0bhr47YP\nt2KF/X/SsIjgTzCUQvEon57oWCeAsRlyC5DDu/J/IPlJ1iPD5yZr6fPMcxfV\n3dd4E4D5tZmwoCgij47jRPsEv/9C4QQOqntFezWywABuGAz+Rwfnm2ytcWfU\nODEb\r\n=27xL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFG9D1rH2m3cUwwHZN8uSadskXgDWqwI1DAyGOU4B/O3AiEAx7DhTm37EKTa4+QoZ3Gg9+fxcZgqDxdEobMNU9xqIyA="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.0-alpha.4_1548686898606_0.12870887871130465"},"_hasShrinkwrap":false},"2.5.0":{"name":"wingbot-facebook","version":"2.5.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.12.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.16.0","eslint-plugin-jsdoc":"^4.1.0","eslint-plugin-jsx-a11y":"^6.2.0","eslint-plugin-mocha":"^5.2.1","eslint-plugin-react":"^7.12.4","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.1.0","sinon":"^7.2.3","wingbot":"^2.5.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0"},"gitHead":"dfea70e99ef59b73b6f9e04c0752cf5aa6fa7da1","_id":"wingbot-facebook@2.5.0","_npmVersion":"6.4.1","_nodeVersion":"8.10.0","_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"dist":{"integrity":"sha512-Pyd2KQFXHkDMjLn1Ja3IDo24ExKIi8jB/yE3CHlX3maBJzd2tHG8IiEUcYbApM88fnG1eQnPw+EYUtBY22/dgA==","shasum":"397e79db9101ddb3d57dbe5d2da23dccfd322af1","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.0.tgz","fileCount":13,"unpackedSize":73315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUJZ4CRA9TVsSAnZWagAAS4oP+wV/HRtvHAM0svvCN/hS\nI5FoZ/mnv/2WMPOVdMEul22ZV57n38zWCPi7q1jFKyrG/A0/CU7m+GxPdRum\nhrYUNLIHxdSrtGneXsrfBvUU/ROygwgo6ERIX6Yd1htClugM64x76uZwV33H\nQLLC24yPhNXfOC9Rui93DNfR8HtY+I+k8DuUGPUC/nU8K9FXrkSF6GrMav9K\nNw+p0U4bbjCSHt0ZO5JchTw+OEM9zNDpIEOJZRjxHxcSC3Xigku6wiezZWKk\nmnYRiqnYgoYjcaCbSKUO64HQi4HFY2buU1NNi+iJT5YOdZPmeq8sbQ9aZHwl\n7H3DpBJz/57NLGGnXVRXuGByIm8+rkTh9MIsHqXze8X5+SDD7vry3xsNK8DL\ng/FxPneA/D9bGjE+mwM9SBg4odSc59QUQ0eGepopsBHCSksqxe+4EFk9s+CQ\nFe6iuaCOjnZfzQc3PFnTqygY/Yt+Bh7tp4QunKc83jYldg0GyIZU1IpGNsIQ\nomWdA0znDg/pmgndPHRHIt/spwL6S4aGTToREeLOVOWlc3nIfCwk6m01X+iT\nAvFWW+UdXn6Hs9fEBI0kdJdbDcRQPZZ69ESpnHMTM7XhpkWTRg/bETle1/ig\ntZzSdMPZLPvj67FgoHx6bklEH0pirjymTba58ZRThACcRJRbSNLC2OcHhucb\nOVHT\r\n=IRF2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDug4np3O+wlfLX/SRP9/AUnSTB2g6dxQOOYZbdY0YRyAiAz/zmPJKgBPPKWO3IM7DHyHzv9ROnyngqCra19ZGkKHw=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.0_1548785272080_0.6157184731926062"},"_hasShrinkwrap":false},"2.5.1":{"name":"wingbot-facebook","version":"2.5.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.12.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.16.0","eslint-plugin-jsdoc":"^4.1.0","eslint-plugin-jsx-a11y":"^6.2.0","eslint-plugin-mocha":"^5.2.1","eslint-plugin-react":"^7.12.4","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.1.0","sinon":"^7.2.3","wingbot":"^2.5.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0"},"gitHead":"dfea70e99ef59b73b6f9e04c0752cf5aa6fa7da1","_id":"wingbot-facebook@2.5.1","_nodeVersion":"8.10.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-mDM+0g+uusSEmza9Uj4tohZPkipK4GwoUi3oinkxsbSIStvwccmv+bI5xT2OjKYPWZewEI7maLXqYhoS9QIATw==","shasum":"1f87df865105a34d5725f8acb920ef4d36c9f4d0","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.1.tgz","fileCount":13,"unpackedSize":73554,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYSwVCRA9TVsSAnZWagAArgsP/1HCeNFbsSJyFYAebTjA\nq3NpRVziJSwhqiLYDGSQO8XxosfGrTkUCFzalE4Vec6hTjQEl0fLDFDJ6r7i\nT7pE+DKd8WxrWkECKI5ZOTTl8M2LHUzZW++9Vh8kZwhgUmlkzx6l8meYACn3\ndQbKTr3abdsnEn2z4W2gGDdu5myDOQ7I5r2QMo94KzifH/4+m8+qQv/E8vDx\nCMp1tXWRdSyoXM6JID2HT2vOB0NU30aXVw/QMbJ2Kpb1WFYKUM4dJFqaoqU/\ndAya7tA0CbKaBXl2zgDV3epnjpFNamdyf8DIcil4ReYuHrqrVda6ZgngS9og\nnMBodzzCyRA57Basz5F6gKvSpuloJr37ER+BMdwM1FY2gx/RiwvvxaeFlike\nLOgwlcsch+qC1IZxvrFJ39G/EHa4CXNrxPIUBYAAWyS9Ed+Jc5/n7Ll89ICs\nowMvPqH3OzIWwxfsbFO+WyhBdeH8ktGdx58x9e08sei1s/l1p2shd807n/qO\nbHaEFD8JpHydVFFS/ZjZU/JBDQNjJnCPPoSoUAstHpK7EBd3i5WspHlcHmoz\nOT/AHnTqtplYop+Gon7QXcv/j6ZlBHXxyXSI8bAsO0+0t0o+2dqenlzdyRHt\nQw6eDDpHx4lLtnFgovHlNQUAX6BP/rcvg+LlxTbPb81YdS6iJ+iASATs5Rhg\nKv6k\r\n=REjs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHAOSQTprMEPzpyZjKGAKS8oGKVt3KYhp7Ae9g6eeWSEAiEAttp7sSjV+mdOqlA0pF/09dMkNtVg56WPX/Z/CUrKwSk="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.1_1549872149122_0.8412104668363705"},"_hasShrinkwrap":false},"2.5.2":{"name":"wingbot-facebook","version":"2.5.2","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.12.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.16.0","eslint-plugin-jsdoc":"^4.1.0","eslint-plugin-jsx-a11y":"^6.2.0","eslint-plugin-mocha":"^5.2.1","eslint-plugin-react":"^7.12.4","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.1.0","sinon":"^7.2.3","wingbot":"^2.5.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0"},"gitHead":"dfea70e99ef59b73b6f9e04c0752cf5aa6fa7da1","_id":"wingbot-facebook@2.5.2","_nodeVersion":"8.10.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-hAheHZUubDxoeeUurLJkSDQvAEVKusiZcalfWhRTovp/eK5p4qalOhirud0Zd6dKzLrtHurEhI9Sk0Ek47+fQA==","shasum":"e20e210428e16c3fbf2fc43cbeaa85e8e38be5b1","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.2.tgz","fileCount":13,"unpackedSize":73654,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcbV3dCRA9TVsSAnZWagAASMwP+wTlE1W+pk2apUPDLSk8\noudF1vf+tEIlXXKTcSz/+sQ+ejK6G9MYrN2BgqBZva8OyCbiZ1B1WAy8eEdN\nFApbJwRkdF9R2MZY8HuIrSMGWpdTxSkfPtCjCTGB/62RE/HzkOkhJpkKhkZn\nAPMC4t3TY4PrhCWnd2elQiKlZROZF8bob+m+3PuzVnxgSUsLN7BzIrlVh17l\njWojPkGn2tpcyWxwJk+bF+v50gpd0JJyq8KNV9I6ZIoQB/nCgMW93LyJSm4n\n8KFo2pfyieBsRlc7RsMrzVFI/qx5pZgGhiCtwBxHWX7gi+wyq+GcMuVLMaSF\nFnXyGbHbX1nvwqZbkrPsVFS59xKiO/zPG5a1AOZ3gl8Um2Svp2A21lZndUhk\nV/xgEDoAwr2L8cvoCscI7mzSiEP7gPmzGtaLvUT4s+lZQUZj1HMhsOyfZAjX\nYGMJUwoNf9MjTzGf6D/11L7UM80crvjeW1wpl54xvTbK1Qmw9rHkX7PRpga4\npI1wz0xusDcT2OUSCqbyQb42fF+kzx/MsCsHjKDOg6ZQkXwILkgWwCRUX0iq\nx97j1eCF4m0z4bng1sxKvRE07kZHItjMdseghf0YZo+oEExdfht95HOCDlI2\nIOfRb5oF06MDgJTo7Q5XwNTpi4IJujnoPG9+9mEgAKvuQiGjYOcDtPkN0S3n\ntfbk\r\n=zUqG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIED/hdnZzD9CsoNs1/aL5KB5dW+WydHnvWsOyMFieJWRAiEA4cjOYHUWMqt5N1u6qhX8hwHGjhIn4HIba2tbw/4kcL4="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.2_1550671325178_0.7697287765464738"},"_hasShrinkwrap":false},"2.5.3":{"name":"wingbot-facebook","version":"2.5.3","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"aws-sdk":"^2.330.0","chai":"^4.2.0","eslint":"^5.12.1","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.16.0","eslint-plugin-jsdoc":"^4.1.0","eslint-plugin-jsx-a11y":"^6.2.0","eslint-plugin-mocha":"^5.2.1","eslint-plugin-react":"^7.12.4","jsdoc-to-markdown":"^4.0.1","mocha":"^5.2.0","nyc":"^13.1.0","sinon":"^7.2.3","wingbot":"^2.5.0"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0"},"gitHead":"acedaef8aabbebd9fc37c403e794237150dc7f22","_id":"wingbot-facebook@2.5.3","_nodeVersion":"8.10.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-QTRCjSJmmBYizDbvubYQPeh4pyadpwbM37z64cwGQVQFY4f517DtxlwxyXHU0jtaO9GypGl20e3//LZlLWGuNg==","shasum":"925850a8239b57352bd06daa6f421ab5d4f20ee6","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.5.3.tgz","fileCount":13,"unpackedSize":74113,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmeSeCRA9TVsSAnZWagAACCEP/iZHhrguxoaiBAXPffU0\nEaEunsq3oqhJNU0MCWlkn3wvlbiYAobO9MGRnpSdP544msfbL8FmI+dK+B/v\noj+ZSToLgsg2gQ7FRUzm8zZqsqaYaHxPo3untE0oj4RS2F8vXaW0FcqadCbo\ny6htf36RYfBTtfkeW/PXztUoCmFpFknnnm3O8Lqu+SDemR/TyBPQm+oYTNmg\nJ6fjW9/Roi+3dbi29SYVPNVmRWA+8NEsc6X5nng7ezvQ7jX/RrZ0aLwlVqLW\nVOevtqKZq6qI2IVBNEtY5thshTXa95dWp/bpMWBHUrAbju+TakTBVlnWnOWx\n25z6t0NW0o/aajB3LL+XRMAYeQTEqi/ggATyL5J+GcQ9vRjgXYZ/dpkCiNc1\nSDQXRrGH4UCYgKkfrqEJVyrVXH+dA+kbZ/H349aXvpHx4VeVv0ZZSNMC72Bl\n4K961eUw9t6XJIazPQCHOybW9ffW2OZ4AepTzRT4EMPNwzDiQUPjNxaGhHcg\nKCpa1C8Kp88AskNscNABEsKxSev8wydQeppgar4vBQmAi3cmuOZ7Q88Ikcc9\nwjtuFHBDgqouThLZKGsSV4jx67cF3y6+/ESs27Qv0WIDsyWLafjQbZ7VkKD5\nawY2FSHUCFTe0+HHIWLgiyN5Mg9t5MSwomyVsmso4LLHvVa8P9ajmB2WYw38\nJbd4\r\n=v23h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHkxxxpha0vvh71WaKo718BgND3bTU94UFOcRJ/45CawAiAYKCUWNAD+CpLX5l4fWp/CF/boT4zpfTVCCj1Uo5elsQ=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.5.3_1553589406119_0.6855182244895461"},"_hasShrinkwrap":false},"2.6.0":{"name":"wingbot-facebook","version":"2.6.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^4.0.1","mocha":"^6.1.4","nyc":"^14.1.0","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.5.0"},"gitHead":"0ae5d993a273205c7205a775fb6b99d51a95aac9","_id":"wingbot-facebook@2.6.0","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-xPGqneUohVsSy2KFTGGgf3GP8f4JR35MT/gTAC+GHFzAY9f6XsJkfVU9OBfBuLox06YWdrmxRHa59Mw7x5wKhQ==","shasum":"6713bbd880ef6bfbf95c54f8c94c292ac7f92c90","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.6.0.tgz","fileCount":14,"unpackedSize":85345,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0DrGCRA9TVsSAnZWagAA9dIP/0eQB1p+LAvyONXduZ6t\nlHf5VCQphMk6bm1HG6S4T2HGJfopxo8VZmoeI2ehoZIo0dWucaEK8HLr24YF\noWEP+JNJaRsi0YiRHz+JCmdELtgg1OVejqO/psquBAOpLRrdd62STgfCXULu\nwytoxNj4ru9uiYsLPIW5HotyAtBMrBsEdu32zxE4NdAU53ZVkbtBgYDG3zpK\nb6gAlSWChVjEK+fiBjSm2PgCvxF9vTOU/JiGiaz0XFPnTqL2aA4t9RMpBloO\n23umsFZb81Gu8KsJy/f5x0zUUYaHacHIGef/rdPUKZKFjdmPzy/bpHTBwilA\nqS4AyrLgEcYK1zQKnxEH3mZiN4UBXqdkLLensWfdlCKe6cJhS+rzQNHm2NMc\n/W5XIVuVmoidcevKDJhpTX04BTS90x1uwsx2lrrRixXlkvk+RL/rlfcDdm1o\nDhrjC0uKREttkJGzOnYr23La6JYHka+j1gu5nCHsqTuLBM/XKRV3IkrJlYbU\nCorIkkQNu7hHClJUz6bxySr9w9sv1SsrL4Lb2xNpoTFKDVPLqGQ9SMFvU2/8\nk9w6QqskNlovCLtBC9CljoIcvsrQs+iUOZ+banPqlXWGs4Vw3U3Y2u/33h2w\n91rFgZ05xtPxb04pKDwu81r95D/vsQ5w+UYgr4zdvpip4xR9ywdHHxeUEiK9\nhoa6\r\n=T1L0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4PMhDkcqOzDh769KLIptxtyqjc9kpom64UmO40/ArsAiEAtEEo0UZYX+0NnXaWYIuITJ3ERu6qduKTPainDuW1ABs="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.6.0_1557150405798_0.08153947947051177"},"_hasShrinkwrap":false},"2.10.0":{"name":"wingbot-facebook","version":"2.10.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"dab728a24a853854ff695fef35102d7d3b2e5621","_id":"wingbot-facebook@2.10.0","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Wvw+gTRnrh3fj12l/4AV44Aaw363ueVnFfKkW/Wwk0rxzrEXpz/EdtwKS64Cm4Hxzrz6p6oVHmBqBmM91CkQlg==","shasum":"72c59dfa1bedfb4f98e03df8afd97eab154ffea4","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.10.0.tgz","fileCount":17,"unpackedSize":87544,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2tAzCRA9TVsSAnZWagAAmY4QAJ9lmvTcadomjsWhjaLw\nFHQ+q8JMoihqNeT+XrL8l5hjwaJQx0k3fhhSHSJtAeqffUhXlLl/Vi9vnRcB\n9fPTtZPTmW7fi0oc41L1C2Z4XXpnzOcQFsM6PT2MuEG1f4z95krRt6uyXhR1\nPr8fiudtEX84Lil3rSp8s+oLJUpKkyKGidn3bYFY25YpmxNTkmvIv0G+W6vc\nEJSnr/xb+BuqXzuwtly1bSLQzgHxdCS4+IgkcXrwS+pt+baulDnzD9MYdGzK\ndUxWl5z9VcL9G6E/h3UfSRtisNPSTA5+0VhCV97PJSf8Zh6gmKxHPCSWor7/\nPtIS9SqlmoQ1K5xKarm+vXkfPd9PHsIwpJmdVXEqrPwOh5b9wcaaQCYJIQuF\ne+na5GSVsktWZ+LPQUD3GusXvtHStyVukymuV3qlzb2Wye19WQ3bIASow/Mi\nStXFXVyvtYk6zaR9OzwYxlhqPcyuoeXsNub4lDfhmDkxK5DkXMmsj+bgPOP9\nKsPc/LiLuFbT0hcJHlAGqEg4/+aX1cFcBRMJkl0OAZH7JSBry6EGhrDBaKZw\nqx7SgjIZ8gSiIpW3mwqX4O/kTNKQOxgif/72dOaV0cCLYFWNzTAvkunq/epn\nCo8f21qdhOf7WoYVQvmRnEFqk6Gr4Lf9vLg6BV4AQRGPwmXtr4rRxM2yI9wi\nIoOv\r\n=uIBY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDrV6jd3QBqwPuvmGRrZ6nt+8lqLmBDR7WBM/sVqbxMQIhAOn4y3tMFm1Rss38BcZ7Azp2QnVbWEPJq20FDuGeAn14"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.10.0_1557844017954_0.7727177428642276"},"_hasShrinkwrap":false},"2.10.1":{"name":"wingbot-facebook","version":"2.10.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"dab728a24a853854ff695fef35102d7d3b2e5621","_id":"wingbot-facebook@2.10.1","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Gpr2IqqIxvkEKqv2ICakO2YLOtLDDyf2VEtQNNwy6b6OUZOpbbktTpglnGTI1EfOx103Ljz58jHtHZGLoxxjdg==","shasum":"36d9ed90fb192154c12f0e59bf7a31056dbc1496","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.10.1.tgz","fileCount":17,"unpackedSize":88532,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSwF4CRA9TVsSAnZWagAAA8UP/i4QFYuNVpRTpk2p6HJz\n5fbVlvO31YIxEmieRhESxEA56Gdxg+BT6jU1v7dmzxgbMNLpux/JyZf8W4QS\nkQVl33eE5NNZYpGRAiMo/2C05tiXBjhdm6CslbHrfqZHiYeatyWCRUiOsiwW\nGopj6rIQMGrh1YodYsWe1ib5DP4V8bRmoD9qaH3J1U5TJMQLFqWDzP76ffT3\nLYvOJVL5yJab7Pk8kHY1V3V9tlFs00vEm+onSGUXlsrZytcww4Ow9wPiBZVr\nQR/S2LKrTCdxqd1cMihtn/GZvNbQdZETkNOs+yVI4YKSL7LqtoecM9Fge+M6\npqRO5EYMqWdPYroc1actS03PSFNn8BrXkTPvddW9XithxvJeDBFLF0DdKDKU\nCKy+S3G3UQa5YeA9q6rjLZ+wjNqtif068nBtP8jF3DkYkFPvHMS9tq338OFJ\nsQwnh0yJIihPev2M1Ab64YTjrSprtZbyXAnrs4Yc1NFwvHIgbDZYs7/iUyKY\n2WMGidqGnMNfgaTHThMlRvrP6oxe3fuYGXV7T5sAw9jFaVYFT6GfrwMd4DJc\nEDXlISa7ESoONSItljGpn4J2BlVx4QKOnXSI7D4dUYTkC8pbP8IIrVhfTW59\ncP6XHYT04T30rdPznBGo87U9pUZomkpC/sH0UOfNOdir/MhQBn8ZllWLRCoM\nf3Np\r\n=ygMK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAVXQzGth6aj2QsVbiLr1U1D4EQYA/x91I0fxl4FRmA+AiBc5kKQ0UH8OwzXpHToksqU/Ist8eMFT9icVSgNrjI28A=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.10.1_1565196664162_0.44424799843031804"},"_hasShrinkwrap":false},"2.11.0":{"name":"wingbot-facebook","version":"2.11.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"80bd3de004a39bc158796b4e862ddefe4c3f2afe","_id":"wingbot-facebook@2.11.0","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vyj8ysg495XKfKNMYtmk3u/DxhJHgeBJzg3w5oSPsGM7C+e8ScwlWA8vJGP6Vn25doXd3QeRMlW6srcn+7PmJg==","shasum":"6f8e4bc5a987239976479a33769dde6c72a47ab2","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.11.0.tgz","fileCount":17,"unpackedSize":95090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdf8NaCRA9TVsSAnZWagAAlAMP/1sXW5EzcAurQx24mnXQ\nLuxkx9yopcTzRZdrhcUWLOvATmDy64tDfA+FgvcPqtiKUkTxbYyE/UKix8Qy\nxGQZ8//DsEiVdP4mkdu9/5xdYSsY5xshM32fCCOQTst+/eJtkZW1ChV+7Blm\ngv5+xrMCIFRdE2cfqRlYICPemCacyVJ7q4ULv0fe6JovSInQ2gjD86U6xx00\ndPNV1vt9JPBgQKhw2o5YpfpOwA87ZmpMvB667Kq8NWt+bhKv7o23uv4AzHoJ\nf6K1Mfzt2M4QlSNqHvYpysH04lQsLMCUfPCybR9t6Xfgzw5cIdOHJAlrQOGp\nHOFW4IDmshoIuaiWlJnSbiVoyr9KZrqIZDAKHzxInQSssg6stqTLK3cUxNRU\nDbSIzqxP4T+yfi4awmc/51azTGD66Ob6/9yU3B0o9+IYpZm9IYjG2lCNsMxb\njQ6pJgAwP5ehrxIsGNbesG1w0xVxql7seoGOOnxb+rxrVW5DQyyWvRBXQG8C\n566zkJ3J1/Eool6eLhuI5gcVaemJvYS8BycIYbWcZM18vKQqUHArZu49prJL\n2qHaCYjxA/TXdWKfdf7i0MoWkkdbdbr8YLKMj7DM57j2tgGGrmxWi01cG6jU\nSFY+0QOTG6wWxSJ1hQeofa24LJkVr9F5hvVZjsATWX7wCffL4WLQnFUD5HSn\nd7AZ\r\n=vM75\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJ9jLsIaJJ8fHuP0l+dj8dVkRcvhwxwUB+td4P6nIkMgIgaAicxOl0NshvOcdxBKVlMHclFHzkdWF6OkM31X0uH14="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.11.0_1568654169925_0.4222364457313075"},"_hasShrinkwrap":false},"2.12.0-alpha.1":{"name":"wingbot-facebook","version":"2.12.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"80bd3de004a39bc158796b4e862ddefe4c3f2afe","_id":"wingbot-facebook@2.12.0-alpha.1","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-T9YWrFSwiOnv2aZVDIEWcgCyX6VFdZx4j0E1ssfUSjoJdttUxh01u+e+8SkzMI8NUzeRuOVt59R/rjGnV2Al3Q==","shasum":"8149e6da86a895bcad415be013ab8562d717002e","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.12.0-alpha.1.tgz","fileCount":17,"unpackedSize":96150,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdiOQACRA9TVsSAnZWagAAHUMQAIuKbfTSrez100YjQDzK\nbErTnhBUzTOOEkJjGzgHOleViA5hMVwab8ovEqwnRI49qf9aK+pZb973E8It\nfXzLbHC3v6i6L2K8bbcp2rTs+eGkvleeBH7tGqLp/JiuiiIqbFtpjViYsMRz\nOmV305oRraJYkvclkmgQsx0mL9USv829jWpDvosExgTsVBosOuK+QGdhNUum\n0+V0eWpGY147gOxLFM/Yix7LdolvEJ1JJTTr3h1hyHuEh3fgCMHq5/fWaCdD\nR08poPLet2O7OuQ4n9O3ETRbTDuUP4o3MSvUKcm5JQq0LJv1Dv3pgOMmToMI\nuuRzNr0Xrnpy8aAf7yNgLJY4/rCRB0Den+QMVn5GIHLwxQM3lqJmetHS2n2G\n6zdhrmMGbfsGXoAAhZFqbfaRG/kRdvzvnG4AJN2ZSHB2bMfxQPCNDzlInhvq\n2MoLwNk+4CUDYIhY9EqOTIq4uA6d8OGm5jXkP5PTW1kdk55iEsn1I0oT2X/p\nFpXHyTEu1vPpzBqZVAQPVIYwPU0DhjFNmuEqis5Sw2tJ11McyOit7EudaTIY\nlIxXJtqBqXwTN04SMFXLKONIv+xwOrao7IChgcPhqMcHNqxqHyIqJNrli6mw\nCl/YUJ9mXzhd8LN1RHDuBbkDY5kNmoAvFO6u/2bal1qEkibDnSC2RwenIkFL\nnTAn\r\n=omtw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID8l9F+vTPH0XqwyTmGx2EEhIWIBa0YFucHrVh9ZLkUrAiEA4sKWQe9QZO5x+rFK6OU7OIzJGfeHOmC3eyywPvQGONk="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.12.0-alpha.1_1569252351511_0.6747624793626255"},"_hasShrinkwrap":false},"2.12.0":{"name":"wingbot-facebook","version":"2.12.0","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"80bd3de004a39bc158796b4e862ddefe4c3f2afe","_id":"wingbot-facebook@2.12.0","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Gw+LahtIRJ/pI8ROaKRGjeBdhnK+Zq8+7s6XNciZTTZve4kCRgtaTj7qUyV77YNx16lMPTF6Id+UhOOoUb/6/A==","shasum":"9a31ac03c554c306b37bb14238ca09e54f94d06e","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.12.0.tgz","fileCount":17,"unpackedSize":96142,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdif1MCRA9TVsSAnZWagAASvMP/2xMdf0xXkv2KA4utPc9\n10BoC789TmCFW6qy5GCZeKXDQ12w1dVNHA/ABDAtat5GoEkKYijbiapCAc2q\nkp6k6qkPpCXJHzjlET33TV1X7crFQptrU1+oYuoN2Nlb5Ewj+whkpu5gj889\n8Np/g76VyMHTT3buwN7eQiQfSfaIHE26AZztz4h4ma+ah1+W8ClvNWGpDgKV\nZEb+ym/ZneBstguRRxWkP44us48xRNhvPXY7oHRGzU9JDIesUOmAcqvD3zb7\nQh76sOGjRxA3EAplA0JlZ851vd5H7eLeYJndjFshAMly/Dw2tHIiXqqCoLdG\nKjHBuxIXQh98DSiqrjGmlicYqsFeQxgCSSQh72Ju86n9S/9PgCea70rkEyk9\nFxurUDtU9pXwkeXSTcLqDYJcdj7i4B1WF/jX+WzpM+FgyVlO/tV2yV7f0Fkn\nePZaDodE6mRSoScnYTzk7YfAbExHmj/VOvx1J/YF/jMbwsm5sDhlpvk9KvwU\n0xktiERAVmBEBghEGbmTYT/dfSItJsawTWr9Gt0vDu3vYG+AKF0j4w58ZmQu\nbIhz5eYEvCxNfCCuvvFmtbskLc2/JFQbZMr/1hrNb0VBU9wkronO8XimM274\n105izyLDjk9+zTAlLYVTmc35eGBPRtNwTui1nLH+2Sf9uaZRCrLSRT6Iq75r\nI7iB\r\n=AiDB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAbOiVa1V0Zy5WfAkFvAE6Bdqh7vzy4OB9wUpI2f0F8gIgDotDJhEo1Ca7PcJBfHML7DGui+YXMiHcXfthpWqKGCg="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.12.0_1569324364066_0.3482443634807255"},"_hasShrinkwrap":false},"2.12.1":{"name":"wingbot-facebook","version":"2.12.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"4021dc5ab0f10d6fa18b76d37846c2b655a70b5a","_id":"wingbot-facebook@2.12.1","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7ZLDp9J6LXjxHUczwKlgrpJPCj3u0jSNvmaYPxBJi90Gk/3stEWzqmn1rDFMOgxSvNoe8JVNuL80OIrliVOeAg==","shasum":"453ba480715237e8d86bcb80b95f3a6b72ddbc9e","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.12.1.tgz","fileCount":17,"unpackedSize":94501,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdj4HZCRA9TVsSAnZWagAA4tAQAJtnfV11EIpWHXHXZsFf\nFyDl5vf3UmWm+xVXazUEU/gfAPObUlYtxPgVp5XgCLQjFFTMoT/tpCZGHHZP\nLsrvevmLb2LjgfyzkiT1dZKUms9tY4WIDSg70ENUOZ6h0M+OhK0rOs+Vbd/L\ntWa3dLw79qtMHygeZbfyuUPvcGAf87ffj6ObtOdKiFV2ypqy0Uxg8VxSe4D2\n+3+l6wT8YDFAs/usozV4sOhzNCBxhg5Ki1gMZ8G7xJCMrS0PfxfgN5KILo3p\nQOwqqyloUnrFsEdjDflFPTRrFqWRc07ZkA6oAZjQKulh15nM8SGhKcQycTp6\nSA0mfuwL9/T3kN7kO6NBA3s+DsFz8mON8EAEC+fbNDIV82dHbd1heDV3Wtap\nTXEN6MxvpRJcmO2/Xw+tVSLx+GUndPxrB5D/HWS0IcR69qAFwxO/RMP8W++n\nmlx9zVVdkep+gXe1oIG1JFoTziqGvNlRFs8eqfGA712A0Jo09Jgo5H0IvABm\nZbQDHvNzM/1nKBeM990QjpXJoI+KGoNISgMgKbqFcHt9q/jBDVZGlxi6CLij\nYZstjfTMLGkthz+0+oaEweXRSkwBSMsIHWf6dw50jjz6Lf0IWFeZYP8BTnnR\nVTgNAolTlpk+7KuDl+18ytABQabeR/uvNVmueJr/aphYmED8LG/2dwstJjkR\n1bts\r\n=q34N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGB6xIDSHw0j8IDXp5cLGL4WaqVru+FvAnKhIK36/wmnAiAg7NC+E/MARfd0zAiRF+C0EvVxArdOgo38ctcGJ1OtJQ=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.12.1_1569685976770_0.04489226625865528"},"_hasShrinkwrap":false},"2.12.2":{"name":"wingbot-facebook","version":"2.12.2","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"4021dc5ab0f10d6fa18b76d37846c2b655a70b5a","_id":"wingbot-facebook@2.12.2","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Wg0IPdN/kIC+BvWXo15wxx/w7LVdEg+Je/4uFrqqPnIxUR9xEeXzX7zmyY2gtMNQtExdqh7INAd4XKG/4ke8hg==","shasum":"0e86046f65882dab4d5c694d2662b50d472abe9e","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.12.2.tgz","fileCount":17,"unpackedSize":94556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlNspCRA9TVsSAnZWagAAlRcP/0c2QHprXP23nfeX1Zl7\nUltLLrRDcMCsGIR/SrCKM5DGXVn59Tubc0aZY1Z818/jvZkduCGB91B3zG/S\ne72Pwch10JVaABOkznQXH+hZLOwuyw76QsBASeSNo+yvNyD+N8Ip+mEhvPnY\n97MqJJpcRLb0m5koDBkNITYNpm3bTLz0diU0oY7W9uSXHPAesCOt2GIW7Skg\noHXXeeyT73+BUxVrKNs7wW24x5AEtzKkyVx63YA/Ygfj9gh/6m+qXPAPh2xb\naTOyMA2qaN2aGTX0Cf3gkGXSxvWp4S8Hk52ZV25VemrcqnNO9ehmrXFI3uqU\nWC3EULHjxmj3ISBU9ulChpnLDgvjGY8pshRFrM8e1pBQjA2MGsqChl4sL6sA\ng1jrUi0h3Evq757bfij72Hj3AKZ4/N8+0+oLH3Gzom02TCVSLQ8N6jtbIXM8\nTjvaKmwFgHocVZ7VHKpil6FF4+pkM3MuwPPu81WvbE3O95rqTTxkmMRQA1zQ\nHDizaQ4Iv5/Mxz8i+EkwMNFsVngBExiaVk3x3G6M5BW3ETg1TzaQayFWupMc\nxIr8T0gnbtkX2Ls+aJ8adZwksXQFMcZlOzDtIOwM1WXY+7xPv6pvJcREai9N\nEvHwwxomFnhRX/lX1PPaub26o5jXHjs3zSKdRLlQr8lcVDdtLjJ5pG9Nbnfu\nS2N/\r\n=/PeV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICVFiOpYksxi7TwxvljjcVSg8quVlpfV8VSGREsX8SuXAiBT56ewoGG6R0JicWcnzqboT3VRTcCAoxMUOHqgWbxp5g=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.12.2_1570036520675_0.5634039862231988"},"_hasShrinkwrap":false},"3.0.0-alpha.1":{"name":"wingbot-facebook","version":"3.0.0-alpha.1","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"9f2d707da1b7084b37597a515ba91a8b0b270e98","_id":"wingbot-facebook@3.0.0-alpha.1","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-t1syy7JGR63eTQqRiXg8UEehcqPiURSgJYtowb4KcR9UQN/7mUlnh+/ygWBT0o3/kwPkn5Suz5Mo9nh4DkCVIg==","shasum":"499d054d9f6a004b12b40c389a9bcb23c091a958","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.1.tgz","fileCount":17,"unpackedSize":95566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5lSeCRA9TVsSAnZWagAA1rAP/10xPKgDAp84EeiO918G\nHnZnzXwrUNluqJD5gis42r60DACooWV+1fyd8+OQ1DGWcCkxeCqq8U6BMxSv\n8G6eFoWSnHKEKOcJS3TuAJh+CTOT0utRP8yUGorB2G3Mz27AoMfVnnJ64LS5\nnDvO6cXTjavNU1Dw8Ekh53hcqp/chCrcVa0d3SAI+UVPUVblmm1eDG5pNuXV\nvwA6cz4aKP3tdXNuAg+rLSMhVLh2IAx5GjBgCOyVWYJt8KvTs6xKfttC97w1\nwZc2wXldXI9BLA1J/1MeF8HtQeGX6LrPrPUUTmBgMP2hwEIk3OBMd+G/Knsq\nQhA3E4ytD9ob1P70sJthdVgXKXI4XmxFNNiQhzmZROuorD2Rmj0DHVAIE0y9\nQ4okNtOBbecAd7qe3WHEPBBBaZaYt21Ccr6oBf+BIzlig4Lep9TDXBgApELf\nTBSLmtXE0+1FhoWyR1iyFtwXSReITVknU+TCvrlY1K7l0t0YrvTCmeAER7E4\n7kJr7yhvxqujiDdn/VHcXblFr1YkxH56PPhcrcfiC8qz64ecg0GX/a1AP+w+\n+ac8wspbE2lUIPtVy/+T9mW44W91p1P1qZpDnaGx5fnaxfmc6Ds9SN3bDUj2\ndWK9/VAK2DZzBZ/EIHtZDjm43jeLiF05twGv5wuzi2j0OEH1UNmkr+CgAJum\nRv0v\r\n=L9CX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDKavyGaS/7FuwHek6hMkm/L5X2lyobmnpjJFI5+X9TSAiBrFXrfG7htEDm03VEQIqcBDlf5GzeKqr62yXvkFpNYFg=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.1_1575376029077_0.26071851869581253"},"_hasShrinkwrap":false},"3.0.0-alpha.2":{"name":"wingbot-facebook","version":"3.0.0-alpha.2","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^3.0.0-alpha.11"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^3.0.0-alpha.11"},"gitHead":"9f2d707da1b7084b37597a515ba91a8b0b270e98","_id":"wingbot-facebook@3.0.0-alpha.2","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Ft6LXuBkCZf05apFvShxsMi9Csvsytw2IFp11c1MS3iyrcP2mw+ljDxHgbY0jdGn6zli1rLrr7vGXNr7Vu5xmg==","shasum":"e0265f095355ee48a0884946bad416ae6a4ef0bd","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.2.tgz","fileCount":17,"unpackedSize":96028,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+MxlCRA9TVsSAnZWagAA8bEP/034LNebdrhayzGBlIpd\nGsM1I8MecW4P3xOz0jkgGj0cHYakgihjPyOF2QUirmH2sIBoIfVaxST1Ceou\nmM2B46MwrI+Z7HKOmaDxxuGrpecUOrrLOBav9EnZ6LA/pQ1Eg3jdHAuie7NX\nlhNWpwyIxP+E9rICu4/vDBLb4xEGFOYhYi17eHD1ogpwrmT5PlcZGwyQQWgM\nzsCErGyDLS+C1rHvHCzVnxUrBjPrFjSuWsHRSI4v9conLrQCa7pA/HL8zl7c\nPuP/zGSqFvNn1U7HczAsMKanzqMuniR3nud803g1G6XzgwUHGwaixXPGPbQB\nu5hMsZ/ld4ZaPo0fZJXENxM2MDSo3CfeheBgvVngp9pT4mGenYuRtRferKYo\nCHUsOuuS29jVKayv91r8oKzQpjYmWh6rCjsv8/XrNbwjYGmHBt67QYEpNnqo\nU+0MXA1Fq5wLF2yKs3quwiHjzAsHO7NdFirummsew7ZUez2JVnSaI9PxPJFb\nv8df/kxZNzWd0Cf+SwVkRyyLhJG4bcCQUzuQ79Dk221UCVZd82CCK02CNFmi\nIqmas1uJlfzr3B3yDbZa3DmKf1SV3oFu0bbkLUWk6gvEwrL4WNbMhsxGH1aG\nL/Ofs7lRC+sZKqnLXiJtfk4LFu5CI7hJDaC/hh/Sx3Lds2FNW6lszPJn8bzV\nMCJ8\r\n=olnA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHvN5zbqwBemVDn6kc7HOrokUc3RtC7yBAAhOkr48vMAIhAIj6qEc5UPSNyDReRVBDE3niibRs/FoUPL2lWMtmMXco"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.2_1576586340603_0.40581038112932366"},"_hasShrinkwrap":false},"3.0.0-alpha.3":{"name":"wingbot-facebook","version":"3.0.0-alpha.3","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^3.0.0-alpha.11"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^3.0.0-alpha.11"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"9f2d707da1b7084b37597a515ba91a8b0b270e98","_id":"wingbot-facebook@3.0.0-alpha.3","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wJna2EPIGLoJzTo4EA+k0+oBo+116YXmpS2mLbiZl4pXtmEY3b8mbt5Tqp5lU/ULB+Pyba2wdLwEnUAfcZFeEw==","shasum":"ca1676ed23592301b5cad98793b9ba749d4b78ea","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.3.tgz","fileCount":17,"unpackedSize":96177,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+ORkCRA9TVsSAnZWagAAPqYQAJmrhgKj0YzTgIKZ3PxP\nB4uOePAJocwK5Phnbgw2Mep8OuRGEYMTj7GniqiViX5yEtknwQcTTytR2bcK\nd++RpZFV0W7nSvHyDhZAPloOiHXjehPAQcOK3L+rnd4sD+i8Lv0iF8EeYFqx\nRjuWsZkPYj1poQ3NyhcdxG8p+dS2cZ4c6ubH/mWgdyd8A9O/M42usCXpqfcb\ns3WSfZ82EGPcCwP9/QttDWejn+s7CMWelqhX6S3AHMvFsOZJIz6e/r4lbOb8\n8CNzEbmdXTi2vpIhbr8hMCwCsm8GKYL0OYDcXBUJ/SUt6DDoOzSzY2vFEWZ3\nz+SlriyXSHQoc4GJ9HcmFiEL3gLE9QWEB0Guxe+Oh8hq5giCKFjyiwCcOTFq\nvk7QQ3E4QVvbaTyffV9M+DnoyBWWc/jrf9nnEWuXiMCsBnn0Z94CwDWJvMbw\n1AEunQmcXXahrT7IW4vfyucprie4xXgozcIj3hZBJVs17+6x/AfHHuCfW59k\nMEwSV3GCuD/j03Qs9Y1Msk/zYh2RZ/wAS/0Ojs53kN8ECfovpV8UUZdkfpvy\n+4GXFKZ+4Rg6OVUTGFPHElkGWWYyzDcuV+lgJDRZpS/aGFH6PsQSPMhcdGa/\nB5228wK2xvGpdO1dr7pvNi+al4qLrBHwG9VyhziXxE0iv1SvYLRQtVfy6HNd\nq3ZR\r\n=HPP3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF0f74fYLZGHKfuysKFkro00aZqksr4KYYCOxN0Y/vKNAiA9xZXNawkwgLUbBkvsG3NjF0VwBM5aRHMcHVHmA3CEiw=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.3_1576592483703_0.1394382915145964"},"_hasShrinkwrap":false},"2.12.3":{"name":"wingbot-facebook","version":"2.12.3","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^2.9.2"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^2.10.0"},"gitHead":"8e43c3ca61df190dc041e9893825cec9534fc282","_id":"wingbot-facebook@2.12.3","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Ca+dEEGzz0/yF6PE71M+lYo1C9cQ6XDqewO4sTCaQCObg/vHKdhN1ASfCSKik7M/3fXvrA2s5lSDT6VwtE6v6A==","shasum":"77e6607f8f90a37273e2ff991ae185bc11b74df9","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-2.12.3.tgz","fileCount":17,"unpackedSize":94556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+OS1CRA9TVsSAnZWagAAL5kP/3uU5V3P3PYjBgY8iR6K\nHXeu2NoMOS6x76B9EyWWwOq6MT13mZH9bsN23SX0UTuIn/xcFKIF9bQOHjJB\nvOyTa0AGJOYyT6gDlUJaR5RgkMMLTOXPCCoa3lAx9J2+43Wan+JU3nKcnCHU\nFsGXoQ+amC8TAE9S2STdbDW2qglOUm81BYdETy9qA3e8K0XRlLN/1ZgzD0q1\nVeBZzGlZjXr1/oyLdboElL6l4Kqx55tktyVccu1K0FxbYsPvUMeOKnrgP+7d\ngXWyxHIBLmUD1VtQIvtfTLGWa1+Q6UXS7ART6YQszGiuCHwpHFmXeEP4OMfi\n3JZfw2FzqX5Ygu0qjKL2Bs/4nSzCN40gA4zFupkMVp0ZMj4IgWCrIYFxax/T\nUZwszdhHXunX9gZ64CfP2PYMcL6UYjj/ZEU3DZbXD9hMAMEWNdLQWNSeWxRj\nJ11L5TdejINjh1Cz9shQH3ZDESkVzqoVGCICK53foHeKTIH+WyhxO2VCciPJ\ndZN/aUbpUTOvjRvf+mSHJ65uTqOiVYVR5JdQKcaTTO0tU95A6eDS/S/JyJ1M\nwssUDvy7y/GQsmywB4YbCmO15ppQaAgGCjZGrYsjPitIsTRiYG/nQU42fR2C\nHhWrIM8z8ibrFo65jyTugPin1jFIuhU5SfozJn37NBUqJjgYPf+oWChwO8bw\nWkB6\r\n=BxV8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAKlIiGRJKfda8TKXvK7matnL2pHIcEx4DTbpHKpxrqjAiEAhxkU1sdqKX7KPFBFuVC5c39VOcTNbAf3oKRAFqlGnIw="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_2.12.3_1576592564759_0.8368807243816945"},"_hasShrinkwrap":false},"3.0.0-alpha.4":{"name":"wingbot-facebook","version":"3.0.0-alpha.4","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^3.0.0-alpha.11"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^3.0.0-alpha.11"},"gitHead":"921bb88318a19539c305376c89739b249d2b6dd3","_id":"wingbot-facebook@3.0.0-alpha.4","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-roCG41eJVc6Z9eQqe5jsc7plrgUXoZMHzuevRLQmaNVjre22vBWhKzBj4V/ZCniOW/PYb4FIx+f3AcC8Np/bpQ==","shasum":"eadcebe299471270cc452561d45dcff3ebde4624","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.4.tgz","fileCount":16,"unpackedSize":89463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeI1p/CRA9TVsSAnZWagAA0IoQAIR+EbzkWMenLGVJTMuy\nHPZMzwsykfVXwmq835+I7EBAUe1dyXzCmAct+U3seOqMt39TdkghEHOqAKRD\n3M0eNsnRJG+C1kCYN4Vxfzsuu37eM1Dz/QK16ILHeCFQE4vivGZLvQyPga8i\nz8AXQvK+qjsAZ/ZMxA2Yeb+4P1DiMbfALoG8oglds3s4Gkzw7fm0PN7f6MwO\n0AFJQl65t7kbwTe8il9/yboRkBMUHj7dyBGmrIydpuYcR4isOXCA9yUQSUpJ\nYMQhOhcHYa4GgdbboIRA46164AWWZXYHhyKdpwohnkrxxAPwJ3v6Qdzs6JYx\n0DeMRIQQGU4YgPTDThHenX2kthnNR8aAlV67DH9XLhEzCSfcXlefjfrkWxeu\nryCTbRj7ENMjqg3dVhZc5wVgkxI08nwSTYlBTVZhJjbPobqpZb0PdwkrTrpu\n85iiCNU418UHPCxrLBgvh8cQ4rm2PW0budB8gsMEQbTVM6XC/4sL26Wp1Zlo\nKPOETuaiOwBAJ52QzKr8Rx/hzG0jfb9QIBFAnvoZHZwUq3+4FjZa5XFSpNc5\nqMqBp9jZZI3JVg5SoIczUvJaW1xJH+rs/OszKLoK5MC1GV+yk32xYLrwGoUe\nvaeV6p202R9D3nof0vPuV3PoE8rMK0+TYRX/Z3N5YhsWhCfHq09IKeEZYIUn\nJNkr\r\n=3pOe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9w2+jJ9ganYgotw0Lbfgf9Mi9mbN/OBhFWjHYU/pgbQIgXlcx2k3Cv4AEzrtYtJKj/V1eJqIV0hLERwj+xn1IrZs="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.4_1579375231403_0.11132251905368928"},"_hasShrinkwrap":false},"3.0.0-alpha.5":{"name":"wingbot-facebook","version":"3.0.0-alpha.5","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^3.0.0-alpha.11"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^3.0.0-alpha.11"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"a35dc5b09c89dea662b1c1c1a7880a7c29126b28","_id":"wingbot-facebook@3.0.0-alpha.5","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-AEYVGYwu0t/PWhT6GDMZcvVeDQNT6NnvhMEjq8DUHDwaMhYZ0uDeYu8WAD3xrQdcT28OjTmAbWUyaUV9R0zAwA==","shasum":"6ccd909d0934731c8dbd702e96894558dab65f55","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.5.tgz","fileCount":16,"unpackedSize":91021,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeKIW5CRA9TVsSAnZWagAAlsYP/R29vN3dFgvrVT3fwBv+\nXtaxg4i1v0ngUXO9Lrh32u20dVhN+fIZttMhO4S8nfPhBp4gKpUtpNqPJXv4\nWkfdxA9OuhGzfvMIGFhWi9U2GIGhc99MUFZcRjH+rM9GmD1lRYZvco8MiI6V\nSVIMQMgN0D95zrJDMm1PeV8+IXrrqb+HdAfOnrx2Oo9EO3m9oR3T/izBm/G6\nB40tU4O4Nbbc1i4EJDi5JWDy+GGSBeMhvEvfdAjTr9VE2+RNZ+iHMNwMvaJK\nsTblIRAut/UHfU0fUVjcqdfG3wTnWd5lBSOvMbWsIsBwc7wjYjDDLeZhqTux\n//Z6TWdBnDbn+vU+tjN9yCRJo6kkXsGS4VLIRbnAsoZzyaiQvhFE6CIiqFp0\n6EgiiBtatA+hJBg+Rz0LNB9YRGPNWyXMNXQw/cd5fbqBMyHlo2kzI7NIjmiO\noINGTXIb9uXR6nJkzBeRgE5gTkxS/Nb+9eTHKt1uzhufEwQSJ8Wxr+eaIogO\nfZDE/Ee8oAdEFDks6whkZhY4au8dj9EqDOQ9fO7IbkA3ehlUV7GV4G6mj7EF\n0i1G37WCRhWgcSgZyQYU1DVuSn2oS+N+tM4taX2wsm06r01K8AtblV+6bQCO\nshqcmsmJL53LUmSh9cZLfWvrHm85lm5QgSMmR0dBBEdpvwA1DXp0rgjstmHL\naU7N\r\n=KIld\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3zQVDn1mnhPgSor+5IGHzP1P0e7x1qOWg5x6rnzTavwIhAOUVEY/D6JoACHZVxuPLfVO858hneGA3WVzXEI3p3qqN"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.5_1579713976795_0.5551769684722094"},"_hasShrinkwrap":false},"3.0.0-alpha.6":{"name":"wingbot-facebook","version":"3.0.0-alpha.6","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-mocha":"^0.5.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsdoc":"^4.8.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-mocha":"^5.3.0","eslint-plugin-react":"^7.13.0","jsdoc-to-markdown":"^5.0.0","mocha":"^6.1.4","nyc":"^14.1.1","sinon":"^7.3.2","wingbot":"^3.0.0-alpha.11"},"dependencies":{"fast-deep-equal":"^2.0.1","request":"^2.85.0","request-promise-native":"^1.0.5"},"peerDependencies":{"wingbot":"^3.0.0-alpha.11"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"a35dc5b09c89dea662b1c1c1a7880a7c29126b28","_id":"wingbot-facebook@3.0.0-alpha.6","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-k68OU91wY2e0y0UjvyM6JspDO8KphQMyXVd5KchHfEe0CGcCEnE/rBxrqpBTCa6cXKwgBUjipHSOlGMYn4w8jg==","shasum":"88d11cf534ad835eb53fe18b30e875553c5895a1","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.6.tgz","fileCount":16,"unpackedSize":90965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeKIiyCRA9TVsSAnZWagAAOHEP/iSnjcRQONKDMVIVsdxg\ndvKjxnBSVS9PITwY9jj6Dr4Txue/5VtgUZjTSRiKPiKc8wJDBu/CAtvX/t4t\nNe8AxOQmVTbCIx+ynM1zuXX3YOAXGVmQVqMT68oJBtdGlfBIF/x25dyW3hcX\nqLNbqvRiRuhTf6AktkM89qwCiw5iTpd9CdsI3r4+3+P3IswazrgupI9/k4F5\nRnKMauKBMbwpAInbSvhdl1nO0Jdg6uXIFCxfT6qfj/7NFqpPYhKCn7Od9rhy\nsBPfUVRLZfQQaIWhA4VLEIQCHNYwzo1mxu76oT7aOZnkaMkYZjDN1A+843nB\n7GcUy4qdSBLfUobeB9+9HGZJBWrw70N13O6WRval9JyE6aWK3xEq6SkLozXD\n8t39QAkAyf9X4fi8Cgs5U61Y3ukD8n6RCLouv3ETgrzcZXzPnN9t77DS6bQt\noPQ6oM8HIZpL780EJTPcNwFq1wgxCQEoKBLmllPDINDR27uk/XHCAqxZcPbx\n7iU0gM+WJ1puuz25jFnE66wY6e8ydE1zqfIqtQkpR8PJ/coNTon9+vUmlRb9\n0CXEkK/etwXnamMYvzIjOHIcPRLlm78pyLxheTOM5QYZ9pV95eC37jaFHIq9\nC94E1sHmOOyyftGoDJAJnmEb1aSZp3UAcAHAuTppJYn2/NxsXF2796oKKcPZ\nLsTS\r\n=v7fI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEX0i0fPKMYzxo8udOxPPwtdHd0ZcffxKdQwZ+OL8wcdAiEA0e9aj1XOex7lj9kh7fvSd8SMErSfGBJ6thhTufESd3E="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.6_1579714738102_0.5024233128470674"},"_hasShrinkwrap":false},"3.0.0-alpha.7":{"name":"wingbot-facebook","version":"3.0.0-alpha.7","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.24"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.24"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"c0b01b8be0a12a1e6d041c0ab37daa351791ccd6","_id":"wingbot-facebook@3.0.0-alpha.7","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-7bK2zZ5VvC/LLvs0Da+83F+cZuzNBvAqiKJSR1xJZZvFXYDv4NyHLnbszCE0Qv291XLOy6b2SN1pw+JkJVDv3w==","shasum":"0e0cdaade88b7cf9719ae983ad7796fcaf2e6858","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.7.tgz","fileCount":14,"unpackedSize":91568,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeMsOjCRA9TVsSAnZWagAAESAP/3oyCZw4G34lTVeLzxdg\nhLL6sdAQqiB7Z/uEZeLQNUSWVoQ8v8RHiI1SrdZ0/7zak6bdCcJKHI8XttiU\naHHVA6on7vlLyGBu2+g4MfjEC8fGW9szPEk52Z/q2ssPSHxmnuv5ZbeoGU8i\nUBeQD/9JrbVWh0IvLM3holBY2ID7tvP0hwBLH5vlOx1zAWCPwRVKGa87YPI2\nOzwTzZuDr8W2rnE1jtLh1eaTPkAE+KlN8laJXQjWIFIBuAtdp9fNGSjapN2L\n0QGrKlPSp9a9SjPM2WwXHz/E1aEBFnk28A7IICQOjk9Q3eYw/3ALXrCjmjjU\nAwHpO18Fv1sK/imlQzc6IHdoOshPrcduspWHq5AkgaRvGmrdQqjp4yztiIfp\nF6a4cRl8rh203WoWzEQAShBsbHkRdtiFo0lv23MP25tOrQYxct8WT52UGeKe\n/0yKBAknWq+qkPUdIVS/hmCeoKva0NBqssfXPB8o8aUo1V+Dao+2/MMoWMLO\nbsgfdLbyg1WuxNePGXyJmF7qk6Psk3+zuhQnM3USbQFWIbvpw7SalNXIRQAj\nAMh/bMHZ/NEwLTNWuJ0R8fWTN+5ySDpH56PQA/BIQiv1hFDw0ejXzjK8iyVd\n7JNYKT6PE3Y3355GSSkwTPidsU/92Mr/GEzD4vuaWNMOZog6riaL6hdN0L0B\nO3n7\r\n=HVAQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG71Z4dL3D1vkRcdEO3dbJGVnLF84ngH7moImoVjHPYjAiAYB1HVXds1Mkk2M9nH+ZHdoPt9WcCn9oARO2LMTzY84A=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.7_1580385187075_0.7642994302575623"},"_hasShrinkwrap":false},"3.0.0-alpha.8":{"name":"wingbot-facebook","version":"3.0.0-alpha.8","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.24"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.24"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"c0b01b8be0a12a1e6d041c0ab37daa351791ccd6","_id":"wingbot-facebook@3.0.0-alpha.8","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-RQ5+Dw9RYiGcljkLOSwHshVSRmwr/dn3qULw63R0LMsMbgnWpHfkdiHCPT1CXmkCmqzTaWf0KeEJWTh0cI42WA==","shasum":"7d8c5d4b015fc23dce04b2d98c0faf910fe3b375","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.8.tgz","fileCount":14,"unpackedSize":91738,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeOVX1CRA9TVsSAnZWagAA1DcP/iwSTPTEvfyIAwqDEpMX\nZtxc838E2CGjaQs20d7Wl9UqopSBFnA9WbkiTmn7wr7YtGge86oeWeE++pwF\nLj5cBdUHS2ZKrNPR8wCEShqPtP5IKc9jN7DLv/z6McZsCMEC+TQFsMYquIP5\nCjX8hP9k6dtAqsDPh4wLnBEJj1MwX+UEc74u9m37PXoAY8oLfDG/2auHGBIs\nGiT4Fr8NzNyWJW9WKsSfTp4on+EY1eT/Bv1TCC8tc8nW15yIj4FbpXAzsnZ+\nLqC1vOxvuzzmfGyVLSygpSOxCW24pnP3ML59IFTF7H543Wym22aulTP4kiQt\n4WhWPiIsboFqbijsm2m9cXYpXb/2yVAq3NzOUXNAi197FRPIPjyaoykcbJlI\nmCeUGM9qvr2t29l2CnD0zNUQh3ng90uLgYWFlDfGW1v3zWd8D27+/8/HgGsg\nxm9Zl+QdQd5xreQfgAX6TC3wmVZScVl/U+EliBaqij0WXlafK1UOlJedKhgX\nEe/0m9jALObNIXDSe0k5Yg4s4bwgfn9Xtt5hzvSpE7X4Ui2JI87ikoI1gMAn\nn3f14QCJnqYcDRMnZ3Ksc1qrEkwUOu/1uA1lacLDxfh8QZ5HQADzE0lmQfbs\nqidodUDN/5TGqkTT8OKsuva2t22Dv3noISjznc+9wDdZ8dQSy16WPibLAKl3\ng9vb\r\n=aUth\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDV9xI98sm/CUcXoz8fsOc+PhfNIZWY2s2RPsI8hY+lLQIgSjhhQ56d+sZzTS2AuFEAzPNqI0X9LhnOKYe6ACL1KXs="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.8_1580815860654_0.7639822638209186"},"_hasShrinkwrap":false},"3.0.0-alpha.9":{"name":"wingbot-facebook","version":"3.0.0-alpha.9","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.24"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.24"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"a049761a9d116ef59e03cf147b20998399e959f7","_id":"wingbot-facebook@3.0.0-alpha.9","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-eTZV0eK9Tb+cv3LNzqrS+u/9G6h3y46xCfIMQODoJ8O3EqZxPNNh17UcLyhkTER2kGbvcSLmVPipSTc7j3zcaA==","shasum":"ce3788a4c16f7dbad51fff3c3c865d2b9228edbd","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.9.tgz","fileCount":14,"unpackedSize":92482,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeU86jCRA9TVsSAnZWagAAWFEP/ik4uP5IcgDuct+fT+mn\nPN/CIoLA0gCevpENX1brofMA6/rvYQCZrM1PgWwfq2s8uO7uvDaVszU3qXs6\nIYbCBykEZpUj8YsXd6jAq52waAUdaHtv+SKYu4KomLzdylPXJ18rxq+Kdzgz\npYnxhZPuPMsH4Zu1XuEA5uN8TyIKR8/WLfiArReCtxtTeF1mc4HX9wRBdt0K\n1FbSsxDJm+Ui9VPkeTRQCNawccTNAHh2w4tyzvb4srvXAbr2+xwA5yb3dij9\n/X34/ybhpjmQfS3Fc7GNiaQ82YsHLDp7RIUbTT9QhIfDPO2yEUX5FvAzBB/P\nbt4agS1V+NaZ1jK4PGe2cIJTNslIR3MErR0m1Rf6ff4ij6oLOfQ/GK9WiRbi\njpSjaITbZUrwYMdw2CTflu6e93482hgCOxv3ctdZjE56p3jBS2X3mNGkLelJ\nIMedh86D3if/Ho3Fc74TvMsNC8qck4a9nNGdP0wZTSZrRZ3YDLqOQf6vgwSd\nCA4KOtFe1/OxEoKysP2YzRJdN6xJADY68glvfLnoq5v6S6fSXkR0Nt8DYZob\n1ruOVy+g+bO7uXZTVIh2RwjTUIHdWXOG+oyT5y/T6quPzr8JQwqA7AWZ0z8W\n+E9BTo/Zr1KpzlrWMYrK0xqpF3C/USWLMdNylEuJjPH+5eEeRYJjxDsq2YWS\n2DJz\r\n=8THw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEK1MkF+WT1Pb/4WgdZS+wq3lL4f7oMKVI2O2k01BIIYAiEAssmKuXrC/kjSdzQh54AqIVLsIoNk2YfbTFvWsccc1XE="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.9_1582550691469_0.3022896934480992"},"_hasShrinkwrap":false},"3.0.0-alpha.10":{"name":"wingbot-facebook","version":"3.0.0-alpha.10","description":"Facebook messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.34"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.34"},"readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>Object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class\n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body)](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>Object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>Object</code> |\n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> |\n| headers | <code>Object</code> |\n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>Object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body) ⇒ <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)\n**Returns**: <code>Promise.&lt;Array.&lt;{message:Object, pageId:string}&gt;&gt;</code> - - unprocessed events\n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>Object</code> | event body |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class\n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>Object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**\n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> |\n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n**Example**\n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)\n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class\n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  |\n| [isTopLevel] | <code>boolean</code> | <code>true</code> |\n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n| action | <code>string</code> |\n| [data] | <code>Object</code> |\n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  |\n| url | <code>string</code> |  |\n| [hasExtension] | <code>boolean</code> | <code>false</code> |\n| [webviewHeight] | <code>string</code> | <code>null</code> |\n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> |\n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)\n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> |\n| [inputDisabled] | <code>boolean</code> | <code>false</code> |\n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function\n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> |\n| [logger] | <code>console</code> |\n\n**Example**\n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>Object</code>\n**Kind**: global typedef\n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> |\n| saveAttachmentId | <code>function</code> |\n\n","readmeFilename":"README.md","gitHead":"fcb9407802285e382623c66c99a3c167f308ac28","_id":"wingbot-facebook@3.0.0-alpha.10","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-+oWdspjydsFnUh/1wTjVedflWAncJbVbPuerhhA3MktDYBla1aKT3RgmmFXUVRa7Rj2PzHT1/sSCl8WeH6n5jg==","shasum":"f2a94ae005d5faac3c2eda0a37909b42fa390d70","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0-alpha.10.tgz","fileCount":14,"unpackedSize":93736,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXUA5CRA9TVsSAnZWagAA7ZIP/RYgDuDD2bfd1ZGu8q8L\n8HcZO6poknX/0ACNYVJUA3bfeH1NBQ+mdZF0V2pvW4lNVhYK+f3I2o8+fL/C\n1lapAk0Z4v4cvK+rF0uj9tHThYqpoFBh384/SEwSG0Lozudl9JAeXJ4RJiZJ\nkDHdFF4Np15BsDd9zi+lDM8k95Yi5qVcZSrzs2tVJ/VW309yGNVb6HPvv+8n\nujloiNROUfonCzZ/a5rA1mH3FUO6hQBLxfEJuNFBK6riOXXhsJp3q3UwDUWI\nhh0/LsLp4wvqguHa+Ii3iyGvZyxXuJ5VTzTyTHXt+upDbd571hBQ8i/QCEwh\nvSLhu7WjkQG6uMXmtErQRnsT4s4/h2Auwv7VrDomROkJY32L/JfQ6xr/xU9O\nUTi51d10AEvUvSvrI4k/YLKjyHvKIYGpLEaxnuHseGOF9EagLtLLaShO6OpR\nJOYiatoniWZ0OMpfJHiiahF52w8Zsdr77wtQGiGgmpTAdi9BgvlnGs/JrRoy\n623Cbqxcu475WXvmaG3mpV3KaocYlwsTVPMOJShCsLZCko1FKG7twYHCqV1H\nbMj0ZP4EPAuTTA6BXqvCPQFDTzyChZkfjjkVyE3Rx0N/13Ob/N7PWXBTOFKK\nrVFK1haixcTYtlkrvIQADaG6forGry2hBmks7Ak/NYGg/0u4qtxfmWIPec8c\n8nPZ\r\n=+hQ3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAVnmWYTBR9d6XC6AGjlSwBNzpT6tKI0rcmLIQRnWXDzAiBQNCaRzxtxs8PDXtk203Dmw/dy4Ls8BKIy0pgbVZEsIg=="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0-alpha.10_1583169593297_0.640323405439482"},"_hasShrinkwrap":false},"3.0.0":{"name":"wingbot-facebook","version":"3.0.0","description":"Facebook Messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.34"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.34"},"gitHead":"a7b5d79e2b032d245f8c6dfce1a647e3ace32cfa","_id":"wingbot-facebook@3.0.0","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-D2TxoPDcjnJ76wbQDZ579uyileuCuuLfn0bV+8477AQ+1u4e9A585FyqAveNCANz1uJx+r8VTtQP78hnC5IwzQ==","shasum":"215607a6d716dbef4558cf0e03e375677d702082","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.0.tgz","fileCount":14,"unpackedSize":94133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZk5gCRA9TVsSAnZWagAABjYP/3CtS7QK7psxXyd/iJMy\n7rzBnkQ8FW4cfE9IaZONSJVi/FTMeNTuB+LKp9DbLWA89d9ZmD1QJdt0+hjs\nkTI9LxVDmQfaun6/q4oQlr1I2nUiYds/K+l0Uv6Dvqx7WQF4wUrtUajfJ4Mk\nK/olUtfQu/Boskvm8J4lvj5UD9k3HVpZVzzKrD5kcwnkWBAZaYSW+gdnqMSd\nkYA0RS0CsS2LOJDbleiZHfq34dMpFaFlIcBC2v7/PL7Qft3ZdvbxGrmCPl56\nGY/+/s7ECzUMtiZHBAMTo4xcPabYFhHy9mKkQ4EtzlaHW6G83E88Lt4o+LM9\nUtvYjWF6FQ3+zoW2vi/FRFIA5b5ntffw6WZnLdTB5R8JlGnkEUkzipNqDhs3\n9Msqe1QE9CQBpQnoPMye2cwmRV2AX0t2I5zgz2d5NhsVXTk7fLqQSnRPJZp/\nEKCfbQv8I3kTKiVoeDjgQyYcNdcCEmxbr+A5zJOXCGOqGWpZ83sXntS6lzAU\nK67UPoRY6BMBcK1g7sumjlOUmZOcZNpdSBs6ORJFqW1SvTgKPlI+67tjOxzq\nBLIf4W/f8DnKWNou429fC/AlLFBxsw3VS4hSPOzxz3siaImmKsOMKtF5qQfu\nkiLsPyvZ4rr04T1BXTKUt1riNRWhrYVOhsldGwk0NkSditSOvUbmNV6ty7EN\nKbi0\r\n=LFic\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgdhOH165SX7v+CBjBKbGEszenCajC4LzMvMqwvmX9JAIhAJoa58pBMH3qWLms6GDLfA5ldR2/LifCDITEGMJ61e4r"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.0_1583763040142_0.28633943989312294"},"_hasShrinkwrap":false},"3.0.1":{"name":"wingbot-facebook","version":"3.0.1","description":"Facebook Messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.34"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.34"},"gitHead":"a7b5d79e2b032d245f8c6dfce1a647e3ace32cfa","_id":"wingbot-facebook@3.0.1","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-VfQIv9PwM9dy7WXWJbjDu5hfQ9Uy8pNmlLOJLHko9HGaL81KKFoFtY9xbJuGiUxd7pEOyUw7qwKKab1B0P96rg==","shasum":"b38a26eff150010bc8c6729ae553e74995d88c20","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.0.1.tgz","fileCount":14,"unpackedSize":94124,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJebLGECRA9TVsSAnZWagAA6mcQAIbODkq2KOj6H8/ZQCuN\nmDpCIfYJJxnlF/g65uWTzwjBWebNGO6lEhMR8JMq1RCtS9cYLV5MFQOT3bKg\nOgJK8sYHQ9ZV9M7c2LqM1W/h3QTSPlt25dfdMs559p9Jrs5rb67eYj7G+Rf+\nl7yat5qVC2Ke6htHatErbDFDlgAmSS6+ofjdShUO0iWNMqTMMHekVuzLzej7\nbN8kkQqOdPO2pSikCHSn+oUhNXpE8/VjtH1rCp2fyPhcR02xDs1oMWIHchgY\nzfTjyMOwi58QyzqCkmlcR3/lu8OIfj61BuTD2C7GIJWPkxdxeEVtV4PEAdWg\nbe9bm0iHVll7VzfNb87tICech0NoBG8uItpVOtxVwJvK2ungV91xPJ4vCZ/e\nh794pwkuY5LxhfO8fZ5l2CvkVDjP+i4qCDgVVs3JmiHhkXrIqnU8qoxOM3Ew\ngscQn79Pqo168hXN3EB+6I5LSSKzxt1+zj8C1UDbpTSiYKCFsPNeBBSdsYFn\nK8n55wH5el547dcNcflHUM7tupMmkNG7+XpMmOoDNbgbLyrmmqlxb1v7F0Js\nOBXahzfcJczgAuRfe+DAwUCDN6LUJPkF56Mvr0zTeqhvYgOALvQfzVjHCKX1\nOW2sfgqIlABv21Gu8eoqt1YTL5GgiGhjCxwqOvJWYjVrkiO0y85a+Ky/Aq8A\nhPaK\r\n=+kdJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVWOYbrhTMf0tKdBr5boAaBjNTs7mCUfnjEMzpgRKkiwIhAKWx16/5bjeoYot1EhX9v6D5anR9WjAvTx4sMuERwDxX"}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.0.1_1584181635440_0.06237707371240053"},"_hasShrinkwrap":false},"3.1.0":{"name":"wingbot-facebook","version":"3.1.0","description":"Facebook Messenger plugin for wingbot","main":"src/main.js","scripts":{"test":"npm run test:lint && npm run test:coverage && npm run test:coverage:threshold","test:unit":"mocha ./test/**/*.test.js","test:unit:watch":"npm run test:unit -- --watch","test:coverage":"nyc --reporter=html mocha --opts ./test/mocha.opts ./test && nyc report","test:coverage:threshold":"nyc check-coverage --lines 80 --functions 80 --branches 75","test:lint":"eslint ./src/**/*.js ./bin/**/*.js ./test/**/*.js ","doc":"node ./bin/makeApiDoc.js"},"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"keywords":["wingbot","messenger","chatbot","framework","facebook"],"author":{"name":"wingbot.ai"},"license":"MIT","engines":{"node":"^8.0.0"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"homepage":"https://github.com/wingbotai/wingbot-facebook#readme","devDependencies":{"chai":"^4.2.0","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-mocha":"^0.7.3","eslint-plugin-import":"^2.20.0","eslint-plugin-jsdoc":"^21.0.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-mocha":"^6.2.2","eslint-plugin-react":"^7.18.0","jsdoc-to-markdown":"^5.0.3","mocha":"^7.0.1","nyc":"^15.0.0","sinon":"^8.1.1","wingbot":"^3.0.0-alpha.34"},"dependencies":{"fast-deep-equal":"^3.1.1","request":"^2.88.0","request-promise-native":"^1.0.8"},"peerDependencies":{"wingbot":"^3.0.0-alpha.34"},"gitHead":"a7b5d79e2b032d245f8c6dfce1a647e3ace32cfa","_id":"wingbot-facebook@3.1.0","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-bA3OrtRP6iP0B2z80AC3rvuIWpxQATOMoxsh2dXQDb4WNWQ3blv7Y3ujF9aeBV6cCzdUIEOFGfn5LeshgyUXYw==","shasum":"1434fa7c21b580ddd7d6b48d48504f0ad98e0a88","tarball":"https://registry.npmjs.org/wingbot-facebook/-/wingbot-facebook-3.1.0.tgz","fileCount":14,"unpackedSize":94544,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJehE8TCRA9TVsSAnZWagAAfvIP/1Sa7y9+QtDgzRF+wSgP\nUA7rkJpuYTdflMRSrlCZJkSbLWU/XRYyzsrmUarg4hNjtnDnyr1cMGwy12at\nER8teG7XkiRFUbk5b4L06K0MskyyJxdSZijNwWMD3V/7zQSZXREP5iru+u7R\nPjC4as/vZxS7cqsHSjA2lx7GNn/jRgjgZ/KW6MqQYTEtOyYD+TsvcW2dl8+6\nNnMnVyo8Mdtzg5jC+VacEAZHOkUXYslehauJEhmH9VS0wkSlRqtA7BBh+25j\nfQJRC/4rXWKPq7f/3+xFPQz4Z4wdrrSrJYu0j6x5vYyLk86NMSWAp9VYaQay\nSs8F0W4z4jqyzlUOkMvr+dtKfqhGVrilxEAAhfncqg6fyOcDtbmyx0rzZ9ep\nQa85jesevTtyWcB8KtfKvkKM4BzNJCDe5SbPcFSaSbRZH4KvsIZSTMICF7Ie\naOWLul2PsrRerbLr44Iux7i+EFhI+LerwwHezuKrF4aL2Iu+NXishN/XcvCU\nBJCv1lElnlnsNfww9lqWLmzbo1eCKFYAjLw8lD8mK43xCT7N4Io0z4M3nf2p\nI07GV5qVgtFrNjiNEnrRb+ce/UZsRtV+1svJ3QZoS9pEV+XoP6nYpQBNDYxf\n6HaN7qMN6EegJUnkpJRzZagbtIrafTpmxSr3fwP1g5QX+ROFmtNVGSJIsyJR\n7MJX\r\n=zaNA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCoExSkXf9zjgWe3B3Uu1OGPLbWtSdE3uAnGj0kq5Q15QIgNaB6GXBokN9lblz0WwHjtaflGcAiMGtNBEI4mc/dr/s="}]},"maintainers":[{"name":"wingbot.ai","email":"david.menger@wingbot.ai"}],"_npmUser":{"name":"wingbot.ai","email":"david.menger@wingbot.ai"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wingbot-facebook_3.1.0_1585729299090_0.9258772651755645"},"_hasShrinkwrap":false}},"time":{"created":"2018-04-17T20:54:09.320Z","1.0.0-alpha.1":"2018-04-17T20:54:09.427Z","modified":"2022-05-24T12:58:55.517Z","1.0.0":"2018-05-25T09:40:59.497Z","1.0.1":"2018-05-27T13:52:14.142Z","1.1.0-alpha.1":"2018-06-12T08:37:10.429Z","1.1.0":"2018-06-13T07:27:42.096Z","1.2.0-alpha.1":"2018-08-08T11:28:39.586Z","1.2.0":"2018-10-09T17:31:30.345Z","2.0.0-alpha.1":"2018-11-02T20:45:45.730Z","2.0.0":"2018-11-12T14:14:01.657Z","2.1.0":"2018-11-13T14:46:51.164Z","2.1.1":"2019-01-07T09:21:58.521Z","2.1.2":"2019-01-21T18:36:20.562Z","2.1.3":"2019-01-21T18:41:29.078Z","2.1.4":"2019-01-21T18:51:36.203Z","2.1.5":"2019-01-21T18:54:39.227Z","2.5.0-alpha.1":"2019-01-24T13:47:13.455Z","2.5.0-alpha.2":"2019-01-24T14:13:45.832Z","2.5.0-alpha.3":"2019-01-28T14:43:27.615Z","2.5.0-alpha.4":"2019-01-28T14:48:18.713Z","2.5.0":"2019-01-29T18:07:52.188Z","2.5.1":"2019-02-11T08:02:29.228Z","2.5.2":"2019-02-20T14:02:05.298Z","2.5.3":"2019-03-26T08:36:46.271Z","2.6.0":"2019-05-06T13:46:45.983Z","2.10.0":"2019-05-14T14:26:58.075Z","2.10.1":"2019-08-07T16:51:04.322Z","2.11.0":"2019-09-16T17:16:10.066Z","2.12.0-alpha.1":"2019-09-23T15:25:51.693Z","2.12.0":"2019-09-24T11:26:04.217Z","2.12.1":"2019-09-28T15:52:56.964Z","2.12.2":"2019-10-02T17:15:20.830Z","3.0.0-alpha.1":"2019-12-03T12:27:09.200Z","3.0.0-alpha.2":"2019-12-17T12:39:00.721Z","3.0.0-alpha.3":"2019-12-17T14:21:23.789Z","2.12.3":"2019-12-17T14:22:44.932Z","3.0.0-alpha.4":"2020-01-18T19:20:31.553Z","3.0.0-alpha.5":"2020-01-22T17:26:16.947Z","3.0.0-alpha.6":"2020-01-22T17:38:58.216Z","3.0.0-alpha.7":"2020-01-30T11:53:07.303Z","3.0.0-alpha.8":"2020-02-04T11:31:00.814Z","3.0.0-alpha.9":"2020-02-24T13:24:51.607Z","3.0.0-alpha.10":"2020-03-02T17:19:53.472Z","3.0.0":"2020-03-09T14:10:40.285Z","3.0.1":"2020-03-14T10:27:15.611Z","3.1.0":"2020-04-01T08:21:39.435Z"},"maintainers":[{"email":"david.menger@wingbot.ai","name":"wingbot.ai"},{"email":"zdehasek@protonmail.com","name":"zdehasek"}],"description":"Facebook Messenger plugin for wingbot","homepage":"https://github.com/wingbotai/wingbot-facebook#readme","keywords":["wingbot","messenger","chatbot","framework","facebook"],"repository":{"type":"git","url":"git+ssh://git@github.com/wingbotai/wingbot-facebook.git"},"author":{"name":"wingbot.ai"},"bugs":{"url":"https://github.com/wingbotai/wingbot-facebook/issues"},"license":"MIT","readme":"# Facebook Messenger plugin for wingbot\n\nConnector plugin for wingbot chatbot framework\n\n## Advanced features\n\n### Transfering action as a metadata of handover event\n\nYou can include a full JSON Action string to run a certain interaction in your bot using metadata in a handover event.\n\n```json\n{\n  \"sender\":{\n    \"id\":\"<PSID>\"\n  },\n  \"recipient\":{\n    \"id\":\"<PAGE_ID>\"\n  },\n  \"timestamp\":1458692752478,\n  \"pass_thread_control\":{\n    \"new_owner_app_id\":\"123456789\",\n    \"metadata\":\"{\\\"action\\\":\\\"your-action\\\",\\\"data\\\":{}}\"\n  }\n}\n```\n\n-----------------\n\n# API\n## Classes\n\n<dl>\n<dt><a href=\"#Facebook\">Facebook</a></dt>\n<dd></dd>\n<dt><a href=\"#Settings\">Settings</a></dt>\n<dd></dd>\n<dt><a href=\"#MenuComposer\">MenuComposer</a></dt>\n<dd></dd>\n</dl>\n\n## Functions\n\n<dl>\n<dt><a href=\"#userLoader\">userLoader(pageToken, [logger])</a></dt>\n<dd><p>User loader middleware</p>\n</dd>\n</dl>\n\n## Typedefs\n\n<dl>\n<dt><a href=\"#AttachmentCache\">AttachmentCache</a> : <code>object</code></dt>\n<dd></dd>\n</dl>\n\n<a name=\"Facebook\"></a>\n\n## Facebook\n**Kind**: global class  \n\n* [Facebook](#Facebook)\n    * [new Facebook(processor, options, [senderLogger])](#new_Facebook_new)\n    * [.verifyWebhook(queryString)](#Facebook+verifyWebhook) ⇒ <code>string</code>\n    * [.verifyRequest(body, headers)](#Facebook+verifyRequest) ⇒ <code>Promise</code>\n    * [.processMessage(message, senderId, pageId, data)](#Facebook+processMessage) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n    * [.processEvent(body, [data])](#Facebook+processEvent) ⇒ <code>Promise.&lt;Array.&lt;{message:object, pageId:string}&gt;&gt;</code>\n\n<a name=\"new_Facebook_new\"></a>\n\n### new Facebook(processor, options, [senderLogger])\n\n| Param | Type | Description |\n| --- | --- | --- |\n| processor | <code>Processor</code> |  |\n| options | <code>object</code> |  |\n| options.pageToken | <code>string</code> | facebook page token |\n| options.appId | <code>string</code> | facebook app id |\n| [options.botToken] | <code>string</code> | botToken for webhook verification |\n| [options.appSecret] | <code>string</code> | provide app secret to verify requests |\n| [options.passThreadAction] | <code>string</code> | trigger this action for pass thread event |\n| [options.takeThreadAction] | <code>string</code> | trigger this action for take thread event |\n| [options.requestThreadAction] | <code>string</code> | trigger this action when thread request |\n| [options.throwsExceptions] | <code>boolean</code> | allows processEvents method to thow exception |\n| [options.apiUrl] | <code>string</code> | override Facebook API url |\n| [options.attachmentStorage] | [<code>AttachmentCache</code>](#AttachmentCache) | cache for reusing attachments |\n| [options.requestLib] | <code>function</code> | request library replacement |\n| [senderLogger] | <code>console</code> | optional console like chat logger |\n\n<a name=\"Facebook+verifyWebhook\"></a>\n\n### facebook.verifyWebhook(queryString) ⇒ <code>string</code>\nVerifies Bots webhook against Facebook\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when the request is invalid\n\n\n| Param | Type |\n| --- | --- |\n| queryString | <code>object</code> | \n\n<a name=\"Facebook+verifyRequest\"></a>\n\n### facebook.verifyRequest(body, headers) ⇒ <code>Promise</code>\nVerify Facebook webhook event\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Throws**:\n\n- <code>Error</code> when x-hub-signature does not match body signature\n\n\n| Param | Type |\n| --- | --- |\n| body | <code>Buffer</code> \\| <code>string</code> | \n| headers | <code>object</code> | \n\n<a name=\"Facebook+processMessage\"></a>\n\n### facebook.processMessage(message, senderId, pageId, data) ⇒ <code>Promise.&lt;{status:number}&gt;</code>\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| message | <code>object</code> | wingbot chat event |\n| senderId | <code>string</code> | chat event sender identifier |\n| pageId | <code>string</code> | channel/page identifier |\n| data | <code>object</code> | contextual data (will be available in res.data) |\n| [data.appId] | <code>string</code> | possibility to override appId |\n\n<a name=\"Facebook+processEvent\"></a>\n\n### facebook.processEvent(body, [data]) ⇒ <code>Promise.&lt;Array.&lt;{message:object, pageId:string}&gt;&gt;</code>\nProcess Facebook request\n\n**Kind**: instance method of [<code>Facebook</code>](#Facebook)  \n**Returns**: <code>Promise.&lt;Array.&lt;{message:object, pageId:string}&gt;&gt;</code> - - unprocessed events  \n\n| Param | Type | Description |\n| --- | --- | --- |\n| body | <code>object</code> | event body |\n| [data] | <code>object</code> | event context data |\n\n<a name=\"Settings\"></a>\n\n## Settings\n**Kind**: global class  \n\n* [Settings](#Settings)\n    * [new Settings()](#new_Settings_new)\n    * _instance_\n        * [.greeting([text])](#Settings+greeting) ⇒ <code>Promise</code>\n        * [.getStartedButton([payload])](#Settings+getStartedButton) ⇒ <code>Promise</code>\n        * [.whitelistDomain(domains)](#Settings+whitelistDomain) ⇒ <code>Promise</code>\n        * [.noMenu()](#Settings+noMenu) ⇒ <code>Promise</code>\n        * [.menu([locale], [inputDisabled])](#Settings+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * _static_\n        * [.Settings](#Settings.Settings)\n            * [new Settings(token, [log], [req])](#new_Settings.Settings_new)\n\n<a name=\"new_Settings_new\"></a>\n\n### new Settings()\nUtility, which helps us to set up chatbot behavior\n\n<a name=\"Settings+greeting\"></a>\n\n### settings.greeting([text]) ⇒ <code>Promise</code>\nSets or clears bot's greeting\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [text] | <code>string</code> | <code>false</code> | leave empty to clear |\n\n<a name=\"Settings+getStartedButton\"></a>\n\n### settings.getStartedButton([payload]) ⇒ <code>Promise</code>\nSets up the Get Started Button\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default | Description |\n| --- | --- | --- | --- |\n| [payload] | <code>string</code> \\| <code>object</code> | <code>false</code> | leave blank to remove button, or provide the action |\n\n**Example**  \n```javascript\nconst settings = new Settings(config.facebook.pageToken);\nsettings.getStartedButton('/start'); // just an action\n```\n<a name=\"Settings+whitelistDomain\"></a>\n\n### settings.whitelistDomain(domains) ⇒ <code>Promise</code>\nUseful for using facebook extension in webviews\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type |\n| --- | --- |\n| domains | <code>string</code> \\| <code>Array.&lt;string&gt;</code> | \n\n<a name=\"Settings+noMenu\"></a>\n\n### settings.noMenu() ⇒ <code>Promise</code>\nDrops the menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n<a name=\"Settings+menu\"></a>\n\n### settings.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nSets up the persistent menu\n\n**Kind**: instance method of [<code>Settings</code>](#Settings)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n**Example**  \n```javascript\nconst { Settings } = require('wingbot');\n\nconst settings = new Settings('page-token-string');\n\nsettings\n     .menu('fr_FR')\n         .addNested('Nested Menu')\n             .addUrl('Aller à google', 'https://google.com')\n             .done()\n         .addPostBack('Faire quelque chose', '/the/action')\n     .menu() // the default menu\n         .addNested('Nested Menu')\n             .addUrl('Go to google', 'https://google.com')\n             .done()\n         .addPostBack('Do something', '/the/action')\n     .done();\n```\n<a name=\"Settings.Settings\"></a>\n\n### Settings.Settings\n**Kind**: static class of [<code>Settings</code>](#Settings)  \n<a name=\"new_Settings.Settings_new\"></a>\n\n#### new Settings(token, [log], [req])\nCreates an instance of Settings.\n\n\n| Param | Type | Description |\n| --- | --- | --- |\n| token | <code>string</code> |  |\n| [log] | <code>Object</code> |  |\n| [req] | <code>function</code> | request library for resting purposes |\n\n<a name=\"MenuComposer\"></a>\n\n## MenuComposer\n**Kind**: global class  \n\n* [MenuComposer](#MenuComposer)\n    * [new MenuComposer(onDone, [isTopLevel])](#new_MenuComposer_new)\n    * [.addPostBack(title, action, [data])](#MenuComposer+addPostBack) ⇒ <code>this</code>\n    * [.addUrl(title, url, [hasExtension], [webviewHeight])](#MenuComposer+addUrl) ⇒ <code>this</code>\n    * [.addNested(title)](#MenuComposer+addNested) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n    * [.done()](#MenuComposer+done) ⇒ <code>this</code> \\| <code>Promise</code>\n    * [.menu([locale], [inputDisabled])](#MenuComposer+menu) ⇒ [<code>MenuComposer</code>](#MenuComposer)\n\n<a name=\"new_MenuComposer_new\"></a>\n\n### new MenuComposer(onDone, [isTopLevel])\n\n| Param | Type | Default |\n| --- | --- | --- |\n| onDone | <code>function</code> |  | \n| [isTopLevel] | <code>boolean</code> | <code>true</code> | \n\n<a name=\"MenuComposer+addPostBack\"></a>\n\n### menuComposer.addPostBack(title, action, [data]) ⇒ <code>this</code>\nAdd postback to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n| action | <code>string</code> | \n| [data] | <code>object</code> | \n\n<a name=\"MenuComposer+addUrl\"></a>\n\n### menuComposer.addUrl(title, url, [hasExtension], [webviewHeight]) ⇒ <code>this</code>\nAdd webview to menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| title | <code>string</code> |  | \n| url | <code>string</code> |  | \n| [hasExtension] | <code>boolean</code> | <code>false</code> | \n| [webviewHeight] | <code>string</code> | <code>null</code> | \n\n<a name=\"MenuComposer+addNested\"></a>\n\n### menuComposer.addNested(title) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nAdd Nested menu component\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type |\n| --- | --- |\n| title | <code>string</code> | \n\n<a name=\"MenuComposer+done\"></a>\n\n### menuComposer.done() ⇒ <code>this</code> \\| <code>Promise</code>\nFinish the menu\n\nLast call of \"done\" returns a promise\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n<a name=\"MenuComposer+menu\"></a>\n\n### menuComposer.menu([locale], [inputDisabled]) ⇒ [<code>MenuComposer</code>](#MenuComposer)\nFinish the menu for the locale and starts a new menu\n\n**Kind**: instance method of [<code>MenuComposer</code>](#MenuComposer)  \n\n| Param | Type | Default |\n| --- | --- | --- |\n| [locale] | <code>string</code> | <code>&quot;default&quot;</code> | \n| [inputDisabled] | <code>boolean</code> | <code>false</code> | \n\n<a name=\"userLoader\"></a>\n\n## userLoader(pageToken, [logger])\nUser loader middleware\n\n**Kind**: global function  \n\n| Param | Type |\n| --- | --- |\n| pageToken | <code>string</code> | \n| [logger] | <code>console</code> | \n\n**Example**  \n```javascript\nconst { userLoader } = require('wingbot-facebook');\n\nbot.use(userLoader('<page token here>'));\n\nbot.use((req, res) => {\n    const {\n        firstName,\n        lastName,\n        profilePic,\n        locale,\n        gender\n    } = req.state.user;\n\n    res.text(`Hello ${firstName}!`);\n});\n```\n<a name=\"AttachmentCache\"></a>\n\n## AttachmentCache : <code>object</code>\n**Kind**: global typedef  \n**Properties**\n\n| Name | Type |\n| --- | --- |\n| findAttachmentByUrl | <code>function</code> | \n| saveAttachmentId | <code>function</code> | \n\n","readmeFilename":"README.md"}