{"version":3,"file":"observeQuery.mjs","sources":["../../../../../src/runtime/internals/operations/observeQuery.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Observable } from 'rxjs';\nimport { findIndexByFields, resolvePKFields } from '../../utils';\nexport function observeQueryFactory(models, model) {\n    const { name } = model;\n    const observeQuery = (arg) => new Observable((subscriber) => {\n        // what we'll be sending to our subscribers\n        const items = [];\n        // To enqueue subscription messages while we collect our initial\n        // result set.\n        const messageQueue = [];\n        // operation to take when message(s) arrive.\n        // this operation will be swapped out once initial \"sync\" is complete\n        // to immediately ingest messsages.\n        let receiveMessages = (...messages) => {\n            return messageQueue.push(...messages);\n        };\n        // start subscriptions\n        const onCreateSub = models[name].onCreate(arg).subscribe({\n            next(item) {\n                receiveMessages({ item, type: 'create' });\n            },\n            error(error) {\n                subscriber.error({ type: 'onCreate', error });\n            },\n        });\n        const onUpdateSub = models[name].onUpdate(arg).subscribe({\n            next(item) {\n                receiveMessages({ item, type: 'update' });\n            },\n            error(error) {\n                subscriber.error({ type: 'onUpdate', error });\n            },\n        });\n        const onDeleteSub = models[name].onDelete(arg).subscribe({\n            next(item) {\n                receiveMessages({ item, type: 'delete' });\n            },\n            error(error) {\n                subscriber.error({ type: 'onDelete', error });\n            },\n        });\n        // consumes a list of messages and sends a snapshot\n        function ingestMessages(messages) {\n            for (const message of messages) {\n                const idx = findIndexByFields(message.item, items, pkFields);\n                switch (message.type) {\n                    case 'create':\n                        if (idx < 0)\n                            items.push(message.item);\n                        break;\n                    case 'update':\n                        if (idx >= 0)\n                            items[idx] = message.item;\n                        break;\n                    case 'delete':\n                        if (idx >= 0)\n                            items.splice(idx, 1);\n                        break;\n                    default:\n                        console.error('Unrecognized message in observeQuery.', message);\n                }\n            }\n            subscriber.next({\n                items,\n                isSynced: true,\n            });\n        }\n        const pkFields = resolvePKFields(model);\n        // initial results\n        (async () => {\n            let firstPage = true;\n            let nextToken = null;\n            while (!subscriber.closed && (firstPage || nextToken)) {\n                firstPage = false;\n                const { data: page, errors, nextToken: _nextToken, } = await models[name].list({ ...arg, nextToken });\n                nextToken = _nextToken;\n                items.push(...page);\n                // if there are no more pages and no items we already know about\n                // that need to be merged in from sub, we're \"synced\"\n                const isSynced = messageQueue.length === 0 &&\n                    (nextToken === null || nextToken === undefined);\n                subscriber.next({\n                    items,\n                    isSynced,\n                });\n                if (Array.isArray(errors)) {\n                    for (const error of errors) {\n                        subscriber.error(error);\n                    }\n                }\n            }\n            // play through the queue\n            if (messageQueue.length > 0) {\n                ingestMessages(messageQueue);\n            }\n            // switch the queue to write directly to the items collection\n            receiveMessages = (...messages) => {\n                ingestMessages(messages);\n                return items.length;\n            };\n        })();\n        // when subscriber unsubscribes, tear down internal subs\n        return () => {\n            // 1. tear down internal subs\n            onCreateSub.unsubscribe();\n            onUpdateSub.unsubscribe();\n            onDeleteSub.unsubscribe();\n            // 2. there is no need to explicitly stop paging. instead, we\n            // just check `subscriber.closed` above before fetching each page.\n        };\n    });\n    return observeQuery;\n}\n"],"names":[],"mappings":"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"}