{"version":3,"file":"AmazonLocationServiceProvider.mjs","sources":["../../../../src/providers/location-service/AmazonLocationServiceProvider.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport camelcaseKeys from 'camelcase-keys';\nimport { Amplify, ConsoleLogger, fetchAuthSession } from '@aws-amplify/core';\nimport { GeoAction } from '@aws-amplify/core/internals/utils';\nimport { BatchDeleteGeofenceCommand, BatchPutGeofenceCommand, GetGeofenceCommand, GetPlaceCommand, ListGeofencesCommand, LocationClient, SearchPlaceIndexForPositionCommand, SearchPlaceIndexForSuggestionsCommand, SearchPlaceIndexForTextCommand, } from '@aws-sdk/client-location';\nimport { getGeoUserAgent, mapSearchOptions, validateGeofenceId, validateGeofencesInput, } from '../../util';\nconst logger = new ConsoleLogger('AmazonLocationServiceProvider');\nexport class AmazonLocationServiceProvider {\n    /**\n     * Initialize Geo with AWS configurations\n     * @param {Object} config - Configuration object for Geo\n     */\n    constructor(config) {\n        this._config = config || {};\n        logger.debug('Geo Options', this._config);\n    }\n    /**\n     * get the category of the plugin\n     * @returns {string} name of the category\n     */\n    getCategory() {\n        return AmazonLocationServiceProvider.CATEGORY;\n    }\n    /**\n     * get provider name of the plugin\n     * @returns {string} name of the provider\n     */\n    getProviderName() {\n        return AmazonLocationServiceProvider.PROVIDER_NAME;\n    }\n    /**\n     * Get the map resources that are currently available through the provider\n     * @returns {AmazonLocationServiceMapStyle[]}- Array of available map resources\n     */\n    getAvailableMaps() {\n        this._verifyMapResources();\n        const mapStyles = [];\n        const availableMaps = this._config.maps.items;\n        const { region } = this._config;\n        for (const mapName in availableMaps) {\n            const { style } = availableMaps[mapName];\n            mapStyles.push({ mapName, style, region });\n        }\n        return mapStyles;\n    }\n    /**\n     * Get the map resource set as default in amplify config\n     * @returns {AmazonLocationServiceMapStyle} - Map resource set as the default in amplify config\n     */\n    getDefaultMap() {\n        this._verifyMapResources();\n        const mapName = this._config.maps.default;\n        const { style } = this._config.maps.items[mapName];\n        const { region } = this._config;\n        return { mapName, style, region };\n    }\n    /**\n     * Search by text input with optional parameters\n     * @param  {string} text The text string that is to be searched for\n     * @param  {SearchByTextOptions} options Optional parameters to the search\n     * @returns {Promise<Place[]>} - Promise resolves to a list of Places that match search parameters\n     */\n    async searchByText(text, options) {\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        this._verifySearchIndex(options?.searchIndexName);\n        /**\n         * Setup the searchInput\n         */\n        let locationServiceInput = {\n            Text: text,\n            IndexName: this._config.searchIndices.default,\n        };\n        /**\n         * Map search options to Amazon Location Service input object\n         */\n        if (options) {\n            locationServiceInput = {\n                ...locationServiceInput,\n                ...mapSearchOptions(options, locationServiceInput),\n            };\n        }\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.SearchByText),\n        });\n        const command = new SearchPlaceIndexForTextCommand(locationServiceInput);\n        let response;\n        try {\n            response = await client.send(command);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        /**\n         * The response from Amazon Location Service is a \"Results\" array of objects with a single `Place` item,\n         * which are Place objects in PascalCase.\n         * Here we want to flatten that to an array of results and change them to camelCase\n         */\n        const PascalResults = response.Results.map(result => result.Place);\n        const results = camelcaseKeys(PascalResults, {\n            deep: true,\n        });\n        return results;\n    }\n    /**\n     * Search for suggestions based on the input text\n     * @param  {string} text The text string that is to be searched for\n     * @param  {SearchByTextOptions} options Optional parameters to the search\n     * @returns {Promise<SearchForSuggestionsResults>} - Resolves to an array of search suggestion strings\n     */\n    async searchForSuggestions(text, options) {\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        this._verifySearchIndex(options?.searchIndexName);\n        /**\n         * Setup the searchInput\n         */\n        let locationServiceInput = {\n            Text: text,\n            IndexName: this._config.searchIndices.default,\n        };\n        /**\n         * Map search options to Amazon Location Service input object\n         */\n        if (options) {\n            locationServiceInput = {\n                ...locationServiceInput,\n                ...mapSearchOptions(options, locationServiceInput),\n            };\n        }\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.SearchForSuggestions),\n        });\n        const command = new SearchPlaceIndexForSuggestionsCommand(locationServiceInput);\n        let response;\n        try {\n            response = await client.send(command);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        /**\n         * The response from Amazon Location Service is a \"Results\" array of objects with `Text` and `PlaceId`.\n         */\n        const results = response.Results.map(result => ({\n            text: result.Text,\n            placeId: result.PlaceId,\n        }));\n        return results;\n    }\n    _verifyPlaceId(placeId) {\n        if (placeId.length === 0) {\n            const errorString = 'PlaceId cannot be an empty string.';\n            logger.debug(errorString);\n            throw new Error(errorString);\n        }\n    }\n    async searchByPlaceId(placeId, options) {\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        this._verifySearchIndex(options?.searchIndexName);\n        this._verifyPlaceId(placeId);\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.SearchByPlaceId),\n        });\n        const searchByPlaceIdInput = {\n            PlaceId: placeId,\n            IndexName: options?.searchIndexName || this._config.searchIndices.default,\n        };\n        const command = new GetPlaceCommand(searchByPlaceIdInput);\n        let response;\n        try {\n            response = await client.send(command);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        const place = response.Place;\n        if (place) {\n            return camelcaseKeys(place, { deep: true });\n        }\n    }\n    /**\n     * Reverse geocoding search via a coordinate point on the map\n     * @param coordinates Coordinates array for the search input\n     * @param options Options parameters for the search\n     * @returns {Promise<Place>} - Promise that resolves to a place matching search coordinates\n     */\n    async searchByCoordinates(coordinates, options) {\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        this._verifySearchIndex(options?.searchIndexName);\n        const locationServiceInput = {\n            Position: coordinates,\n            IndexName: this._config.searchIndices.default,\n        };\n        if (options) {\n            if (options.searchIndexName) {\n                locationServiceInput.IndexName = options.searchIndexName;\n            }\n            locationServiceInput.MaxResults = options.maxResults;\n        }\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.SearchByCoordinates),\n        });\n        const command = new SearchPlaceIndexForPositionCommand(locationServiceInput);\n        let response;\n        try {\n            response = await client.send(command);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        /**\n         * The response from Amazon Location Service is a \"Results\" array with a single `Place` object\n         * which are Place objects in PascalCase.\n         * Here we want to flatten that to an array of results and change them to camelCase\n         */\n        const PascalResults = response.Results.map(result => result.Place);\n        const results = camelcaseKeys(PascalResults[0], {\n            deep: true,\n        });\n        return results;\n    }\n    /**\n     * Create geofences inside of a geofence collection\n     * @param geofences Array of geofence objects to create\n     * @param options Optional parameters for creating geofences\n     * @returns a promise that resolves to an object that conforms to {@link SaveGeofencesResults}:\n     *   successes: list of geofences successfully created\n     *   errors: list of geofences that failed to create\n     */\n    async saveGeofences(geofences, options) {\n        if (geofences.length < 1) {\n            throw new Error('Geofence input array is empty');\n        }\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        // Verify geofence collection exists in aws-config.js\n        try {\n            this._verifyGeofenceCollections(options?.collectionName);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        validateGeofencesInput(geofences);\n        // Convert geofences to PascalCase for Amazon Location Service format\n        const PascalGeofences = geofences.map(({ geofenceId, geometry: { polygon } }) => {\n            return {\n                GeofenceId: geofenceId,\n                Geometry: {\n                    Polygon: polygon,\n                },\n            };\n        });\n        const results = {\n            successes: [],\n            errors: [],\n        };\n        const geofenceBatches = [];\n        while (PascalGeofences.length > 0) {\n            // Splice off 10 geofences from input clone due to Amazon Location Service API limit\n            const apiLimit = 10;\n            geofenceBatches.push(PascalGeofences.splice(0, apiLimit));\n        }\n        await Promise.all(geofenceBatches.map(async (batch) => {\n            // Make API call for the 10 geofences\n            let response;\n            try {\n                response = await this._AmazonLocationServiceBatchPutGeofenceCall(batch, options?.collectionName || this._config.geofenceCollections.default);\n            }\n            catch (error) {\n                // If the API call fails, add the geofences to the errors array and move to next batch\n                batch.forEach(geofence => {\n                    results.errors.push({\n                        geofenceId: geofence.GeofenceId,\n                        error: {\n                            code: 'APIConnectionError',\n                            message: error.message,\n                        },\n                    });\n                });\n                return;\n            }\n            // Push all successes to results\n            response.Successes?.forEach(success => {\n                const { GeofenceId: geofenceId, CreateTime, UpdateTime } = success;\n                results.successes.push({\n                    geofenceId: geofenceId,\n                    createTime: CreateTime,\n                    updateTime: UpdateTime,\n                });\n            });\n            // Push all errors to results\n            response.Errors?.forEach(error => {\n                const { Error, GeofenceId: geofenceId } = error;\n                const { Code, Message } = Error;\n                results.errors.push({\n                    error: {\n                        code: Code,\n                        message: Message,\n                    },\n                    geofenceId: geofenceId,\n                });\n            });\n        }));\n        return results;\n    }\n    /**\n     * Get geofence from a geofence collection\n     * @param geofenceId string\n     * @param options Optional parameters for getGeofence\n     * @returns {Promise<AmazonLocationServiceGeofence>} - Promise that resolves to a geofence object\n     */\n    async getGeofence(geofenceId, options) {\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        // Verify geofence collection exists in aws-config.js\n        try {\n            this._verifyGeofenceCollections(options?.collectionName);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        validateGeofenceId(geofenceId);\n        // Create Amazon Location Service Client\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.GetGeofence),\n        });\n        // Create Amazon Location Service command\n        const commandInput = {\n            GeofenceId: geofenceId,\n            CollectionName: options?.collectionName || this._config.geofenceCollections.default,\n        };\n        const command = new GetGeofenceCommand(commandInput);\n        // Make API call\n        let response;\n        try {\n            response = await client.send(command);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        // Convert response to camelCase for return\n        const { GeofenceId: responseGeofenceId, CreateTime, UpdateTime, Status, Geometry, } = response;\n        const geofence = {\n            createTime: CreateTime,\n            geofenceId: responseGeofenceId,\n            geometry: {\n                polygon: Geometry.Polygon,\n            },\n            status: Status,\n            updateTime: UpdateTime,\n        };\n        return geofence;\n    }\n    /**\n     * List geofences from a geofence collection\n     * @param  options ListGeofenceOptions\n     * @returns a promise that resolves to an object that conforms to {@link ListGeofenceResults}:\n     *   entries: list of geofences - 100 geofences are listed per page\n     *   nextToken: token for next page of geofences\n     */\n    async listGeofences(options) {\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        // Verify geofence collection exists in aws-config.js\n        try {\n            this._verifyGeofenceCollections(options?.collectionName);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        // Create Amazon Location Service Client\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.ListGeofences),\n        });\n        // Create Amazon Location Service input\n        const listGeofencesInput = {\n            NextToken: options?.nextToken,\n            CollectionName: options?.collectionName || this._config.geofenceCollections.default,\n        };\n        // Create Amazon Location Service command\n        const command = new ListGeofencesCommand(listGeofencesInput);\n        // Make API call\n        let response;\n        try {\n            response = await client.send(command);\n        }\n        catch (error) {\n            logger.debug(error);\n            throw error;\n        }\n        // Convert response to camelCase for return\n        const { NextToken, Entries } = response;\n        const results = {\n            entries: Entries.map(({ GeofenceId: geofenceId, CreateTime, UpdateTime, Status, Geometry, }) => {\n                return {\n                    geofenceId: geofenceId,\n                    createTime: CreateTime,\n                    updateTime: UpdateTime,\n                    status: Status,\n                    geometry: {\n                        polygon: Geometry.Polygon,\n                    },\n                };\n            }),\n            nextToken: NextToken,\n        };\n        return results;\n    }\n    /**\n     * Delete geofences from a geofence collection\n     * @param geofenceIds string|string[]\n     * @param options GeofenceOptions\n     * @returns a promise that resolves to an object that conforms to {@link AmazonLocationServiceDeleteGeofencesResults}:\n     *  successes: list of geofences successfully deleted\n     *  errors: list of geofences that failed to delete\n     */\n    async deleteGeofences(geofenceIds, options) {\n        if (geofenceIds.length < 1) {\n            throw new Error('GeofenceId input array is empty');\n        }\n        const credentialsOK = await this._ensureCredentials();\n        if (!credentialsOK) {\n            throw new Error('No credentials');\n        }\n        this._verifyGeofenceCollections(options?.collectionName);\n        // Validate all geofenceIds are valid\n        const badGeofenceIds = geofenceIds.filter(geofenceId => {\n            try {\n                validateGeofenceId(geofenceId);\n            }\n            catch (error) {\n                return true;\n            }\n            return false;\n        });\n        if (badGeofenceIds.length > 0) {\n            throw new Error(`Invalid geofence ids: ${badGeofenceIds.join(', ')}`);\n        }\n        const results = {\n            successes: [],\n            errors: [],\n        };\n        const geofenceIdBatches = [];\n        let count = 0;\n        while (count < geofenceIds.length) {\n            geofenceIdBatches.push(geofenceIds.slice(count, (count += 10)));\n        }\n        await Promise.all(geofenceIdBatches.map(async (batch) => {\n            let response;\n            try {\n                response = await this._AmazonLocationServiceBatchDeleteGeofenceCall(batch, options?.collectionName || this._config.geofenceCollections.default);\n            }\n            catch (error) {\n                // If the API call fails, add the geofences to the errors array and move to next batch\n                batch.forEach(geofenceId => {\n                    const errorObject = {\n                        geofenceId,\n                        error: {\n                            code: error\n                                .message,\n                            message: error\n                                .message,\n                        },\n                    };\n                    results.errors.push(errorObject);\n                });\n                return;\n            }\n            const targetBadGeofenceIds = response.Errors.map(({ geofenceId }) => geofenceId);\n            results.successes.push(...batch.filter(Id => !targetBadGeofenceIds.includes(Id)));\n        }));\n        return results;\n    }\n    /**\n     * @private\n     */\n    async _ensureCredentials() {\n        try {\n            const { credentials } = await fetchAuthSession();\n            if (!credentials)\n                return false;\n            logger.debug('Set credentials for storage. Credentials are:', credentials);\n            this._credentials = credentials;\n            return true;\n        }\n        catch (error) {\n            logger.debug('Ensure credentials error. Credentials are:', error);\n            return false;\n        }\n    }\n    _refreshConfig() {\n        this._config = Amplify.getConfig().Geo?.LocationService;\n        if (!this._config) {\n            const errorString = \"No Geo configuration found in amplify config, run 'amplify add geo' to create one and run `amplify push` after\";\n            logger.debug(errorString);\n            throw new Error(errorString);\n        }\n    }\n    _verifyMapResources() {\n        this._refreshConfig();\n        if (!this._config.maps) {\n            const errorString = \"No map resources found in amplify config, run 'amplify add geo' to create one and run `amplify push` after\";\n            logger.debug(errorString);\n            throw new Error(errorString);\n        }\n        if (!this._config.maps.default) {\n            const errorString = \"No default map resource found in amplify config, run 'amplify add geo' to create one and run `amplify push` after\";\n            logger.debug(errorString);\n            throw new Error(errorString);\n        }\n    }\n    _verifySearchIndex(optionalSearchIndex) {\n        this._refreshConfig();\n        if ((!this._config.searchIndices || !this._config.searchIndices.default) &&\n            !optionalSearchIndex) {\n            const errorString = 'No Search Index found in amplify config, please run `amplify add geo` to create one and run `amplify push` after.';\n            logger.debug(errorString);\n            throw new Error(errorString);\n        }\n    }\n    _verifyGeofenceCollections(optionalGeofenceCollectionName) {\n        this._refreshConfig();\n        if ((!this._config.geofenceCollections ||\n            !this._config.geofenceCollections.default) &&\n            !optionalGeofenceCollectionName) {\n            const errorString = 'No Geofence Collections found, please run `amplify add geo` to create one and run `amplify push` after.';\n            logger.debug(errorString);\n            throw new Error(errorString);\n        }\n    }\n    async _AmazonLocationServiceBatchPutGeofenceCall(PascalGeofences, collectionName) {\n        // Create the BatchPutGeofence input\n        const geofenceInput = {\n            Entries: PascalGeofences,\n            CollectionName: collectionName || this._config.geofenceCollections.default,\n        };\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.SaveGeofences),\n        });\n        const command = new BatchPutGeofenceCommand(geofenceInput);\n        return client.send(command);\n    }\n    async _AmazonLocationServiceBatchDeleteGeofenceCall(geofenceIds, collectionName) {\n        // Create the BatchDeleteGeofence input\n        const deleteGeofencesInput = {\n            GeofenceIds: geofenceIds,\n            CollectionName: collectionName || this._config.geofenceCollections.default,\n        };\n        const client = new LocationClient({\n            credentials: this._credentials,\n            region: this._config.region,\n            customUserAgent: getGeoUserAgent(GeoAction.DeleteGeofences),\n        });\n        const command = new BatchDeleteGeofenceCommand(deleteGeofencesInput);\n        return client.send(command);\n    }\n}\nAmazonLocationServiceProvider.CATEGORY = 'Geo';\nAmazonLocationServiceProvider.PROVIDER_NAME = 'AmazonLocationService';\n"],"names":[],"mappings":"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"}