{"analyzedAt":"2022-10-29T07:25:42.306Z","collected":{"metadata":{"name":"@api3/airseeker","scope":"api3","version":"0.5.0","description":"A tool to update beacons with signed responses from remote Airnode gateways","date":"2022-10-28T07:37:38.228Z","publisher":{"username":"aquarat","email":"blue@aquarat.co.za"},"maintainers":[{"username":"amarthadan","email":"kimle.michal@gmail.com"},{"username":"aquarat","email":"blue@aquarat.co.za"},{"username":"bbenligiray","email":"bbenligiray@gmail.com"},{"username":"andreogle","email":"ogleandre@gmail.com"}],"repository":{"type":"git","url":"git+https://github.com/api3dao/airseeker.git"},"links":{"npm":"https://www.npmjs.com/package/%40api3%2Fairseeker","homepage":"https://github.com/api3dao/airseeker#readme","repository":"https://github.com/api3dao/airseeker","bugs":"https://github.com/api3dao/airseeker/issues"},"license":"MIT","dependencies":{"@api3/airnode-abi":"^0.8.0","@api3/airnode-node":"^0.8.0","@api3/airnode-protocol":"^0.8.0","@api3/airnode-protocol-v1":"^0.8.0","@api3/airnode-utilities":"^0.8.0","@api3/airnode-validator":"^0.9.0","@api3/promise-utils":"^0.3.0","axios":"^1.1.3","ethers":"^5.7.2","lodash":"^4.17.21","promise.any":"^2.0.4","source-map-support":"^0.5.21","zod":"^3.17.3"},"devDependencies":{"@api3/operations":"^0.0.1-3aab393e33bda1f02a58538f8427e38cbb9d526e","@api3/airnode-admin":"0.8.0","@nomiclabs/hardhat-ethers":"^2.2.0","@types/express":"^4.17.13","@types/jest":"^28.1.6","@types/lodash":"^4.14.186","@types/node":"^18.11.5","@types/promise.any":"^2.0.0","@types/serverless":"^3.12.8","@types/prompts":"^2.0.14","@typescript-eslint/eslint-plugin":"^5.40.1","@typescript-eslint/parser":"^5.40.0","cross-env":"^7.0.3","eslint":"^8.25.0","eslint-plugin-functional":"^4.4.1","eslint-plugin-import":"^2.26.0","eslint-plugin-jest":"^27.1.3","express":"^4.18.1","hardhat":"^2.12.0","husky":"^8.0.1","jest":"^28.1.3","pm2":"^5.2.2","prettier":"^2.7.1","prompts":"^2.4.2","rimraf":"^3.0.2","serverless":"^3.23.0","ts-jest":"^28.0.8","ts-node":"^10.9.1","typescript":"^4.8.4"},"releases":[{"from":"2022-09-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":3},{"from":"2022-07-31T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":3},{"from":"2022-05-02T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":5},{"from":"2021-10-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":6},{"from":"2020-10-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":6}],"hasTestScript":true,"hasSelectiveFiles":true,"readme":"# Airseeker\n\nA tool to update a beacons with signed responses from Airnode's gateway\n\n## Installation\n\n```sh\nyarn install\n```\n\n## Build\n\n```sh\nyarn build\n```\n\n## Configuration\n\nYou need to create a configuration file `config/airseeker.json`. Take a look at `config/airseeker.example.json` for an\nexample configuration file. You can use string interpolation (with `${VAR}` syntax) for providing secrets. Secrets are\nread from the environment variables. Take a look at `config/secrets.example.env` for an example secrets file.\n\n## Deploy\n\n### Credentials\n\nExport AWS credentials in your terminal or ensure your local aws installation is logged in.\n\n### General Airseeker Deployment Notes\n\nThe deployed Airseeker function won't immediately start (due to the scheduler).\n\nThere are two main strategies for dealing with this:\n\n1. Deploy Airseeker and start the new Airseeker immediately using the invoke commands below.\n2. Deploy Airseeker and wait up to 14 minutes for the deployed Airseeker to start.\n\n**Deploy Airseeker:**\n\n```shell\nyarn sls deploy --region us-east-1 --config serverless.aws.yml\n```\n\n**Invoke Airseeker:** (Optional)\n\n```shell\n# Invoke the remote function - this will block until the Lambda times out, so we need to send it to the background and\n# then kill it prematurely. Killing this process does not stop the Lambda from continuing to execute. This command will\n# cause a scenario where two invocation instances of the Airseeker function will overlap temporarily.\nyarn sls invoke --config serverless.aws.yml --function airseeker &\n\n# Store the PID of the previous command in a variable called `pid`\npid=$!\n\n# Wait a bit\nsleep 10;\n\n# Kill the background process\nkill $pid\n```\n\n**Remove Airseeker:**\n\n```shell\nyarn sls remove --config serverless.aws.yml\n```\n\n**Update Airseeker**\n\nIf an Airseeker is already deployed, deploy the new Airseeker using a different service name in `serverless.yaml`, so\nthat both Airseekers can run concurrently. Wait for the new Airseeker to start. Once it does, ensure that you're\nsatisfied that it is functioning correctly (by referring to the target chains and/or CloudWatch logs). You may then\nrevert the name of the service stack to the old Airseeker and remove it or alternatively delete it using the AWS\nCloudFormation console.\n\n### Caveats\n\nSometimes a stack fails to be removed automatically. In these cases navigate to \"Cloud Formation\" in the AWS console and\ncheck the resources tab of the stack in question to see errors. Manually remove those resources.\n\nIn particular AWS will sometimes refuse to delete an associated S3 bucket. Empty the bucket and remove it, then\nre-remove the CloudFormation stack.\n\n## Running Airseeker locally (Optional)\n\n1. For running Airseeker locally you can make use of the pm2 testing services by running this command in a terminal:\n\n   ```shell\n   yarn run dev:testing-services:start\n   ```\n\n   A local ethereum node will be started along with a node.js express server that will return signed data (basically a\n   substitute to the Airnode's signed data gateway).\n\n2. Next step is to run this script:\n\n   ```shell\n   yarn run dev:setup-local-node\n   ```\n\n   This will deploy the DapiServer contract to the local ethereum node and also send funds to a test Airseeker sponsor\n   wallet (used to submit data feed update transactions).\n\n3. Then you might also want to run the following script to create the required testing config files:\n\n   ```shell\n   yarn run dev:create-local-config\n   ```\n\n   You should verify that the DapiServer contract address in the `config/airseeker.json` file matches the address\n   displayed when running the script from the previous step. Secrets are automatically loaded from `config/secrets.env`\n   file when Airseeker is invoked locally.\n\n4. Lastly you need to invoke Airseeker via serverless framework like this:\n\n   ```shell\n   yarn sls invoke local --config serverless.aws.yml -f airseeker\n   ```\n\n5. If you want to stop the testing services after exiting the Airseeker process you can run the following command:\n\n   ```shell\n   yarn run dev:testing-services:stop\n   ```"},"npm":{"downloads":[{"from":"2022-10-28T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":46},{"from":"2022-10-22T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":46},{"from":"2022-09-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":46},{"from":"2022-07-31T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":46},{"from":"2022-05-02T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":46},{"from":"2021-10-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":46}],"starsCount":0},"github":{"starsCount":0,"forksCount":0,"subscribersCount":3,"issues":{"count":297,"openCount":10,"distribution":{"3600":55,"10800":30,"32400":16,"97200":53,"291600":24,"874800":71,"2624400":30,"7873200":17,"23619600":1,"70858800":0,"212576400":0},"isDisabled":false},"contributors":[{"username":"dependabot[bot]","commitsCount":137},{"username":"amarthadan","commitsCount":64},{"username":"vponline","commitsCount":57},{"username":"acenolaza","commitsCount":51},{"username":"Siegrift","commitsCount":32},{"username":"bdrhn9","commitsCount":24},{"username":"aquarat","commitsCount":19},{"username":"bbenligiray","commitsCount":2},{"username":"Ashar2shahid","commitsCount":2}],"commits":[{"from":"2022-10-22T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":8},{"from":"2022-09-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":43},{"from":"2022-07-31T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":112},{"from":"2022-05-02T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":230},{"from":"2021-10-29T00:00:00.000Z","to":"2022-10-29T00:00:00.000Z","count":386}]},"source":{"files":{"readmeSize":4094,"testsSize":129092},"linters":["eslint","prettier"],"outdatedDependencies":{"@api3/airnode-utilities":{"required":"^0.8.0","stable":"0.9.0","latest":"0.9.0"},"@api3/airnode-abi":{"required":"^0.8.0","stable":"0.9.0","latest":"0.9.0"},"@api3/airnode-node":{"required":"^0.8.0","stable":"0.9.0","latest":"0.9.0"},"@api3/airnode-protocol":{"required":"^0.8.0","stable":"0.9.0","latest":"0.9.0"}}}},"evaluation":{"quality":{"carefulness":0.45999999999999996,"tests":0.6,"health":0.5,"branding":0},"popularity":{"communityInterest":12,"downloadsCount":15.333333333333334,"downloadsAcceleration":0.38420852359208524,"dependentsCount":0},"maintenance":{"releasesFrequency":1,"commitsFrequency":1,"openIssues":1,"issuesDistribution":1}},"score":{"final":0.5680682162664066,"detail":{"quality":0.6646684851185201,"popularity":0.053336202088144734,"maintenance":1}}}