From 5dd5d8d3404275b82f05b393c1c4483d2994487d Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:37:55 +0300 Subject: [PATCH 1/7] refactor: stop.js to use onebusaway sdk for API calls --- src/lib/RestAPI/stop.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lib/RestAPI/stop.js b/src/lib/RestAPI/stop.js index 83e93e8..ab285d2 100644 --- a/src/lib/RestAPI/stop.js +++ b/src/lib/RestAPI/stop.js @@ -2,15 +2,19 @@ import { error, json } from '@sveltejs/kit'; import { PUBLIC_OBA_SERVER_URL as baseURL } from '$env/static/public'; import { PRIVATE_OBA_API_KEY as apiKey } from '$env/static/private'; +import onebusaway from 'onebusaway-sdk'; + +const oba = new onebusaway({ + baseURL, + apiKey +}); export default async function (stopID) { - const apiURL = `${baseURL}/api/where/stop/${stopID}.json?key=${apiKey}`; - const response = await fetch(apiURL); + const response = await oba.stop.retrieve(stopID); - if (!response.ok) { - return error(500, 'Unable to fetch arrivals-and-departures-for-stop.'); + if (response.code !== 200) { + error(500, 'Unable to fetch arrivals-and-departures-for-stop.'); } - const data = await response.json(); - return json(data); + return response; } From a750817d4c11e35d98e2c0f03cefb417408ec866 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:38:21 +0300 Subject: [PATCH 2/7] refactor: StopPane component to use onebusaway sdk for API calls --- src/components/oba/StopPane.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/oba/StopPane.svelte b/src/components/oba/StopPane.svelte index 2d7c244..a840b5d 100644 --- a/src/components/oba/StopPane.svelte +++ b/src/components/oba/StopPane.svelte @@ -18,7 +18,9 @@ async function loadData(stopID) { loading = true; + const response = await fetch(`/api/oba/arrivals-and-departures-for-stop/${stopID}`); + if (response.ok) { arrivalsAndDeparturesResponse = await response.json(); arrivalsAndDepartures = arrivalsAndDeparturesResponse.data.entry; From 6f6f14e9e727b66a27111e050d92443fbbd255d6 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:38:38 +0300 Subject: [PATCH 3/7] refactor: Use onebusaway sdk for API calls in arrivalsAndDeparturesForStop.js --- src/lib/RestAPI/arrivalsAndDeparturesForStop.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/lib/RestAPI/arrivalsAndDeparturesForStop.js b/src/lib/RestAPI/arrivalsAndDeparturesForStop.js index 6385625..47237e4 100644 --- a/src/lib/RestAPI/arrivalsAndDeparturesForStop.js +++ b/src/lib/RestAPI/arrivalsAndDeparturesForStop.js @@ -1,17 +1,20 @@ import { error, json } from '@sveltejs/kit'; - import { PUBLIC_OBA_SERVER_URL as baseURL } from '$env/static/public'; import { PRIVATE_OBA_API_KEY as apiKey } from '$env/static/private'; +import onebusaway from 'onebusaway-sdk'; + +const oba = new onebusaway({ + baseURL, + apiKey +}); + export default async function (stopID) { - const apiURL = `${baseURL}/api/where/arrivals-and-departures-for-stop/${stopID}.json?key=${apiKey}`; - const response = await fetch(apiURL); + const response = await oba.arrivalAndDeparture.list(stopID); - if (!response.ok) { + if (response.code !== 200) { error(500, 'Unable to fetch arrivals-and-departures-for-stop.'); - return; } - const data = await response.json(); - return json(data); + return json(response); } From 0bf4cff3417024a0b98d1b7e640a96f1e42f01f5 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:39:35 +0300 Subject: [PATCH 4/7] refactor: update arrivalsAndDeparturesResponse to use the sdk --- src/routes/stops/[stopID]/+page.server.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/stops/[stopID]/+page.server.js b/src/routes/stops/[stopID]/+page.server.js index 462ff55..286364a 100644 --- a/src/routes/stops/[stopID]/+page.server.js +++ b/src/routes/stops/[stopID]/+page.server.js @@ -4,13 +4,13 @@ import arrivalDepartureAPI from '$lib/RestAPI/arrivalsAndDeparturesForStop.js'; export async function load({ params }) { const stopID = params.stopID; const stopResponse = await stopAPI(stopID); - const stopBody = await stopResponse.json(); + const arrivalsAndDeparturesResponse = await arrivalDepartureAPI(stopID); - const arrivalsAndDeparturesResponseJSON = await arrivalsAndDeparturesResponse.json(); + const arrivalsAndDeparturesResponseJson = await arrivalsAndDeparturesResponse.json(); return { stopID: params.stopID, - stopData: stopBody.data, - arrivalsAndDeparturesResponse: arrivalsAndDeparturesResponseJSON + stopData: stopResponse.data, + arrivalsAndDeparturesResponse: arrivalsAndDeparturesResponseJson }; } From 70a5a25ee00fa82eb3d02f7f13206311fc766b9e Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:39:49 +0300 Subject: [PATCH 5/7] chore: Update npm dependencies to include onebusaway-sdk --- package-lock.json | 197 ++++++++++++++++++++++++++++++++++++++++------ package.json | 3 +- 2 files changed, 177 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 790dc0a..5a23000 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,8 @@ "name": "onebusaway-webapp", "version": "0.0.1", "dependencies": { - "@fortawesome/free-regular-svg-icons": "^6.6.0" + "@fortawesome/free-regular-svg-icons": "^6.6.0", + "onebusaway-sdk": "^0.1.0-alpha.31" }, "devDependencies": { "@fortawesome/fontawesome-svg-core": "^6.5.2", @@ -1100,6 +1101,25 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/node": { + "version": "18.19.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.44.tgz", + "integrity": "sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, "node_modules/@vitest/expect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", @@ -1196,6 +1216,18 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", @@ -1243,6 +1275,18 @@ "node": ">= 14" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1335,10 +1379,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "optional": true, - "peer": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { "version": "10.4.19", @@ -1622,9 +1663,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "optional": true, - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1794,9 +1832,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -2142,6 +2177,15 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -2299,9 +2343,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2311,6 +2352,25 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -2525,6 +2585,15 @@ "node": ">=16.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -2955,9 +3024,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -2966,9 +3032,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "optional": true, - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -3042,8 +3105,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -3080,6 +3142,67 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -3157,6 +3280,21 @@ "node": ">= 6" } }, + "node_modules/onebusaway-sdk": { + "version": "0.1.0-alpha.31", + "resolved": "https://registry.npmjs.org/onebusaway-sdk/-/onebusaway-sdk-0.1.0-alpha.31.tgz", + "integrity": "sha512-gL+qAwo9f/J6/bDgoWhj6xwPSeGPj2p5EopKxyKse82LVTb79jUYUWru42V57JGkHvKFF3lA9GYLXr2deFYjkQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -4510,6 +4648,12 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -4748,6 +4892,15 @@ "node": ">=18" } }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index 2a6542a..48ec675 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ }, "type": "module", "dependencies": { - "@fortawesome/free-regular-svg-icons": "^6.6.0" + "@fortawesome/free-regular-svg-icons": "^6.6.0", + "onebusaway-sdk": "^0.1.0-alpha.31" } } From f2fef326dc18ccb7a3642fd7e166983417b260c9 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:48:11 +0300 Subject: [PATCH 6/7] refactor: Update stop.js to return response object --- src/lib/RestAPI/stop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/RestAPI/stop.js b/src/lib/RestAPI/stop.js index ab285d2..a5a7519 100644 --- a/src/lib/RestAPI/stop.js +++ b/src/lib/RestAPI/stop.js @@ -16,5 +16,5 @@ export default async function (stopID) { error(500, 'Unable to fetch arrivals-and-departures-for-stop.'); } - return response; + return json(response); } From 2a6cbf20847af257deda3b537885e0db9611a146 Mon Sep 17 00:00:00 2001 From: Ahmedhossamdev Date: Wed, 21 Aug 2024 23:49:19 +0300 Subject: [PATCH 7/7] refactor: parse stopBody to json --- src/routes/stops/[stopID]/+page.server.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/stops/[stopID]/+page.server.js b/src/routes/stops/[stopID]/+page.server.js index 286364a..462ff55 100644 --- a/src/routes/stops/[stopID]/+page.server.js +++ b/src/routes/stops/[stopID]/+page.server.js @@ -4,13 +4,13 @@ import arrivalDepartureAPI from '$lib/RestAPI/arrivalsAndDeparturesForStop.js'; export async function load({ params }) { const stopID = params.stopID; const stopResponse = await stopAPI(stopID); - + const stopBody = await stopResponse.json(); const arrivalsAndDeparturesResponse = await arrivalDepartureAPI(stopID); - const arrivalsAndDeparturesResponseJson = await arrivalsAndDeparturesResponse.json(); + const arrivalsAndDeparturesResponseJSON = await arrivalsAndDeparturesResponse.json(); return { stopID: params.stopID, - stopData: stopResponse.data, - arrivalsAndDeparturesResponse: arrivalsAndDeparturesResponseJson + stopData: stopBody.data, + arrivalsAndDeparturesResponse: arrivalsAndDeparturesResponseJSON }; }