[{"data":1,"prerenderedAt":1412},["ShallowReactive",2],{"navigation_docs_en":3,"-en-reference-extensions-data-connectors-limits":445,"-en-reference-extensions-data-connectors-limits-surround":1407},[4,30,72,132,260,436],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Use Cases","\u002Fen\u002Fgetting-started\u002Fuse-cases","en\u002F1.getting-started\u002F4.use-cases","i-lucide-layers",{"title":26,"path":27,"stem":28,"icon":29},"Concepts","\u002Fen\u002Fgetting-started\u002Fconcepts","en\u002F1.getting-started\u002F5.concepts","i-lucide-book",{"title":26,"path":31,"stem":32,"children":33,"page":6},"\u002Fen\u002Fconcepts","en\u002F2.concepts",[34,38,43,48,53,58,63,68],{"title":35,"path":36,"stem":37,"icon":14},"Organization","\u002Fen\u002Fconcepts\u002Forganization","en\u002F2.concepts\u002F1.organization",{"title":39,"path":40,"stem":41,"icon":42},"Data Model","\u002Fen\u002Fconcepts\u002Fdata-model","en\u002F2.concepts\u002F2.data-model","i-lucide-database",{"title":44,"path":45,"stem":46,"icon":47},"Access Control","\u002Fen\u002Fconcepts\u002Faccess-permissions","en\u002F2.concepts\u002F3.access-permissions","i-lucide-user-key",{"title":49,"path":50,"stem":51,"icon":52},"Audit Logs","\u002Fen\u002Fconcepts\u002Faudit-logs","en\u002F2.concepts\u002F4.audit-logs","i-lucide-scroll-text",{"title":54,"path":55,"stem":56,"icon":57},"Introspection","\u002Fen\u002Fconcepts\u002Fintrospection","en\u002F2.concepts\u002F6.introspection","i-lucide-database-search",{"title":59,"path":60,"stem":61,"icon":62},"Query Engine","\u002Fen\u002Fconcepts\u002Fquery-engine","en\u002F2.concepts\u002F7.query-engine","i-lucide-workflow",{"title":64,"path":65,"stem":66,"icon":67},"AI","\u002Fen\u002Fconcepts\u002Fai","en\u002F2.concepts\u002F8.ai","i-lucide-sparkles",{"title":69,"path":70,"stem":71,"icon":42},"Caching","\u002Fen\u002Fconcepts\u002Fcaching","en\u002F2.concepts\u002F9.caching",{"title":73,"path":74,"stem":75,"children":76,"page":6},"Guides","\u002Fen\u002Fguides","en\u002F4.guides",[77,82,87,92,97,102,107,112],{"title":78,"path":79,"stem":80,"icon":81},"REST API Quickstart","\u002Fen\u002Fguides\u002Frest-api","en\u002F4.guides\u002F1.rest-api","i-lucide-plug",{"title":83,"path":84,"stem":85,"icon":86},"SDK Quickstart","\u002Fen\u002Fguides\u002Fsdk","en\u002F4.guides\u002F2.sdk","i-lucide-terminal",{"title":88,"path":89,"stem":90,"icon":91},"Configure SSO","\u002Fen\u002Fguides\u002Fconfigure-sso","en\u002F4.guides\u002F3.configure-sso","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"Configure MCP","\u002Fen\u002Fguides\u002Fmcp","en\u002F4.guides\u002F4.mcp","i-lucide-brain-cog",{"title":98,"path":99,"stem":100,"icon":101},"Customize Content Space","\u002Fen\u002Fguides\u002Fcustomize-content-space","en\u002F4.guides\u002F5.customize-content-space","i-lucide-columns-3-cog",{"title":103,"path":104,"stem":105,"icon":106},"Build an Application with AI Assistance","\u002Fen\u002Fguides\u002Fbuild-an-application","en\u002F4.guides\u002F6.build-an-application","i-lucide-route",{"title":108,"path":109,"stem":110,"icon":111},"Horizontal Scaling","\u002Fen\u002Fguides\u002Fhorizontal-scaling","en\u002F4.guides\u002F7.horizontal-scaling","i-lucide-network",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":6},"Data Connectors","i-lucide-cable","\u002Fen\u002Fguides\u002Fdata-connectors","en\u002F4.guides\u002F8.data-connectors",[118,122,127],{"title":16,"path":119,"stem":120,"icon":121},"\u002Fen\u002Fguides\u002Fdata-connectors\u002Fquickstart","en\u002F4.guides\u002F8.data-connectors\u002F1.quickstart","i-lucide-rocket",{"title":123,"path":124,"stem":125,"icon":126},"Build a Stripe Connector","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fstripe","en\u002F4.guides\u002F8.data-connectors\u002F2.stripe","i-lucide-hammer",{"title":128,"path":129,"stem":130,"icon":131},"Build with AI Agents","\u002Fen\u002Fguides\u002Fdata-connectors\u002Fai-agents","en\u002F4.guides\u002F8.data-connectors\u002F3.ai-agents","i-lucide-bot",{"title":133,"path":134,"stem":135,"children":136,"page":6},"Developer","\u002Fen\u002Fdeveloper","en\u002F5.developer",[137,191,215,220],{"title":138,"path":139,"stem":140,"children":141,"page":6},"Data Access","\u002Fen\u002Fdeveloper\u002Fapi","en\u002F5.developer\u002F1.api",[142,147,152,157,162,167,172,177,182,186],{"title":143,"path":144,"stem":145,"icon":146},"Overview","\u002Fen\u002Fdeveloper\u002Fapi\u002Foverview","en\u002F5.developer\u002F1.api\u002F1.overview","i-lucide-globe",{"title":148,"path":149,"stem":150,"icon":151},"Errors","\u002Fen\u002Fdeveloper\u002Fapi\u002Ferrors","en\u002F5.developer\u002F1.api\u002F10.errors","i-lucide-alert-triangle",{"title":153,"path":154,"stem":155,"icon":156},"Authentication","\u002Fen\u002Fdeveloper\u002Fapi\u002Fauthentication","en\u002F5.developer\u002F1.api\u002F2.authentication","i-lucide-lock",{"title":158,"path":159,"stem":160,"icon":161},"Reading Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Freading-data","en\u002F5.developer\u002F1.api\u002F3.reading-data","i-lucide-book-open",{"title":163,"path":164,"stem":165,"icon":166},"Writing Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Fwriting-data","en\u002F5.developer\u002F1.api\u002F4.writing-data","i-lucide-pencil",{"title":168,"path":169,"stem":170,"icon":171},"Filtering","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiltering","en\u002F5.developer\u002F1.api\u002F5.filtering","i-lucide-filter",{"title":173,"path":174,"stem":175,"icon":176},"Field Selection","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffield-selection","en\u002F5.developer\u002F1.api\u002F6.field-selection","i-lucide-list-checks",{"title":178,"path":179,"stem":180,"icon":181},"Sorting & Pagination","\u002Fen\u002Fdeveloper\u002Fapi\u002Fsorting-pagination","en\u002F5.developer\u002F1.api\u002F7.sorting-pagination","i-lucide-arrow-up-down",{"title":183,"path":184,"stem":185,"icon":111},"Relational Data","\u002Fen\u002Fdeveloper\u002Fapi\u002Frelational-data","en\u002F5.developer\u002F1.api\u002F8.relational-data",{"title":187,"path":188,"stem":189,"icon":190},"Files & Assets","\u002Fen\u002Fdeveloper\u002Fapi\u002Ffiles","en\u002F5.developer\u002F1.api\u002F9.files","i-lucide-file-up",{"title":192,"path":193,"stem":194,"children":195,"page":6},"Client SDK","\u002Fen\u002Fdeveloper\u002Fsdk","en\u002F5.developer\u002F2.sdk",[196,200,205,210],{"title":197,"path":198,"stem":199,"icon":19},"Installation","\u002Fen\u002Fdeveloper\u002Fsdk\u002Finstallation","en\u002F5.developer\u002F2.sdk\u002F1.installation",{"title":201,"path":202,"stem":203,"icon":204},"Client Setup","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fclient-setup","en\u002F5.developer\u002F2.sdk\u002F2.client-setup","i-lucide-settings",{"title":206,"path":207,"stem":208,"icon":209},"Type System","\u002Fen\u002Fdeveloper\u002Fsdk\u002Ftype-system","en\u002F5.developer\u002F2.sdk\u002F3.type-system","i-lucide-braces",{"title":211,"path":212,"stem":213,"icon":214},"Advanced","\u002Fen\u002Fdeveloper\u002Fsdk\u002Fadvanced","en\u002F5.developer\u002F2.sdk\u002F5.advanced","i-lucide-puzzle",{"title":216,"path":217,"stem":218,"icon":219},"Application Users","\u002Fen\u002Fdeveloper\u002Fapplication-users","en\u002F5.developer\u002F3.application-users","i-lucide-users",{"title":221,"path":222,"stem":223,"children":224,"icon":214},"Extensions","\u002Fen\u002Fdeveloper\u002Fextensions","en\u002F5.developer\u002F3.extensions\u002Findex",[225,226,231],{"title":143,"path":222,"stem":223,"icon":214},{"title":227,"path":228,"stem":229,"icon":230},"Install and Manage Extensions","\u002Fen\u002Fdeveloper\u002Fextensions\u002Finstall","en\u002F5.developer\u002F3.extensions\u002F1.install","i-lucide-package-plus",{"title":113,"path":232,"stem":233,"children":234,"icon":114},"\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002Findex",[235,236,241,245,250,255],{"title":143,"path":232,"stem":233,"icon":114},{"title":237,"path":238,"stem":239,"icon":240},"How Data Connectors Run","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F2.runtime","i-lucide-cpu",{"title":242,"path":243,"stem":244,"icon":42},"Data Sources","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-sources","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F3.data-sources",{"title":246,"path":247,"stem":248,"icon":249},"Map an External Data Source","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fdata-source-mapping","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F4.data-source-mapping","i-lucide-map",{"title":251,"path":252,"stem":253,"icon":254},"Handle Errors","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F5.errors","i-lucide-shield-alert",{"title":256,"path":257,"stem":258,"icon":259},"Test a Data Connector","\u002Fen\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Ftesting","en\u002F5.developer\u002F3.extensions\u002F2.data-connectors\u002F6.testing","i-lucide-flask-conical",{"title":261,"path":262,"stem":263,"children":264,"page":6},"Reference","\u002Fen\u002Freference","en\u002F6.reference",[265,269,274,279,295,299,304,340,369,374],{"title":266,"path":267,"stem":268,"icon":204},"Configuration","\u002Fen\u002Freference\u002Fenvironment-variables","en\u002F6.reference\u002F1.environment-variables",{"title":270,"path":271,"stem":272,"icon":273},"System Requirements","\u002Fen\u002Freference\u002Fsystem-requirements","en\u002F6.reference\u002F2.system-requirements","i-lucide-server",{"title":275,"path":276,"stem":277,"icon":278},"Licensing","\u002Fen\u002Freference\u002Flicensing","en\u002F6.reference\u002F3.licensing","i-lucide-gem",{"title":280,"path":281,"stem":282,"children":283,"icon":81},"Connectors","\u002Fen\u002Freference\u002Fconnectors","en\u002F6.reference\u002F4.connectors\u002Findex",[284,285,290],{"title":280,"path":281,"stem":282,"icon":81},{"title":286,"path":287,"stem":288,"icon":289},"PostgreSQL and Supabase","\u002Fen\u002Freference\u002Fconnectors\u002Fpostgresql-supabase","en\u002F6.reference\u002F4.connectors\u002F1.postgresql-supabase","i-simple-icons-postgresql",{"title":291,"path":292,"stem":293,"icon":294},"MySQL and MariaDB","\u002Fen\u002Freference\u002Fconnectors\u002Fmysql-mariadb","en\u002F6.reference\u002F4.connectors\u002F2.mysql-mariadb","i-simple-icons-mysql",{"title":296,"path":297,"stem":298,"icon":209},"Data Types Representation","\u002Fen\u002Freference\u002Fdata-types","en\u002F6.reference\u002F5.data-types",{"title":300,"path":301,"stem":302,"icon":303},"Permissions Reference","\u002Fen\u002Freference\u002Fpermissions","en\u002F6.reference\u002F6.permissions","i-lucide-shield",{"title":305,"path":306,"stem":307,"children":308,"page":6},"API Reference","\u002Fen\u002Freference\u002Fapi-reference","en\u002F6.reference\u002F7.api-reference",[309,313,318],{"title":310,"path":311,"stem":312,"icon":273},"System Endpoints","\u002Fen\u002Freference\u002Fapi-reference\u002Fsystem-endpoints","en\u002F6.reference\u002F7.api-reference\u002F1.system-endpoints",{"title":314,"path":315,"stem":316,"icon":317},"OpenAPI Spec","\u002Fen\u002Freference\u002Fapi-reference\u002Fopenapi-spec","en\u002F6.reference\u002F7.api-reference\u002F2.openapi-spec","i-lucide-file-code",{"title":319,"path":320,"stem":321,"children":322,"icon":324},"Schema Migration","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002Findex",[323,325,330,335],{"title":319,"path":320,"stem":321,"icon":324},"i-lucide-database-zap",{"title":326,"path":327,"stem":328,"icon":329},"Apply Migrations","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fapply-migrations","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F1.apply-migrations","i-lucide-upload",{"title":331,"path":332,"stem":333,"icon":334},"Import Changes","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Fimport-changes","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F2.import-changes","i-lucide-refresh-cw",{"title":336,"path":337,"stem":338,"icon":339},"Operation Reference","\u002Fen\u002Freference\u002Fapi-reference\u002Fschema-migration\u002Foperation-reference","en\u002F6.reference\u002F7.api-reference\u002F3.schema-migration\u002F3.operation-reference","i-lucide-list-tree",{"title":341,"path":342,"stem":343,"children":344,"page":6},"Design Considerations","\u002Fen\u002Freference\u002Fdesign-considerations","en\u002F6.reference\u002F8.design-considerations",[345,349,354,359,364],{"title":143,"path":346,"stem":347,"icon":348},"\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverview","en\u002F6.reference\u002F8.design-considerations\u002F1.overview","i-lucide-compass",{"title":350,"path":351,"stem":352,"icon":353},"Instance Configuration","\u002Fen\u002Freference\u002Fdesign-considerations\u002Finstance-configuration-related-problems","en\u002F6.reference\u002F8.design-considerations\u002F3.instance-configuration-related-problems","i-lucide-wrench",{"title":355,"path":356,"stem":357,"icon":358},"Overly Permissive Public Access","\u002Fen\u002Freference\u002Fdesign-considerations\u002Foverly-permissive","en\u002F6.reference\u002F8.design-considerations\u002F4.overly-permissive","i-lucide-shield-off",{"title":360,"path":361,"stem":362,"icon":363},"No Aggregates","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fno-aggregates","en\u002F6.reference\u002F8.design-considerations\u002F5.no-aggregates","i-lucide-sigma",{"title":365,"path":366,"stem":367,"icon":368},"Cross-Data-Source Referential Integrity","\u002Fen\u002Freference\u002Fdesign-considerations\u002Fcross-data-source-referential-integrity","en\u002F6.reference\u002F8.design-considerations\u002F6.cross-data-source-referential-integrity","i-lucide-unlink",{"title":370,"path":371,"stem":372,"icon":373},"CLI","\u002Fen\u002Freference\u002Fcli","en\u002F6.reference\u002F9.cli","i-lucide-square-terminal",{"title":221,"path":375,"stem":376,"children":377,"page":6},"\u002Fen\u002Freference\u002Fextensions","en\u002F6.reference\u002F9.extensions",[378,383,386,405],{"title":379,"path":380,"stem":381,"icon":382},"Extension Config and Manifest","\u002Fen\u002Freference\u002Fextensions\u002Fmanifest","en\u002F6.reference\u002F9.extensions\u002F1.manifest","i-lucide-file-json",{"title":370,"path":384,"stem":385,"icon":86},"\u002Fen\u002Freference\u002Fextensions\u002Fcli","en\u002F6.reference\u002F9.extensions\u002F2.cli",{"title":387,"path":388,"stem":389,"children":390,"page":6},"Extension Kit","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit",[391,395,400],{"title":392,"path":393,"stem":394,"icon":81},"Data Connector","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fdata-connector","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F1.data-connector",{"title":396,"path":397,"stem":398,"icon":399},"Protocol","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fprotocol","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F2.protocol","i-lucide-arrow-left-right",{"title":401,"path":402,"stem":403,"icon":404},"Schema Helpers","\u002Fen\u002Freference\u002Fextensions\u002Fextension-kit\u002Fexperimental","en\u002F6.reference\u002F9.extensions\u002F3.extension-kit\u002F3.experimental","i-lucide-blocks",{"title":113,"path":406,"stem":407,"children":408,"page":6},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors",[409,413,417,421,426,431],{"title":410,"path":411,"stem":412,"icon":81},"Data Connector API","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F1.api",{"title":414,"path":415,"stem":416,"icon":176},"Operations and Operators","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Foperations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F2.operations",{"title":148,"path":418,"stem":419,"icon":420},"\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Ferrors","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F3.errors","i-lucide-triangle-alert",{"title":422,"path":423,"stem":424,"icon":425},"Runtime Limits","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimits","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F4.limits","i-lucide-gauge",{"title":427,"path":428,"stem":429,"icon":430},"Limitations","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F5.limitations","i-lucide-ban",{"title":432,"path":433,"stem":434,"icon":435},"Network Permissions","\u002Fen\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions","en\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F6.permissions","i-lucide-shield-check",{"title":437,"icon":121,"path":438,"stem":439,"children":440,"page":6},"Release Notes","\u002Fen\u002Frelease-notes","en\u002F7.release-notes",[441],{"title":442,"path":443,"stem":444,"icon":121},"Changelog","\u002Fen\u002Frelease-notes\u002Fchangelog","en\u002F7.release-notes\u002F1.changelog",{"id":446,"title":447,"body":448,"description":1400,"extension":1401,"links":1402,"meta":1403,"navigation":1404,"path":423,"seo":1405,"stem":424,"__hash__":1406},"docs_en\u002Fen\u002F6.reference\u002F9.extensions\u002F4.data-connectors\u002F4.limits.md","Data Connector Runtime Limits",{"type":449,"value":450,"toc":1385},"minimark",[451,454,458,486,604,610,613,661,671,684,688,691,704,711,714,729,732,736,779,783,790,911,956,983,989,999,1003,1010,1080,1097,1101,1104,1270,1279,1287,1291,1294,1300,1317,1326,1330,1340,1350,1354],[452,453],"preview",{},[455,456,143],"h2",{"id":457},"overview",[459,460,461,462,466,467,472,473,477,478,481,482,485],"p",{},"Every data connector extension runs under the limits on this page, in each ",[463,464,465],"strong",{},"data source",": the connector configured in a ",[468,469,471],"a",{"href":470},"\u002Fconcepts\u002Forganization#glossary","workspace",". A data source exposes ",[468,474,476],{"href":475},"\u002Fconcepts\u002Fdata-model#collections","collections"," of ",[463,479,480],{},"items",", each a single data object, and runs on the ",[463,483,484],{},"instance",", your Monospace deployment. None of the limits are configurable per extension. The page lists each limit with the behavior you see when you hit it.",[487,488,489,502],"table",{},[490,491,492],"thead",{},[493,494,495,499],"tr",{},[496,497,498],"th",{},"Limit",[496,500,501],{},"Value",[503,504,505,517,530,541,552,568,582,593],"tbody",{},[493,506,507,514],{},[508,509,510],"td",{},[468,511,513],{"href":512},"#module-evaluation-and-setup","Module evaluation timeout",[508,515,516],{},"30 seconds",[493,518,519,528],{},[508,520,521],{},[468,522,523,527],{"href":512},[524,525,526],"code",{},"setup"," timeout",[508,529,516],{},[493,531,532,538],{},[508,533,534],{},[468,535,537],{"href":536},"#liveness-check","Liveness check",[508,539,540],{},"Ping after 30 seconds of silence; unresponsive after another 30",[493,542,543,549],{},[508,544,545],{},[468,546,548],{"href":547},"#per-request-deadline","Per-request timeout",[508,550,551],{},"None",[493,553,554,560],{},[508,555,556],{},[468,557,559],{"href":558},"#page-size","Default page size",[508,561,562,563],{},"100 items, from ",[564,565],"env-var",{"name":566,"section":567},"query_limit_default","limits",[493,569,570,575],{},[508,571,572],{},[468,573,574],{"href":558},"Maximum page size",[508,576,577,578,581],{},"Unlimited, unless ",[564,579],{"name":580,"section":567},"query_limit_max"," is set",[493,583,584,590],{},[508,585,586],{},[468,587,589],{"href":588},"#one-file-no-imports","Bundle shape",[508,591,592],{},"One JavaScript file per entry, no imports",[493,594,595,601],{},[508,596,597],{},[468,598,600],{"href":599},"#concurrency","Isolates",[508,602,603],{},"One per data source, serving requests concurrently",[455,605,607,608],{"id":606},"module-evaluation-and-setup","Module Evaluation and ",[524,609,526],{},[459,611,612],{},"Your instance gives each start of a data source two 30-second windows. Neither can be changed.",[487,614,615,628],{},[490,616,617],{},[493,618,619,622,625],{},[496,620,621],{},"Phase",[496,623,624],{},"Window",[496,626,627],{},"When exceeded",[503,629,630,647],{},[493,631,632,638,641],{},[508,633,634,635],{},"Evaluating the entry file, including top-level ",[524,636,637],{},"await",[508,639,640],{},"30 s",[508,642,643,644],{},"The start fails with ",[524,645,646],{},"the extension did not finish loading within 30s",[493,648,649,654,656],{},[508,650,651,653],{},[524,652,526],{},", from call to returned handlers",[508,655,640],{},[508,657,643,658],{},[524,659,660],{},"the entrypoint stopped answering",[459,662,663,664,667,668,670],{},"Neither failure deactivates the data source. The request that started it fails. Requests that arrive while it starts don't wait: they fail at once with ",[524,665,666],{},"503"," \"Data source is restarting\". The next request starts it again from scratch. Keep network calls out of module scope, and keep ",[524,669,526],{}," to building clients and validating configuration.",[459,672,673,676,677,679,680,683],{},[524,674,675],{},"preflight"," runs between the two windows and has no window of its own. It must return synchronously. A ",[524,678,675],{}," that blocks the thread falls under the ",[468,681,682],{"href":536},"liveness check",".",[455,685,687],{"id":686},"liveness-check","Liveness Check",[459,689,690],{},"Once a data source is serving, the instance watches its worker for silence:",[692,693,694,698,701],"ol",{},[695,696,697],"li",{},"After 30 seconds without any message from the worker, the instance sends a ping.",[695,699,700],{},"The worker's runtime answers the ping itself, even while handlers are waiting on the network.",[695,702,703],{},"If another 30 seconds pass without any message, the instance marks the worker unresponsive.",[459,705,706,707,710],{},"Messages here are the worker's protocol messages, such as answers and ping replies. ",[524,708,709],{},"console"," output goes to the log separately and doesn't reset the silence timer.",[459,712,713],{},"An unresponsive worker stops serving, and the instance replaces it on a later request:",[715,716,717,720,726],"ul",{},[695,718,719],{},"Requests in flight fail and mark the worker for replacement. With none in flight, the first request sent to the stopped worker fails and marks it instead.",[695,721,722,723,725],{},"The next request starts a new worker and runs ",[524,724,526],{}," again. The old worker ends when the new one takes over.",[695,727,728],{},"Failed requests aren't replayed. The caller decides whether retrying a failed write is safe.",[459,730,731],{},"The worker misses a ping only when its JavaScript thread is blocked. A synchronous loop or a long CPU-bound computation blocks every request to the data source. The instance fails those requests 30 to 60 seconds after the thread blocks, depending on when the worker last sent a message. It then replaces the worker as above. Keep synchronous work in handlers short.",[455,733,735],{"id":734},"per-request-deadline","Per-Request Deadline",[459,737,738,739,742,743,746,747,750,751,754,755,758,759,762,763,766,767,769,770,773,774,778],{},"The instance sets no deadline on ",[524,740,741],{},"query",", ",[524,744,745],{},"introspect"," or ",[524,748,749],{},"testConnection",". A handler that awaits a slow external data source waits as long as that source takes, and so does the caller's request. A client can stop waiting sooner (Studio's connection test gives up after 60 seconds), but nothing cancels the handler: a write it started can still complete. Put your own deadline on outgoing calls: pass ",[524,752,753],{},"AbortSignal.timeout(ms)"," as the ",[524,756,757],{},"signal"," of each ",[524,760,761],{},"fetch",", and read the body inside the same ",[524,764,765],{},"try",". The signal also aborts reading the body. When the deadline passes, ",[524,768,761],{}," rejects with an error named ",[524,771,772],{},"TimeoutError",". A deadline set this way bounds one request, not the operation: a read that pages through the external data source sends several requests, each with a fresh deadline. See ",[468,775,777],{"href":776},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime#http-through-fetch","HTTP Through fetch"," for an example.",[455,780,782],{"id":781},"page-size","Page Size",[459,784,785,786,789],{},"For a caller's read of a collection, the ",[524,787,788],{},"readMany"," operation arrives with the page size the caller asked for, or the default:",[487,791,792,802],{},[490,793,794],{},[493,795,796,799],{},[496,797,798],{},"Caller sends",[496,800,801],{},"Connector receives",[503,803,804,831,850,870,885],{},[493,805,806,812],{},[508,807,808,809],{},"No ",[524,810,811],{},"limit",[508,813,814,817,818,820,821,823,824,827,828],{},[524,815,816],{},"limit: 100",", or the value of ",[564,819],{"name":566,"section":567},". No ",[524,822,811],{}," when ",[524,825,826],{},"config.yaml"," sets ",[524,829,830],{},"query_limit_default: null",[493,832,833,838],{},[508,834,835],{},[524,836,837],{},"limit=25",[508,839,840,843,844,846,847,849],{},[524,841,842],{},"limit: 25",". Callers can set ",[524,845,811],{}," only when ",[524,848,788],{}," declares it",[493,851,852,860],{},[508,853,854,746,857],{},[524,855,856],{},"limit=-1",[524,858,859],{},"limit=0",[508,861,808,862,823,864,866,867,869],{},[524,863,811],{},[564,865],{"name":580,"section":567}," is unset. Return every matching item. When the maximum is set, ",[524,868,811],{}," is the maximum",[493,871,872,879],{},[508,873,874,876,877],{},[524,875,811],{}," above ",[564,878],{"name":580,"section":567},[508,880,881,882],{},"Nothing; the instance rejects the request with ",[524,883,884],{},"Cannot set \"limit\" above the max",[493,886,887,899],{},[508,888,889,891,892,895,896],{},[524,890,811],{}," below ",[524,893,894],{},"-1",", or a negative ",[524,897,898],{},"offset",[508,900,901,902,904,905,907,908,910],{},"Nothing; the instance rejects the request. ",[524,903,811],{}," is an integer from ",[524,906,894],{}," up, and ",[524,909,898],{}," a non-negative integer",[459,912,913,914,917,918,921,922,924,925,927,928,931,932,934,935,937,938,941,942,944,945,947,948,950,951,955],{},"The default isn't checked against the maximum. With a default of ",[524,915,916],{},"100"," and a maximum of ",[524,919,920],{},"25",", a read without ",[524,923,811],{}," still arrives with ",[524,926,816],{},". A configured default of ",[524,929,930],{},"0"," isn't a caller's ",[524,933,859],{},": reads without ",[524,936,811],{}," then arrive with ",[524,939,940],{},"limit: 0"," and return no items. Reads the instance issues on its own can carry other limits. A to-many relation include follows the same rules for its own ",[524,943,811],{},". It arrives as one batched read only when it resolves to no ",[524,946,811],{}," and no ",[524,949,898],{},", and otherwise as one read per distinct, non-null parent key, sent one after another; see ",[468,952,954],{"href":953},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi#relation-reads","Relation Reads"," for every case.",[459,957,958,959,961,962,964,965,967,968,970,971,974,975,978,979,683],{},"A connector receives the default ",[524,960,811],{}," even when its ",[524,963,788],{}," declares no ",[524,966,811],{},". Count requests are different: they carry ",[524,969,940],{}," and ",[524,972,973],{},"count: true",", and expect ",[524,976,977],{},"totalCount"," with no items. See ",[468,980,982],{"href":981},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fapi#count-reads","Count Reads",[459,984,985,986,988],{},"A connector declares no ceiling of its own. When an external data source caps its page size, the connector must page internally until it fills ",[524,987,811],{},", because a short page reads as the last page.",[459,990,991,992,994,995,998],{},"A read without ",[524,993,811],{}," isn't streamed. The connector answers with every matching item in one ",[524,996,997],{},"records"," array, and the instance holds the whole answer in memory. Bound it with a fetch budget in the connector, and throw when the budget runs out: the instance reads a partial answer as the complete result.",[455,1000,1002],{"id":1001},"one-file-no-imports","One File, No Imports",[459,1004,1005,1006,1009],{},"The instance loads exactly one file per entry: the manifest's ",[524,1007,1008],{},"engine.entrypoint",". Its module loader refuses every other module.",[487,1011,1012,1022],{},[490,1013,1014],{},[493,1015,1016,1019],{},[496,1017,1018],{},"In the entry file",[496,1020,1021],{},"Result",[503,1023,1024,1041,1052,1066],{},[493,1025,1026,1035],{},[508,1027,1028,1029,742,1032],{},"Static ",[524,1030,1031],{},"import",[524,1033,1034],{},"export ... from",[508,1036,1037,1038],{},"The file fails to load with ",[524,1039,1040],{},"an extension cannot import \u003Cspecifier> from \u003Creferrer>",[493,1042,1043,1049],{},[508,1044,1045,1046],{},"Dynamic ",[524,1047,1048],{},"import()",[508,1050,1051],{},"The returned promise rejects with the same message when the call runs",[493,1053,1054,1059],{},[508,1055,1056],{},[524,1057,1058],{},"require()",[508,1060,1061,1062,1065],{},"Throws at runtime; ",[524,1063,1064],{},"require"," isn't defined",[493,1067,1068,1074],{},[508,1069,1070,1071,1073],{},"No default export, or a default export without a ",[524,1072,526],{}," function",[508,1075,1037,1076,1079],{},[524,1077,1078],{},"the entrypoint's default export must be a descriptor with a \\","setup` function`",[459,1081,1082,1083,1086,1087,1089,1090,1093,1094,683],{},"A file that fails to load deactivates its data sources until the extension is reloaded. ",[524,1084,1085],{},"monospace extension build"," checks each bundle for imports and the default export before it writes that bundle. It doesn't run the file, so a default export without a ",[524,1088,526],{}," function passes the build and fails at load. A failed build without ",[524,1091,1092],{},"--watch"," leaves the previous output in place. See ",[468,1095,370],{"href":1096},"\u002Freference\u002Fextensions\u002Fcli#fix-common-errors",[455,1098,1100],{"id":1099},"available-globals","Available Globals",[459,1102,1103],{},"The worker is a Deno isolate with web platform APIs and no Node layer.",[487,1105,1106,1119],{},[490,1107,1108],{},[493,1109,1110,1113,1116],{},[496,1111,1112],{},"Available",[496,1114,1115],{},"Not available",[496,1117,1118],{},"Result when used",[503,1120,1121,1171,1191,1205,1219,1231,1247],{},[493,1122,1123,1156,1165],{},[508,1124,1125,742,1127,742,1130,742,1133,742,1136,742,1139,742,1142,742,1145,742,1148,742,1151,742,1154],{},[524,1126,761],{},[524,1128,1129],{},"URL",[524,1131,1132],{},"crypto",[524,1134,1135],{},"TextEncoder",[524,1137,1138],{},"TextDecoder",[524,1140,1141],{},"ReadableStream",[524,1143,1144],{},"AbortController",[524,1146,1147],{},"AbortSignal.timeout",[524,1149,1150],{},"setTimeout",[524,1152,1153],{},"structuredClone",[524,1155,709],{},[508,1157,1158,1161,1162,1164],{},[524,1159,1160],{},"node:*"," modules, ",[524,1163,1064],{},", npm packages at runtime",[508,1166,1167,1168,1170],{},"The file fails to load, or ",[524,1169,1064],{}," is undefined",[493,1172,1173,1175,1185],{},[508,1174],{},[508,1176,1177,1178,742,1181,1184],{},"File reads and writes (",[524,1179,1180],{},"Deno.readTextFile",[524,1182,1183],{},"Deno.writeTextFile",")",[508,1186,1187,1188],{},"Throws ",[524,1189,1190],{},"NotCapable",[493,1192,1193,1195,1201],{},[508,1194],{},[508,1196,1197,1198,1184],{},"Environment variables (",[524,1199,1200],{},"Deno.env",[508,1202,1187,1203],{},[524,1204,1190],{},[493,1206,1207,1209,1215],{},[508,1208],{},[508,1210,1211,1212,1184],{},"Subprocesses (",[524,1213,1214],{},"Deno.Command",[508,1216,1187,1217],{},[524,1218,1190],{},[493,1220,1221,1223,1228],{},[508,1222],{},[508,1224,1225],{},[524,1226,1227],{},"Worker",[508,1229,1230],{},"Throws; web workers are disabled",[493,1232,1233,1235,1244],{},[508,1234],{},[508,1236,1237,1238,742,1241,1184],{},"stdin, stdout, stderr (",[524,1239,1240],{},"Deno.stdout",[524,1242,1243],{},"Deno.stderr",[508,1245,1246],{},"Reads get nothing; writes are discarded",[493,1248,1249,1251,1254],{},[508,1250],{},[508,1252,1253],{},"Hosts outside the data source's grant",[508,1255,1256,1258,1259,1261,1262,1265,1266],{},[524,1257,761],{}," rejects with ",[524,1260,1190],{},". Keep it as the ",[524,1263,1264],{},"cause"," when you wrap it. See ",[468,1267,1269],{"href":1268},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions#handle-a-denied-request","Handle a Denied Request",[459,1271,1272,1274,1275,1278],{},[524,1273,709],{}," output goes to the instance log at info level, tagged with the data source and provider. Unbounded recursion throws a catchable ",[524,1276,1277],{},"RangeError"," instead of crashing the worker.",[459,1280,1281,1284,1285,683],{},[524,1282,1283],{},"Deno.exit()"," ends only the worker, not the instance. The instance replaces the worker as described in ",[468,1286,687],{"href":536},[455,1288,1290],{"id":1289},"concurrency","Concurrency",[459,1292,1293],{},"Each data source gets its own isolate on its own thread. Two data sources that use the same connector share no memory.",[459,1295,1296,1297,1299],{},"Inside one isolate, requests run concurrently. The instance dispatches each request as soon as it arrives, without waiting for earlier ones to finish. Treat everything you create in ",[524,1298,526],{}," as shared between in-flight requests:",[715,1301,1302,1307,1310],{},[695,1303,1304,1305,683],{},"Don't keep per-request state in variables created by ",[524,1306,526],{},[695,1308,1309],{},"Guard shared caches and token refreshes against concurrent callers.",[695,1311,1312,1313,1316],{},"Limit concurrent calls yourself when the external data source rate-limits. The instance puts no cap on how many requests run at once, and a per-request deadline bounds how long each call waits, not how many run. Engine runs the ",[468,1314,1315],{"href":953},"per-parent reads"," of one included relation up to 16 at a time, and concurrent caller requests each get their own 16.",[459,1318,1319,1320,1322,1323,1325],{},"State in the isolate lasts until the worker restarts. A restart follows an extension reload, an unresponsive worker, a crash or ",[524,1321,1283],{},", and runs ",[524,1324,526],{}," again.",[455,1327,1329],{"id":1328},"user-agent","User Agent",[459,1331,1332,1333,1335,1336,1339],{},"Requests from ",[524,1334,761],{}," carry the default user agent ",[524,1337,1338],{},"Monospace\u002F0.1.0",". The version is the runtime component's, not your instance's release.",[459,1341,1342,1343,1346,1347,1349],{},"A ",[524,1344,1345],{},"User-Agent"," header you set on a ",[524,1348,761],{}," call replaces the default. Set it when the external data source asks clients to identify themselves.",[455,1351,1353],{"id":1352},"see-also","See Also",[715,1355,1356,1362,1372,1379],{},[695,1357,1358,1361],{},[468,1359,237],{"href":1360},"\u002Fdeveloper\u002Fextensions\u002Fdata-connectors\u002Fruntime",": the worker model and data source lifecycle",[695,1363,1364,1367,1368,1371],{},[468,1365,432],{"href":1366},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Fpermissions",": ",[524,1369,1370],{},"net:"," grants and denied requests",[695,1373,1374,1378],{},[468,1375,1377],{"href":1376},"\u002Freference\u002Fextensions\u002Fdata-connectors\u002Flimitations","Data Connector Limitations",": what a connector can't express today",[695,1380,1381,1384],{},[468,1382,370],{"href":1383},"\u002Freference\u002Fextensions\u002Fcli",": build-time checks for the one-file rule",{"title":1386,"searchDepth":1387,"depth":1387,"links":1388},"",2,[1389,1390,1392,1393,1394,1395,1396,1397,1398,1399],{"id":457,"depth":1387,"text":143},{"id":606,"depth":1387,"text":1391},"Module Evaluation and setup",{"id":686,"depth":1387,"text":687},{"id":734,"depth":1387,"text":735},{"id":781,"depth":1387,"text":782},{"id":1001,"depth":1387,"text":1002},{"id":1099,"depth":1387,"text":1100},{"id":1289,"depth":1387,"text":1290},{"id":1328,"depth":1387,"text":1329},{"id":1352,"depth":1387,"text":1353},"Hard numbers and fixed rules for data connector extensions at runtime, and the error or behavior each one produces.","md",null,{},{"title":422,"icon":425},{"title":447,"description":1400},"830uK4L3OKVJayR3WbBVbhS4grxWoYzE0n2g2wlgQZM",[1408,1410],{"title":148,"path":418,"stem":419,"description":1409,"icon":420,"children":-1},"Reference for the error classes a data connector extension throws, their codes, and how Engine treats and reports each one.",{"title":427,"path":428,"stem":429,"description":1411,"icon":430,"children":-1},"Review what a data connector extension can't do today, what happens when an external data source needs it, and how to work around it.",1790840089173]