uomtiles 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +15 -0
- package/.output/public/_nuxt/1d1PDhA4.js +1 -0
- package/.output/public/_nuxt/3B2XYGg4.js +1 -0
- package/.output/public/_nuxt/981KwFWf.js +1 -0
- package/.output/public/_nuxt/B30dSvM4.js +1 -0
- package/.output/public/_nuxt/BN1Gp4Dm.js +1 -0
- package/.output/public/_nuxt/BQlj8Xoe.js +6 -0
- package/.output/public/_nuxt/BRkljK8J.js +1 -0
- package/.output/public/_nuxt/BSdHYVlE2.js +1 -0
- package/.output/public/_nuxt/B_MqTg2k2.js +1 -0
- package/.output/public/_nuxt/BiWblTbb2.js +64 -0
- package/.output/public/_nuxt/BrPwntMr.js +1 -0
- package/.output/public/_nuxt/BskybydR.js +1 -0
- package/.output/public/_nuxt/ByRlKR9F.js +1 -0
- package/.output/public/_nuxt/C0Zdl2EE2.js +1 -0
- package/.output/public/_nuxt/C4qlzA4o.js +1 -0
- package/.output/public/_nuxt/C7HxHbxA.js +1 -0
- package/.output/public/_nuxt/C97TfNgP.js +3 -0
- package/.output/public/_nuxt/CNs_Ozdc.js +1 -0
- package/.output/public/_nuxt/CPuhwLY1.js +1 -0
- package/.output/public/_nuxt/CVE291Pi.js +1 -0
- package/.output/public/_nuxt/C_0VY3Cv2.js +4 -0
- package/.output/public/_nuxt/Ce26t8_Y.js +1 -0
- package/.output/public/_nuxt/CfW544W5.js +1 -0
- package/.output/public/_nuxt/CgMd2Y5s.js +2 -0
- package/.output/public/_nuxt/CgdzV712.js +1 -0
- package/.output/public/_nuxt/D1wVNWS0.js +1 -0
- package/.output/public/_nuxt/DC3bhq63.js +1 -0
- package/.output/public/_nuxt/DK3Fl9T5.js +1 -0
- package/.output/public/_nuxt/DL1MZZLI.js +1 -0
- package/.output/public/_nuxt/DXm-42Fi.js +1 -0
- package/.output/public/_nuxt/Djg3Kzfv.js +1 -0
- package/.output/public/_nuxt/DkcySee1.js +1 -0
- package/.output/public/_nuxt/DmN-PKW1.js +1 -0
- package/.output/public/_nuxt/DtFVCXI9.js +1 -0
- package/.output/public/_nuxt/Dz7VMlHR.js +1 -0
- package/.output/public/_nuxt/NL65vbjG2.js +1 -0
- package/.output/public/_nuxt/Oxy7pKSk.js +3 -0
- package/.output/public/_nuxt/Pik8or8N2.js +1 -0
- package/.output/public/_nuxt/XZ59tThl.js +1 -0
- package/.output/public/_nuxt/ZpWjFsgV.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -0
- package/.output/public/_nuxt/builds/meta/9f85104e-738d-4a74-8daa-40b136ce17d5.json +1 -0
- package/.output/public/_nuxt/dXz6dFgW2.js +1 -0
- package/.output/public/_nuxt/entry.P6tFNE31.css +1 -0
- package/.output/public/_nuxt/error-404.Biv0P6cJ.css +1 -0
- package/.output/public/_nuxt/error-500.8ok468rV.css +1 -0
- package/.output/public/_nuxt/j0MRD-c3.js +1 -0
- package/.output/public/_nuxt/local-pixel-diff.worker-C6RdZoCq.js +2 -0
- package/.output/public/_nuxt/maplibre-gl-worker.nfnkSQvL.mjs +6 -0
- package/.output/public/_nuxt/nearest-area.worker-iSLH0Y_s.js +2 -0
- package/.output/public/_nuxt/q7DkoVkj.js +828 -0
- package/.output/public/_nuxt/raster-tile.worker-BFlOgJig.js +2 -0
- package/.output/public/_nuxt/services._3nQizF8.css +1 -0
- package/.output/public/_nuxt/sql-wasm.DfANybxk.wasm +0 -0
- package/.output/public/_nuxt/tile-diff.worker-CvWWI_eu.js +1 -0
- package/.output/public/_nuxt/zZ1EGR7Y.js +1 -0
- package/.output/public/apple-touch-icon.png +0 -0
- package/.output/public/favicon.ico +0 -0
- package/.output/public/favicon.svg +8 -0
- package/.output/public/icon-192.png +0 -0
- package/.output/public/icon-512.png +0 -0
- package/.output/public/site.webmanifest +11 -0
- package/.output/server/chunks/_/config.mjs +208 -0
- package/.output/server/chunks/_/config.mjs.map +1 -0
- package/.output/server/chunks/_/data-directory.mjs +24 -0
- package/.output/server/chunks/_/data-directory.mjs.map +1 -0
- package/.output/server/chunks/_/error-500.mjs +20 -0
- package/.output/server/chunks/_/error-500.mjs.map +1 -0
- package/.output/server/chunks/_/file-workspace.mjs +910 -0
- package/.output/server/chunks/_/file-workspace.mjs.map +1 -0
- package/.output/server/chunks/_/icons.mjs +6269 -0
- package/.output/server/chunks/_/icons.mjs.map +1 -0
- package/.output/server/chunks/_/map-service.mjs +233 -0
- package/.output/server/chunks/_/map-service.mjs.map +1 -0
- package/.output/server/chunks/_/missing-tile.mjs +104 -0
- package/.output/server/chunks/_/missing-tile.mjs.map +1 -0
- package/.output/server/chunks/_/pixel-diff.mjs +78 -0
- package/.output/server/chunks/_/pixel-diff.mjs.map +1 -0
- package/.output/server/chunks/_/uom-auth.mjs +334 -0
- package/.output/server/chunks/_/uom-auth.mjs.map +1 -0
- package/.output/server/chunks/_/uom-map.mjs +265 -0
- package/.output/server/chunks/_/uom-map.mjs.map +1 -0
- package/.output/server/chunks/build/Alert-0ngTJXxP.mjs +5076 -0
- package/.output/server/chunks/build/Alert-0ngTJXxP.mjs.map +1 -0
- package/.output/server/chunks/build/DashboardSidebarToggle-pncTaIJq.mjs +569 -0
- package/.output/server/chunks/build/DashboardSidebarToggle-pncTaIJq.mjs.map +1 -0
- package/.output/server/chunks/build/Empty-CkW3mADt.mjs +359 -0
- package/.output/server/chunks/build/Empty-CkW3mADt.mjs.map +1 -0
- package/.output/server/chunks/build/FocusScope-Cf0lg0zt.mjs +207 -0
- package/.output/server/chunks/build/FocusScope-Cf0lg0zt.mjs.map +1 -0
- package/.output/server/chunks/build/FormField-CEUZHcv7.mjs +278 -0
- package/.output/server/chunks/build/FormField-CEUZHcv7.mjs.map +1 -0
- package/.output/server/chunks/build/Input-BeNavYXb.mjs +592 -0
- package/.output/server/chunks/build/Input-BeNavYXb.mjs.map +1 -0
- package/.output/server/chunks/build/MapBaseLayerTabs-4445J6yh.mjs +2003 -0
- package/.output/server/chunks/build/MapBaseLayerTabs-4445J6yh.mjs.map +1 -0
- package/.output/server/chunks/build/Modal-DNZtVxca.mjs +1326 -0
- package/.output/server/chunks/build/Modal-DNZtVxca.mjs.map +1 -0
- package/.output/server/chunks/build/OnlineMap-CKwiuqUY.mjs +146 -0
- package/.output/server/chunks/build/OnlineMap-CKwiuqUY.mjs.map +1 -0
- package/.output/server/chunks/build/Pagination-CDHx4HTZ.mjs +1025 -0
- package/.output/server/chunks/build/Pagination-CDHx4HTZ.mjs.map +1 -0
- package/.output/server/chunks/build/PopperArrow-Bqfdf2Et.mjs +2066 -0
- package/.output/server/chunks/build/PopperArrow-Bqfdf2Et.mjs.map +1 -0
- package/.output/server/chunks/build/ScrollArea-BQK3em8b.mjs +379 -0
- package/.output/server/chunks/build/ScrollArea-BQK3em8b.mjs.map +1 -0
- package/.output/server/chunks/build/Slider-D-n8Y0CX.mjs +1087 -0
- package/.output/server/chunks/build/Slider-D-n8Y0CX.mjs.map +1 -0
- package/.output/server/chunks/build/Tooltip-CkpSktvJ.mjs +1345 -0
- package/.output/server/chunks/build/Tooltip-CkpSktvJ.mjs.map +1 -0
- package/.output/server/chunks/build/_virtual_public-CeOptKUP.mjs +7 -0
- package/.output/server/chunks/build/_virtual_public-CeOptKUP.mjs.map +1 -0
- package/.output/server/chunks/build/advanced-D1onodoF.mjs +1430 -0
- package/.output/server/chunks/build/advanced-D1onodoF.mjs.map +1 -0
- package/.output/server/chunks/build/compare-DmSAW8oA.mjs +1093 -0
- package/.output/server/chunks/build/compare-DmSAW8oA.mjs.map +1 -0
- package/.output/server/chunks/build/dashboard-BJxrZ19n.mjs +3217 -0
- package/.output/server/chunks/build/dashboard-BJxrZ19n.mjs.map +1 -0
- package/.output/server/chunks/build/details-CBMqXYyo.mjs +3714 -0
- package/.output/server/chunks/build/details-CBMqXYyo.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-D9aQjJRn.mjs +86 -0
- package/.output/server/chunks/build/error-404-D9aQjJRn.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-styles.DciiguV6.mjs +9 -0
- package/.output/server/chunks/build/error-404-styles.DciiguV6.mjs.map +1 -0
- package/.output/server/chunks/build/error-500-BNyA3wrb.mjs +74 -0
- package/.output/server/chunks/build/error-500-BNyA3wrb.mjs.map +1 -0
- package/.output/server/chunks/build/error-500-styles.C562DYMR.mjs +9 -0
- package/.output/server/chunks/build/error-500-styles.C562DYMR.mjs.map +1 -0
- package/.output/server/chunks/build/esm-Dp2lJXbp.mjs +1121 -0
- package/.output/server/chunks/build/esm-Dp2lJXbp.mjs.map +1 -0
- package/.output/server/chunks/build/interval-BxUMpo78.mjs +411 -0
- package/.output/server/chunks/build/interval-BxUMpo78.mjs.map +1 -0
- package/.output/server/chunks/build/login-lbtjN0MV.mjs +642 -0
- package/.output/server/chunks/build/login-lbtjN0MV.mjs.map +1 -0
- package/.output/server/chunks/build/pages-Ba0Eixbd.mjs +220 -0
- package/.output/server/chunks/build/pages-Ba0Eixbd.mjs.map +1 -0
- package/.output/server/chunks/build/services-DuJwjAB8.mjs +3005 -0
- package/.output/server/chunks/build/services-DuJwjAB8.mjs.map +1 -0
- package/.output/server/chunks/build/services-styles.eoO16BY9.mjs +9 -0
- package/.output/server/chunks/build/services-styles.eoO16BY9.mjs.map +1 -0
- package/.output/server/chunks/build/tasks-CyN9x492.mjs +915 -0
- package/.output/server/chunks/build/tasks-CyN9x492.mjs.map +1 -0
- package/.output/server/chunks/build/tasks-D_Q5EDnn.mjs +87 -0
- package/.output/server/chunks/build/tasks-D_Q5EDnn.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +6215 -0
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/captcha.post.mjs +21 -0
- package/.output/server/chunks/routes/api/auth/captcha.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/login.post.mjs +27 -0
- package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +22 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/map-token.post.mjs +22 -0
- package/.output/server/chunks/routes/api/auth/map-token.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/send-sms.post.mjs +31 -0
- package/.output/server/chunks/routes/api/auth/send-sms.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/status.get.mjs +21 -0
- package/.output/server/chunks/routes/api/auth/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/base/_baseLayer/_zoom/_tileX/_tileY_.get.mjs +44 -0
- package/.output/server/chunks/routes/api/map/base/_baseLayer/_zoom/_tileX/_tileY_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/live/status.get.mjs +32 -0
- package/.output/server/chunks/routes/api/map/live/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/online/_layerGroup/_zoom/_tileX/_tileY_.get.mjs +48 -0
- package/.output/server/chunks/routes/api/map/online/_layerGroup/_zoom/_tileX/_tileY_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/online-root/_layerGroup/_rootX/_rootY_.get.mjs +46 -0
- package/.output/server/chunks/routes/api/map/online-root/_layerGroup/_rootX/_rootY_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/config.post.mjs +38 -0
- package/.output/server/chunks/routes/api/map-service/config.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/file.post.mjs +41 -0
- package/.output/server/chunks/routes/api/map-service/file.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/source.post.mjs +35 -0
- package/.output/server/chunks/routes/api/map-service/source.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/status.get.mjs +32 -0
- package/.output/server/chunks/routes/api/map-service/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/analysis.get.mjs +47 -0
- package/.output/server/chunks/routes/api/workspace/_filename/analysis.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/download.get.mjs +38 -0
- package/.output/server/chunks/routes/api/workspace/_filename/download.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/export/_format_.get.mjs +42 -0
- package/.output/server/chunks/routes/api/workspace/_filename/export/_format_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tile.get.mjs +48 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tile.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tiles.get.mjs +45 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tiles.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename_.delete.mjs +32 -0
- package/.output/server/chunks/routes/api/workspace/_filename_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/compare/batch.get.mjs +38 -0
- package/.output/server/chunks/routes/api/workspace/compare/batch.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/compare.post.mjs +33 -0
- package/.output/server/chunks/routes/api/workspace/compare.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/fetch.post.mjs +33 -0
- package/.output/server/chunks/routes/api/workspace/fetch.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/files.get.mjs +27 -0
- package/.output/server/chunks/routes/api/workspace/files.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/files.post.mjs +38 -0
- package/.output/server/chunks/routes/api/workspace/files.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/stop.post.mjs +32 -0
- package/.output/server/chunks/routes/api/workspace/stop.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/tasks.post.mjs +36 -0
- package/.output/server/chunks/routes/api/workspace/tasks.post.mjs.map +1 -0
- package/.output/server/chunks/routes/renderer.mjs +422 -0
- package/.output/server/chunks/routes/renderer.mjs.map +1 -0
- package/.output/server/chunks/routes/services/wms.get.mjs +54 -0
- package/.output/server/chunks/routes/services/wms.get.mjs.map +1 -0
- package/.output/server/chunks/routes/services/wmts.get.mjs +54 -0
- package/.output/server/chunks/routes/services/wmts.get.mjs.map +1 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs.map +1 -0
- package/.output/server/chunks/virtual/entry.mjs +18545 -0
- package/.output/server/chunks/virtual/entry.mjs.map +1 -0
- package/.output/server/chunks/virtual/precomputed.mjs +4 -0
- package/.output/server/chunks/virtual/precomputed.mjs.map +1 -0
- package/.output/server/chunks/virtual/styles.mjs +10 -0
- package/.output/server/chunks/virtual/styles.mjs.map +1 -0
- package/.output/server/index.mjs +12 -0
- package/.output/server/index.mjs.map +1 -0
- package/.output/server/node_modules/@babel/parser/lib/index.js +14611 -0
- package/.output/server/node_modules/@babel/parser/package.json +50 -0
- package/.output/server/node_modules/@iconify/utils/lib/colors/index.js +295 -0
- package/.output/server/node_modules/@iconify/utils/lib/colors/keywords.js +701 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/common.js +75 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/format.js +39 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/icon.js +47 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/icons.js +128 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/bool.js +19 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/defaults.js +13 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/flip.js +17 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/merge.js +16 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/rotate.js +30 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/cleanup.js +78 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/convert.js +100 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/data.js +28 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/format.js +58 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/parse.js +48 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/base.js +203 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/create.js +33 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/numbers.js +132 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/similar.js +165 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/tree.js +79 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/find.js +92 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/replace.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/components.js +76 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/missing.js +66 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/name.js +45 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/parse.js +103 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/similar.js +36 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/tree.js +92 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/variations.js +62 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/defaults.js +25 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/merge.js +16 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/name.js +57 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/square.js +33 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/transformations.js +12 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/convert-info.js +125 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/expand.js +19 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icon.js +25 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icons.js +36 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/minify.js +91 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/parse.js +46 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/tree.js +23 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate-basic.js +42 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate.js +123 -0
- package/.output/server/node_modules/@iconify/utils/lib/index.js +52 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/custom.js +30 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/loader.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/modern.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/utils.js +105 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/objects.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/strings.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/title.js +9 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/build.js +113 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/defs.js +31 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.js +13 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/html.js +9 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/id.js +41 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/inner-html.js +22 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/parse.js +67 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/pretty.js +54 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/size.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/trim.js +7 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/url.js +22 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/viewbox.js +8 -0
- package/.output/server/node_modules/@iconify/utils/package.json +119 -0
- package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6801 -0
- package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
- package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +692 -0
- package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
- package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1420 -0
- package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
- package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1903 -0
- package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
- package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6976 -0
- package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
- package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1841 -0
- package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
- package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +904 -0
- package/.output/server/node_modules/@vue/server-renderer/package.json +53 -0
- package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +609 -0
- package/.output/server/node_modules/@vue/shared/package.json +47 -0
- package/.output/server/node_modules/consola/dist/chunks/prompt.mjs +280 -0
- package/.output/server/node_modules/consola/dist/core.mjs +512 -0
- package/.output/server/node_modules/consola/dist/index.mjs +651 -0
- package/.output/server/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
- package/.output/server/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
- package/.output/server/node_modules/consola/package.json +136 -0
- package/.output/server/node_modules/devalue/index.js +17 -0
- package/.output/server/node_modules/devalue/package.json +39 -0
- package/.output/server/node_modules/devalue/src/base64.js +60 -0
- package/.output/server/node_modules/devalue/src/constants.js +12 -0
- package/.output/server/node_modules/devalue/src/operations.js +193 -0
- package/.output/server/node_modules/devalue/src/parse.js +270 -0
- package/.output/server/node_modules/devalue/src/stringify.js +428 -0
- package/.output/server/node_modules/devalue/src/uneval.js +582 -0
- package/.output/server/node_modules/devalue/src/utils.js +185 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
- package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
- package/.output/server/node_modules/entities/package.json +120 -0
- package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
- package/.output/server/node_modules/estree-walker/package.json +37 -0
- package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
- package/.output/server/node_modules/fflate/package.json +128 -0
- package/.output/server/node_modules/fnv1a-64/dist/index.mjs +95 -0
- package/.output/server/node_modules/fnv1a-64/package.json +75 -0
- package/.output/server/node_modules/hookable/dist/index.mjs +257 -0
- package/.output/server/node_modules/hookable/package.json +53 -0
- package/.output/server/node_modules/nostics/dist/formatters/ansi.mjs +19 -0
- package/.output/server/node_modules/nostics/dist/index.mjs +187 -0
- package/.output/server/node_modules/nostics/package.json +125 -0
- package/.output/server/node_modules/object-identity/index.js +60 -0
- package/.output/server/node_modules/object-identity/package.json +40 -0
- package/.output/server/node_modules/p-limit/index.js +104 -0
- package/.output/server/node_modules/p-limit/package.json +58 -0
- package/.output/server/node_modules/pmtiles/dist/esm/index.js +2 -0
- package/.output/server/node_modules/pmtiles/package.json +50 -0
- package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
- package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
- package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
- package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
- package/.output/server/node_modules/source-map-js/package.json +71 -0
- package/.output/server/node_modules/source-map-js/source-map.js +8 -0
- package/.output/server/node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs +1 -0
- package/.output/server/node_modules/tailwindcss/dist/colors.mjs +1 -0
- package/.output/server/node_modules/tailwindcss/package.json +89 -0
- package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
- package/.output/server/node_modules/ufo/package.json +48 -0
- package/.output/server/node_modules/unhead/dist/client.mjs +22 -0
- package/.output/server/node_modules/unhead/dist/index.mjs +52 -0
- package/.output/server/node_modules/unhead/dist/legacy.mjs +33 -0
- package/.output/server/node_modules/unhead/dist/minify.mjs +183 -0
- package/.output/server/node_modules/unhead/dist/parser.mjs +518 -0
- package/.output/server/node_modules/unhead/dist/plugins.mjs +631 -0
- package/.output/server/node_modules/unhead/dist/scripts.node.mjs +6 -0
- package/.output/server/node_modules/unhead/dist/server.mjs +99 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BEmVMkeA.mjs +673 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BGFxPGPQ.mjs +47 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BQWSw36o.mjs +192 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bb4d5b9h.mjs +67 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BdK3SLPN.mjs +585 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bf_fPVYA.mjs +6 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bm4Y6XQI.mjs +17 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.C3b2Ipoj.mjs +223 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CGPOfp5O.mjs +32 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CHEy9ana.mjs +7 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CTjuIdzk.mjs +27 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CfKy3Kuq.mjs +196 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.D7HkBzZn.mjs +59 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.DNKiVLV7.mjs +400 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.MC5RsXLj.mjs +19 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.jEy9BmRq.mjs +264 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.tQnRaXfX.mjs +240 -0
- package/.output/server/node_modules/unhead/dist/stream/client.mjs +28 -0
- package/.output/server/node_modules/unhead/dist/stream/iife.mjs +2 -0
- package/.output/server/node_modules/unhead/dist/stream/server.mjs +264 -0
- package/.output/server/node_modules/unhead/dist/utils.mjs +7 -0
- package/.output/server/node_modules/unhead/package.json +179 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
- package/.output/server/node_modules/vue/index.js +7 -0
- package/.output/server/node_modules/vue/index.mjs +1 -0
- package/.output/server/node_modules/vue/package.json +112 -0
- package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
- package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +278 -0
- package/.output/server/node_modules/vue-bundle-renderer/package.json +54 -0
- package/.output/server/node_modules/yocto-queue/index.js +90 -0
- package/.output/server/node_modules/yocto-queue/package.json +48 -0
- package/.output/server/node_modules/zod/index.js +4 -0
- package/.output/server/node_modules/zod/package.json +135 -0
- package/.output/server/node_modules/zod/v4/classic/checks.js +1 -0
- package/.output/server/node_modules/zod/v4/classic/coerce.js +17 -0
- package/.output/server/node_modules/zod/v4/classic/compat.js +31 -0
- package/.output/server/node_modules/zod/v4/classic/errors.js +48 -0
- package/.output/server/node_modules/zod/v4/classic/external.js +20 -0
- package/.output/server/node_modules/zod/v4/classic/from-json-schema.js +599 -0
- package/.output/server/node_modules/zod/v4/classic/iso.js +30 -0
- package/.output/server/node_modules/zod/v4/classic/package.json +7 -0
- package/.output/server/node_modules/zod/v4/classic/parse.js +15 -0
- package/.output/server/node_modules/zod/v4/classic/schemas.js +1395 -0
- package/.output/server/node_modules/zod/v4/core/api.js +1087 -0
- package/.output/server/node_modules/zod/v4/core/checks.js +575 -0
- package/.output/server/node_modules/zod/v4/core/core.js +78 -0
- package/.output/server/node_modules/zod/v4/core/doc.js +35 -0
- package/.output/server/node_modules/zod/v4/core/errors.js +185 -0
- package/.output/server/node_modules/zod/v4/core/index.js +16 -0
- package/.output/server/node_modules/zod/v4/core/json-schema-generator.js +95 -0
- package/.output/server/node_modules/zod/v4/core/json-schema-processors.js +601 -0
- package/.output/server/node_modules/zod/v4/core/json-schema.js +1 -0
- package/.output/server/node_modules/zod/v4/core/package.json +7 -0
- package/.output/server/node_modules/zod/v4/core/parse.js +93 -0
- package/.output/server/node_modules/zod/v4/core/regexes.js +139 -0
- package/.output/server/node_modules/zod/v4/core/registries.js +51 -0
- package/.output/server/node_modules/zod/v4/core/schemas.js +2239 -0
- package/.output/server/node_modules/zod/v4/core/to-json-schema.js +448 -0
- package/.output/server/node_modules/zod/v4/core/util.js +674 -0
- package/.output/server/node_modules/zod/v4/core/versions.js +5 -0
- package/.output/server/node_modules/zod/v4/locales/ar.js +106 -0
- package/.output/server/node_modules/zod/v4/locales/az.js +105 -0
- package/.output/server/node_modules/zod/v4/locales/be.js +156 -0
- package/.output/server/node_modules/zod/v4/locales/bg.js +120 -0
- package/.output/server/node_modules/zod/v4/locales/ca.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/cs.js +111 -0
- package/.output/server/node_modules/zod/v4/locales/da.js +115 -0
- package/.output/server/node_modules/zod/v4/locales/de.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/el.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/en.js +113 -0
- package/.output/server/node_modules/zod/v4/locales/eo.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/es.js +132 -0
- package/.output/server/node_modules/zod/v4/locales/fa.js +114 -0
- package/.output/server/node_modules/zod/v4/locales/fi.js +112 -0
- package/.output/server/node_modules/zod/v4/locales/fr-CA.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/fr.js +125 -0
- package/.output/server/node_modules/zod/v4/locales/he.js +214 -0
- package/.output/server/node_modules/zod/v4/locales/hr.js +122 -0
- package/.output/server/node_modules/zod/v4/locales/hu.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/hy.js +147 -0
- package/.output/server/node_modules/zod/v4/locales/id.js +106 -0
- package/.output/server/node_modules/zod/v4/locales/index.js +52 -0
- package/.output/server/node_modules/zod/v4/locales/is.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/it.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ja.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/ka.js +112 -0
- package/.output/server/node_modules/zod/v4/locales/kh.js +5 -0
- package/.output/server/node_modules/zod/v4/locales/km.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/ko.js +111 -0
- package/.output/server/node_modules/zod/v4/locales/lt.js +203 -0
- package/.output/server/node_modules/zod/v4/locales/mk.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/ms.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/nl.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/no.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ota.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/package.json +7 -0
- package/.output/server/node_modules/zod/v4/locales/pl.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/ps.js +114 -0
- package/.output/server/node_modules/zod/v4/locales/pt.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ro.js +119 -0
- package/.output/server/node_modules/zod/v4/locales/ru.js +156 -0
- package/.output/server/node_modules/zod/v4/locales/sl.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/sv.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/ta.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/th.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/tr.js +105 -0
- package/.output/server/node_modules/zod/v4/locales/ua.js +5 -0
- package/.output/server/node_modules/zod/v4/locales/uk.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ur.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/uz.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/vi.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/yo.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/zh-CN.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/zh-TW.js +107 -0
- package/.output/server/package.json +37 -0
- package/LICENSE +3 -0
- package/README.md +125 -0
- package/dist/src/bbox.js +55 -0
- package/dist/src/cli.js +255 -0
- package/dist/src/config.js +56 -0
- package/dist/src/core/fetch-process.js +19 -0
- package/dist/src/core/grid-renderer.js +149 -0
- package/dist/src/core/lease.js +103 -0
- package/dist/src/core/paths.js +13 -0
- package/dist/src/core/png.js +192 -0
- package/dist/src/core/raster-style.js +33 -0
- package/dist/src/core/uomtiles.js +307 -0
- package/dist/src/fetcher.js +208 -0
- package/dist/src/geographic-grid.js +162 -0
- package/dist/src/grid-crawl.js +478 -0
- package/dist/src/mask-image.js +16 -0
- package/dist/src/official-grid.js +51 -0
- package/dist/src/quality.js +30 -0
- package/dist/src/token.js +206 -0
- package/package.json +68 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +8 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/site.webmanifest +11 -0
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { createServer } from 'node:net';
|
|
4
|
+
import { basename, dirname, extname, resolve } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { isSea } from 'node:sea';
|
|
8
|
+
import { defineCommand, runMain } from 'citty';
|
|
9
|
+
import { accountFile, uomtilesDataDir, workspaceDirectory } from "./core/paths.js";
|
|
10
|
+
import { DEFAULT_GRID_CRAWL_OPTIONS, runGridCrawl } from "./grid-crawl.js";
|
|
11
|
+
import { FETCH_PROCESS_ENV } from "./core/fetch-process.js";
|
|
12
|
+
import { diffUomtiles, exportTiles, inspectUomtiles, migrateToUomtiles } from "./core/uomtiles.js";
|
|
13
|
+
import { SPACE_APP_ID, UOM_BASE, LOCATION_SSO_PATH } from "./config.js";
|
|
14
|
+
const sea = isSea();
|
|
15
|
+
const cliPath = sea ? null : fileURLToPath(import.meta.url);
|
|
16
|
+
const compiled = cliPath ? extname(cliPath) === '.js' : false;
|
|
17
|
+
const root = cliPath ? (compiled ? resolve(dirname(cliPath), '../..') : resolve(dirname(cliPath), '..')) : process.cwd();
|
|
18
|
+
function readAccount() {
|
|
19
|
+
const path = accountFile();
|
|
20
|
+
if (!existsSync(path))
|
|
21
|
+
throw new Error(`尚未登录。请先运行 npx uomtiles 并在 Web 中登录(认证文件:${path})`);
|
|
22
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
23
|
+
}
|
|
24
|
+
async function whoami() {
|
|
25
|
+
const account = readAccount();
|
|
26
|
+
if (typeof account.sessionToken !== 'string')
|
|
27
|
+
throw new Error('固定认证文件中没有 UOM session token');
|
|
28
|
+
let response;
|
|
29
|
+
try {
|
|
30
|
+
response = await fetch(UOM_BASE + LOCATION_SSO_PATH, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: { Authorization: account.sessionToken, language: 'en-US', timezone: 'Asia/Shanghai', 'Content-Type': 'application/json' },
|
|
33
|
+
body: JSON.stringify({ appId: SPACE_APP_ID, location: '/spaceIndex', params: 'yxAppPath=space' }),
|
|
34
|
+
signal: AbortSignal.timeout(20_000),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
console.log(JSON.stringify({ authenticated: true, upstream: 'offline', nickname: account.username || null }, null, 2));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (response.status === 401 || response.status === 403) {
|
|
42
|
+
console.log(JSON.stringify({ authenticated: false, upstream: 'reauth-required', nickname: account.username || null }, null, 2));
|
|
43
|
+
process.exitCode = 1;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const body = await response.json();
|
|
47
|
+
const location = body.success === true && typeof body.data === 'string' ? new URL(body.data) : null;
|
|
48
|
+
console.log(JSON.stringify({ authenticated: Boolean(location), upstream: location ? 'ready' : 'invalid-response',
|
|
49
|
+
nickname: location?.searchParams.get('userName') || account.username || null }, null, 2));
|
|
50
|
+
if (!location)
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
}
|
|
53
|
+
function workspaceTaskPath(file) {
|
|
54
|
+
const account = readAccount();
|
|
55
|
+
const requested = file?.trim();
|
|
56
|
+
if (requested) {
|
|
57
|
+
if (requested !== basename(requested) || requested.includes('\\') || requested.includes('\0')) {
|
|
58
|
+
throw new Error('fetch 只接受工作区内的文件名,不接受路径');
|
|
59
|
+
}
|
|
60
|
+
const filename = requested.toLowerCase().endsWith('.uomtiles') ? requested : `${requested}.uomtiles`;
|
|
61
|
+
return resolve(workspaceDirectory(), filename);
|
|
62
|
+
}
|
|
63
|
+
const nickname = String(account.username || 'uom').replace(/[^a-zA-Z0-9_-]+/g, '_');
|
|
64
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
65
|
+
return resolve(workspaceDirectory(), `${nickname}-${stamp}.uomtiles`);
|
|
66
|
+
}
|
|
67
|
+
async function runChild(command, args, env = process.env) {
|
|
68
|
+
return await new Promise((resolveChild, reject) => {
|
|
69
|
+
const child = spawn(command, args, { cwd: process.cwd(), env, stdio: 'inherit' });
|
|
70
|
+
const forward = (signal) => {
|
|
71
|
+
if (!child.killed)
|
|
72
|
+
child.kill(signal);
|
|
73
|
+
};
|
|
74
|
+
const cleanup = () => {
|
|
75
|
+
process.off('SIGINT', forward);
|
|
76
|
+
process.off('SIGTERM', forward);
|
|
77
|
+
};
|
|
78
|
+
child.once('error', error => { cleanup(); reject(error); });
|
|
79
|
+
child.once('close', (code, signal) => { cleanup(); resolveChild(code ?? (signal ? 128 : 1)); });
|
|
80
|
+
process.once('SIGINT', forward);
|
|
81
|
+
process.once('SIGTERM', forward);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function fetchProcessSpec() {
|
|
85
|
+
if (sea)
|
|
86
|
+
return { command: process.execPath, args: ['fetch-child'] };
|
|
87
|
+
if (!cliPath)
|
|
88
|
+
throw new Error('CLI entry is unavailable');
|
|
89
|
+
return {
|
|
90
|
+
command: process.execPath,
|
|
91
|
+
args: compiled ? [cliPath, 'fetch-child'] : ['--experimental-strip-types', '--no-warnings', cliPath, 'fetch-child'],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function fetchEnvironment(filename, pretty) {
|
|
95
|
+
return {
|
|
96
|
+
...process.env,
|
|
97
|
+
UOMTILES_DATA_DIR: process.env.UOMTILES_DATA_DIR || uomtilesDataDir(),
|
|
98
|
+
UOMTILES_TASK_FILENAME: filename,
|
|
99
|
+
...(pretty ? { UOMTILES_PRETTY: '1' } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async function fetchTask(file, detached = false) {
|
|
103
|
+
readAccount();
|
|
104
|
+
const target = workspaceTaskPath(file);
|
|
105
|
+
if (existsSync(target) && !target.endsWith('.uomtiles'))
|
|
106
|
+
throw new Error('继续抓取只接受 .uomtiles 工作数据库');
|
|
107
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
108
|
+
const filename = basename(target);
|
|
109
|
+
const spec = fetchProcessSpec();
|
|
110
|
+
const env = fetchEnvironment(filename, !detached);
|
|
111
|
+
if (detached) {
|
|
112
|
+
const child = spawn(spec.command, spec.args, { cwd: process.cwd(), env, stdio: 'ignore', detached: true });
|
|
113
|
+
child.once('error', error => console.error(`后台抓取启动失败:${error.message}`));
|
|
114
|
+
child.unref();
|
|
115
|
+
console.log(`后台抓取已启动:${filename} (pid ${child.pid ?? 'unknown'})`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
console.log(`${existsSync(target) ? '继续' : '创建'}任务:${target}`);
|
|
119
|
+
process.exitCode = await runChild(spec.command, spec.args, env);
|
|
120
|
+
}
|
|
121
|
+
async function fetchChild(file) {
|
|
122
|
+
const auth = accountFile();
|
|
123
|
+
readAccount();
|
|
124
|
+
const target = workspaceTaskPath(file);
|
|
125
|
+
await runGridCrawl({ ...DEFAULT_GRID_CRAWL_OPTIONS, db: target, auth });
|
|
126
|
+
}
|
|
127
|
+
async function freePort(preferred) {
|
|
128
|
+
return await new Promise((resolvePort, reject) => {
|
|
129
|
+
const server = createServer();
|
|
130
|
+
server.once('error', reject);
|
|
131
|
+
server.listen(preferred, '127.0.0.1', () => {
|
|
132
|
+
const address = server.address();
|
|
133
|
+
const port = typeof address === 'object' && address ? address.port : preferred;
|
|
134
|
+
server.close(() => resolvePort(port));
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function openUrl(url) {
|
|
139
|
+
const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
|
|
140
|
+
const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
|
|
141
|
+
const child = spawn(command, args, { detached: true, stdio: 'ignore' });
|
|
142
|
+
child.on('error', () => { });
|
|
143
|
+
child.unref();
|
|
144
|
+
}
|
|
145
|
+
async function web() {
|
|
146
|
+
const entry = resolve(root, '.output/server/index.mjs');
|
|
147
|
+
if (!existsSync(entry))
|
|
148
|
+
throw new Error('Web 构建不存在;开发仓库请先运行 pnpm build');
|
|
149
|
+
const port = await freePort(Number(process.env.UOMTILES_PORT || 4173));
|
|
150
|
+
const dataDir = uomtilesDataDir();
|
|
151
|
+
mkdirSync(dataDir, { recursive: true });
|
|
152
|
+
const url = `http://127.0.0.1:${port}`;
|
|
153
|
+
console.log(`UOM适飞地图:${url}`);
|
|
154
|
+
console.log('按 Ctrl+C 停止。');
|
|
155
|
+
openUrl(url);
|
|
156
|
+
const code = await runChild(process.execPath, [entry], {
|
|
157
|
+
...process.env,
|
|
158
|
+
HOST: '127.0.0.1',
|
|
159
|
+
PORT: String(port),
|
|
160
|
+
NUXT_DATA_DIR: dataDir,
|
|
161
|
+
UOMTILES_DATA_DIR: dataDir,
|
|
162
|
+
[FETCH_PROCESS_ENV]: JSON.stringify(fetchProcessSpec()),
|
|
163
|
+
});
|
|
164
|
+
process.exitCode = code;
|
|
165
|
+
}
|
|
166
|
+
const webCommand = defineCommand({
|
|
167
|
+
meta: { name: 'web', description: '打开本地 Web 工作台', hidden: true },
|
|
168
|
+
run: web,
|
|
169
|
+
});
|
|
170
|
+
const whoamiCommand = defineCommand({
|
|
171
|
+
meta: { name: 'whoami', description: '验证当前 UOM 账户' },
|
|
172
|
+
run: whoami,
|
|
173
|
+
});
|
|
174
|
+
const fetchCommand = defineCommand({
|
|
175
|
+
meta: { name: 'fetch', description: '创建或继续全国抓取' },
|
|
176
|
+
args: {
|
|
177
|
+
file: { type: 'positional', description: '任务文件名(可省略)', required: false },
|
|
178
|
+
detach: { type: 'boolean', description: '脱离终端在后台下载', alias: ['d'] },
|
|
179
|
+
},
|
|
180
|
+
run: ({ args }) => fetchTask(args.file, args.detach),
|
|
181
|
+
});
|
|
182
|
+
const fetchChildCommand = defineCommand({
|
|
183
|
+
meta: { name: 'fetch-child', description: '执行单个抓取任务', hidden: true },
|
|
184
|
+
args: {
|
|
185
|
+
file: { type: 'positional', description: '任务文件名', required: true },
|
|
186
|
+
},
|
|
187
|
+
run: ({ args }) => fetchChild(args.file),
|
|
188
|
+
});
|
|
189
|
+
const inspectCommand = defineCommand({
|
|
190
|
+
meta: { name: 'inspect', description: '查看任务或瓦片文件摘要' },
|
|
191
|
+
args: {
|
|
192
|
+
file: { type: 'positional', description: '输入文件', required: true },
|
|
193
|
+
},
|
|
194
|
+
run: ({ args }) => {
|
|
195
|
+
console.log(JSON.stringify(inspectUomtiles(args.file), null, 2));
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
const exportCommand = defineCommand({
|
|
199
|
+
meta: { name: 'export', description: '导出 MBTiles 或 PMTiles' },
|
|
200
|
+
args: {
|
|
201
|
+
input: { type: 'positional', description: '输入 .uomtiles 文件', required: true },
|
|
202
|
+
output: { type: 'positional', description: '输出 .mbtiles 或 .pmtiles 文件', required: true },
|
|
203
|
+
},
|
|
204
|
+
run: async ({ args }) => {
|
|
205
|
+
await exportTiles(args.input, args.output);
|
|
206
|
+
console.log(`已导出:${resolve(args.output)}`);
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
const diffCommand = defineCommand({
|
|
210
|
+
meta: { name: 'diff', description: '比较两个 UOMTiles 文件' },
|
|
211
|
+
args: {
|
|
212
|
+
left: { type: 'positional', description: '左侧文件', required: true },
|
|
213
|
+
right: { type: 'positional', description: '右侧文件', required: true },
|
|
214
|
+
report: { type: 'positional', description: '可选 JSON 报告路径', required: false },
|
|
215
|
+
},
|
|
216
|
+
run: async ({ args }) => {
|
|
217
|
+
const report = diffUomtiles(args.left, args.right);
|
|
218
|
+
const text = JSON.stringify(report, null, 2);
|
|
219
|
+
if (args.report)
|
|
220
|
+
await import('node:fs').then(fs => fs.writeFileSync(resolve(args.report), text));
|
|
221
|
+
console.log(text);
|
|
222
|
+
if (!report.identical)
|
|
223
|
+
process.exitCode = 2;
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
const migrateCommand = defineCommand({
|
|
227
|
+
meta: { name: 'migrate', description: '迁移旧瓦片数据库为 UOMTiles' },
|
|
228
|
+
args: {
|
|
229
|
+
input: { type: 'positional', description: '源文件', required: true },
|
|
230
|
+
output: { type: 'positional', description: '目标 .uomtiles 文件', required: true },
|
|
231
|
+
},
|
|
232
|
+
run: ({ args }) => {
|
|
233
|
+
const account = existsSync(accountFile()) ? readAccount() : null;
|
|
234
|
+
console.log(JSON.stringify(migrateToUomtiles(args.input, args.output, account?.username || null), null, 2));
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
const mainCommand = defineCommand({
|
|
238
|
+
meta: {
|
|
239
|
+
name: 'uomtiles',
|
|
240
|
+
version: process.env.npm_package_version || '0.1.0',
|
|
241
|
+
description: 'UOM适飞地图预览、下载、对比和发布工具',
|
|
242
|
+
},
|
|
243
|
+
default: 'web',
|
|
244
|
+
subCommands: {
|
|
245
|
+
web: webCommand,
|
|
246
|
+
whoami: whoamiCommand,
|
|
247
|
+
fetch: fetchCommand,
|
|
248
|
+
'fetch-child': fetchChildCommand,
|
|
249
|
+
inspect: inspectCommand,
|
|
250
|
+
export: exportCommand,
|
|
251
|
+
diff: diffCommand,
|
|
252
|
+
migrate: migrateCommand,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
await runMain(mainCommand);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export const PROVINCE_CODES = [
|
|
2
|
+
'120000', '130000', '140000', '150000',
|
|
3
|
+
'210000', '220000', '230000',
|
|
4
|
+
'310000', '320000', '330000', '340000', '350000', '360000', '370000',
|
|
5
|
+
'410000', '420000', '430000', '440000', '450000', '460000',
|
|
6
|
+
'500000', '510000', '520000', '530000', '540000',
|
|
7
|
+
'610000', '620000', '630000', '640000', '650000',
|
|
8
|
+
];
|
|
9
|
+
// Exact layer grouping observed in the official UOM public-map frontend.
|
|
10
|
+
export const OFFICIAL_WMS_LAYER_GROUPS = [
|
|
11
|
+
['120000', '130000', '140000', '150000'],
|
|
12
|
+
['210000', '220000', '230000'],
|
|
13
|
+
['310000', '320000', '330000', '340000', '350000', '360000', '370000'],
|
|
14
|
+
['410000', '420000', '430000', '440000', '450000', '460000'],
|
|
15
|
+
['500000', '510000', '520000', '530000', '540000'],
|
|
16
|
+
['610000', '620000', '630000', '640000', '650000'],
|
|
17
|
+
];
|
|
18
|
+
export const STYLE_NAME = 'QGSFKYFW:shifeikongyu';
|
|
19
|
+
export const CHINA_BBOX_LL = {
|
|
20
|
+
lonMin: 73,
|
|
21
|
+
latMin: 17.5,
|
|
22
|
+
lonMax: 135.5,
|
|
23
|
+
latMax: 54,
|
|
24
|
+
};
|
|
25
|
+
export const UOM_BASE = 'https://uom.caac.gov.cn';
|
|
26
|
+
export const WMS_PATH = '/map/airspace/wms';
|
|
27
|
+
export const GET_TOKEN_V2_PATH = '/oapi/pub/datang/getTokenV2';
|
|
28
|
+
export const LOCATION_SSO_PATH = '/api/nvwa-certification/v1/location/sso';
|
|
29
|
+
export const PUB_SSO_PATH = '/oapi/pub/api/sso';
|
|
30
|
+
export const SPACE_APP_ID = '54b78ded-14b7-67ed-6030-f899fe4f999c';
|
|
31
|
+
export const DEFAULTS = {
|
|
32
|
+
qpsStart: 30,
|
|
33
|
+
qpsMin: 1,
|
|
34
|
+
qpsMax: 500000,
|
|
35
|
+
perLayerTimeoutMs: 15_000,
|
|
36
|
+
retryMax: 5,
|
|
37
|
+
// Adaptive controller params:
|
|
38
|
+
// Sliding window of recent request outcomes used by the controller.
|
|
39
|
+
ctlWindowSize: 200,
|
|
40
|
+
// After a success-rich window, multiply qps by this factor.
|
|
41
|
+
ctlIncFactor: 1.15,
|
|
42
|
+
// After a 429/503, multiply qps by this factor (multiplicative decrease).
|
|
43
|
+
ctlRateLimitFactor: 0.5,
|
|
44
|
+
// After repeated soft signals (timeouts, slowing p95), gently back off.
|
|
45
|
+
ctlSoftBackoffFactor: 0.85,
|
|
46
|
+
// Re-evaluate at most every N ms.
|
|
47
|
+
ctlMinIntervalMs: 1_500,
|
|
48
|
+
// Latency target: if window p95 > targetP95Ms * tolerance, back off.
|
|
49
|
+
ctlTargetP95Ms: 1_200,
|
|
50
|
+
ctlP95Tolerance: 1.6,
|
|
51
|
+
ctlInflightMin: 8,
|
|
52
|
+
ctlInflightMax: 5000,
|
|
53
|
+
ctlConnectionsMax: 8192,
|
|
54
|
+
};
|
|
55
|
+
export const MAP_TOKEN_ENV_KEY = 'MAP_TOKEN';
|
|
56
|
+
export const SESSION_TOKEN_ENV_KEY = 'UOM_SESSION_TOKEN';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const FETCH_PROCESS_ENV = 'UOMTILES_FETCH_PROCESS';
|
|
2
|
+
export function decodeFetchProcess(value) {
|
|
3
|
+
if (!value)
|
|
4
|
+
throw new Error(`${FETCH_PROCESS_ENV} is not configured`);
|
|
5
|
+
let parsed;
|
|
6
|
+
try {
|
|
7
|
+
parsed = JSON.parse(value);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new Error(`${FETCH_PROCESS_ENV} is invalid`);
|
|
11
|
+
}
|
|
12
|
+
if (!parsed || typeof parsed !== 'object')
|
|
13
|
+
throw new Error(`${FETCH_PROCESS_ENV} is invalid`);
|
|
14
|
+
const spec = parsed;
|
|
15
|
+
if (typeof spec.command !== 'string' || !spec.command || !Array.isArray(spec.args) || spec.args.some(arg => typeof arg !== 'string')) {
|
|
16
|
+
throw new Error(`${FETCH_PROCESS_ENV} is invalid`);
|
|
17
|
+
}
|
|
18
|
+
return { command: spec.command, args: spec.args };
|
|
19
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { geographicGridLines, renderGeographicGridTile } from "../geographic-grid.js";
|
|
3
|
+
import { deriveParentMask } from "../quality.js";
|
|
4
|
+
import { encodeCanonicalMask } from "./png.js";
|
|
5
|
+
export const ROOT_ZOOM = 9;
|
|
6
|
+
export const SOURCE_ZOOM = 12;
|
|
7
|
+
export const DYNAMIC_MAX_ZOOM = 18;
|
|
8
|
+
export const PUBLISH_MAX_ZOOM = 14;
|
|
9
|
+
const sourceRootSize = 256 * 2 ** (SOURCE_ZOOM - ROOT_ZOOM);
|
|
10
|
+
function decodeRectangles(value) {
|
|
11
|
+
if (value.byteLength % 8 !== 0)
|
|
12
|
+
throw new Error('invalid grid rectangle payload');
|
|
13
|
+
const buffer = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
14
|
+
const rects = [];
|
|
15
|
+
for (let offset = 0; offset < buffer.length; offset += 8) {
|
|
16
|
+
rects.push({
|
|
17
|
+
col0: buffer.readUInt16LE(offset),
|
|
18
|
+
row0: buffer.readUInt16LE(offset + 2),
|
|
19
|
+
col1: buffer.readUInt16LE(offset + 4),
|
|
20
|
+
row1: buffer.readUInt16LE(offset + 6),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return rects;
|
|
24
|
+
}
|
|
25
|
+
function rootRange(z, coordinate) {
|
|
26
|
+
if (z >= ROOT_ZOOM) {
|
|
27
|
+
const root = Math.floor(coordinate / 2 ** (z - ROOT_ZOOM));
|
|
28
|
+
return [root, root];
|
|
29
|
+
}
|
|
30
|
+
const scale = 2 ** (ROOT_ZOOM - z);
|
|
31
|
+
return [coordinate * scale, (coordinate + 1) * scale - 1];
|
|
32
|
+
}
|
|
33
|
+
export class GeographicGridRenderer {
|
|
34
|
+
roots = new Map();
|
|
35
|
+
masks = new Map();
|
|
36
|
+
constructor(path) {
|
|
37
|
+
const db = new DatabaseSync(path, { readOnly: true });
|
|
38
|
+
try {
|
|
39
|
+
const table = db.prepare("SELECT 1 ok FROM sqlite_master WHERE type='table' AND name='grid_roots'").get();
|
|
40
|
+
if (!table)
|
|
41
|
+
return;
|
|
42
|
+
const columns = new Set(db.prepare('PRAGMA table_info(grid_roots)').all().map(column => column.name));
|
|
43
|
+
if (!columns.has('rectangles'))
|
|
44
|
+
return;
|
|
45
|
+
const rows = db.prepare(`SELECT root_x x,root_y y,rectangles FROM grid_roots
|
|
46
|
+
WHERE state='completed' AND rectangles IS NOT NULL AND length(rectangles)>0`).all();
|
|
47
|
+
for (const row of rows) {
|
|
48
|
+
const lines = geographicGridLines({ sourceZ: SOURCE_ZOOM, parentZ: ROOT_ZOOM, parentX: row.x, parentY: row.y, width: sourceRootSize });
|
|
49
|
+
this.roots.set(`${row.x}/${row.y}`, { x: row.x, y: row.y, rects: decodeRectangles(row.rectangles), ...lines });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
db.close();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
get available() { return this.roots.size > 0; }
|
|
57
|
+
hasGeometry(z, x, y) {
|
|
58
|
+
const [rootX0, rootX1] = rootRange(z, x);
|
|
59
|
+
const [rootY0, rootY1] = rootRange(z, y);
|
|
60
|
+
for (let rootY = rootY0; rootY <= rootY1; rootY++)
|
|
61
|
+
for (let rootX = rootX0; rootX <= rootX1; rootX++) {
|
|
62
|
+
if (this.roots.has(`${rootX}/${rootY}`))
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
renderMask(z, x, y) {
|
|
68
|
+
if (!Number.isInteger(z) || z < 0 || z > DYNAMIC_MAX_ZOOM)
|
|
69
|
+
throw new RangeError(`unsupported dynamic zoom z${z}`);
|
|
70
|
+
const key = `${z}/${x}/${y}`;
|
|
71
|
+
const cached = this.masks.get(key);
|
|
72
|
+
if (cached)
|
|
73
|
+
return cached;
|
|
74
|
+
if (!this.hasGeometry(z, x, y))
|
|
75
|
+
return new Uint8Array(256 * 256);
|
|
76
|
+
if (z < ROOT_ZOOM) {
|
|
77
|
+
const mask = deriveParentMask([
|
|
78
|
+
this.renderMask(z + 1, x * 2, y * 2),
|
|
79
|
+
this.renderMask(z + 1, x * 2 + 1, y * 2),
|
|
80
|
+
this.renderMask(z + 1, x * 2, y * 2 + 1),
|
|
81
|
+
this.renderMask(z + 1, x * 2 + 1, y * 2 + 1),
|
|
82
|
+
]);
|
|
83
|
+
this.masks.set(key, mask);
|
|
84
|
+
return mask;
|
|
85
|
+
}
|
|
86
|
+
const mask = new Uint8Array(256 * 256);
|
|
87
|
+
const [rootX0, rootX1] = rootRange(z, x);
|
|
88
|
+
const [rootY0, rootY1] = rootRange(z, y);
|
|
89
|
+
for (let rootY = rootY0; rootY <= rootY1; rootY++)
|
|
90
|
+
for (let rootX = rootX0; rootX <= rootX1; rootX++) {
|
|
91
|
+
const root = this.roots.get(`${rootX}/${rootY}`);
|
|
92
|
+
if (!root)
|
|
93
|
+
continue;
|
|
94
|
+
const rendered = renderGeographicGridTile({ rects: root.rects, xLines: root.xLines, yLines: root.yLines }, { sourceZ: SOURCE_ZOOM, parentZ: ROOT_ZOOM, parentX: rootX, parentY: rootY, width: sourceRootSize }, z, x, y);
|
|
95
|
+
for (let pixel = 0; pixel < mask.length; pixel++)
|
|
96
|
+
if (rendered[pixel])
|
|
97
|
+
mask[pixel] = 1;
|
|
98
|
+
}
|
|
99
|
+
if (this.masks.size < 512)
|
|
100
|
+
this.masks.set(key, mask);
|
|
101
|
+
return mask;
|
|
102
|
+
}
|
|
103
|
+
renderTile(z, x, y) {
|
|
104
|
+
const mask = this.renderMask(z, x, y);
|
|
105
|
+
return mask.some(Boolean) ? encodeCanonicalMask(mask) : null;
|
|
106
|
+
}
|
|
107
|
+
*contentCoordinates(z) {
|
|
108
|
+
const coordinates = new Set();
|
|
109
|
+
if (z < ROOT_ZOOM) {
|
|
110
|
+
const scale = 2 ** (ROOT_ZOOM - z);
|
|
111
|
+
for (const root of this.roots.values())
|
|
112
|
+
coordinates.add(`${Math.floor(root.x / scale)}/${Math.floor(root.y / scale)}`);
|
|
113
|
+
for (const coordinate of [...coordinates].sort((left, right) => {
|
|
114
|
+
const [leftX, leftY] = left.split('/').map(Number), [rightX, rightY] = right.split('/').map(Number);
|
|
115
|
+
return leftX - rightX || leftY - rightY;
|
|
116
|
+
})) {
|
|
117
|
+
const [x, y] = coordinate.split('/').map(Number);
|
|
118
|
+
yield { z, x: x, y: y };
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const scale = 2 ** (z - SOURCE_ZOOM);
|
|
123
|
+
for (const root of this.roots.values())
|
|
124
|
+
for (const rect of root.rects) {
|
|
125
|
+
const sourceX0 = root.x * sourceRootSize;
|
|
126
|
+
const sourceY0 = root.y * sourceRootSize;
|
|
127
|
+
const pixelX0 = Math.round((sourceX0 + root.xLines[rect.col0]) * scale);
|
|
128
|
+
const pixelY0 = Math.round((sourceY0 + root.yLines[rect.row0]) * scale);
|
|
129
|
+
const pixelX1 = Math.round((sourceX0 + root.xLines[rect.col1]) * scale);
|
|
130
|
+
const pixelY1 = Math.round((sourceY0 + root.yLines[rect.row1]) * scale);
|
|
131
|
+
if (pixelX0 >= pixelX1 || pixelY0 >= pixelY1)
|
|
132
|
+
continue;
|
|
133
|
+
const x0 = Math.floor(pixelX0 / 256), y0 = Math.floor(pixelY0 / 256);
|
|
134
|
+
const x1 = Math.floor((pixelX1 - 1) / 256), y1 = Math.floor((pixelY1 - 1) / 256);
|
|
135
|
+
const worldMax = 2 ** z - 1;
|
|
136
|
+
for (let tileY = Math.max(0, y0); tileY <= Math.min(worldMax, y1); tileY++) {
|
|
137
|
+
for (let tileX = Math.max(0, x0); tileX <= Math.min(worldMax, x1); tileX++)
|
|
138
|
+
coordinates.add(`${tileX}/${tileY}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
for (const coordinate of [...coordinates].sort((left, right) => {
|
|
142
|
+
const [leftX, leftY] = left.split('/').map(Number), [rightX, rightY] = right.split('/').map(Number);
|
|
143
|
+
return leftX - rightX || leftY - rightY;
|
|
144
|
+
})) {
|
|
145
|
+
const [x, y] = coordinate.split('/').map(Number);
|
|
146
|
+
yield { z, x: x, y: y };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { hostname } from 'node:os';
|
|
3
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
6
|
+
const DEFAULT_LEASE_MS = 30_000;
|
|
7
|
+
export function getSqliteLease(databasePath, resource, now = Date.now()) {
|
|
8
|
+
if (!existsSync(databasePath))
|
|
9
|
+
return null;
|
|
10
|
+
let db;
|
|
11
|
+
try {
|
|
12
|
+
db = new DatabaseSync(databasePath, { readOnly: true });
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const table = db.prepare("SELECT 1 present FROM sqlite_master WHERE type='table' AND name='uomtiles_leases'").get();
|
|
19
|
+
if (!table)
|
|
20
|
+
return null;
|
|
21
|
+
const row = db.prepare(`SELECT resource,owner,pid,hostname,acquired_at,heartbeat_at,expires_at
|
|
22
|
+
FROM uomtiles_leases WHERE resource=?`).get(resource);
|
|
23
|
+
if (!row || row.expires_at <= now)
|
|
24
|
+
return null;
|
|
25
|
+
return { resource: row.resource, owner: row.owner, pid: row.pid, hostname: row.hostname,
|
|
26
|
+
acquiredAt: row.acquired_at, heartbeatAt: row.heartbeat_at, expiresAt: row.expires_at };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
db.close();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function hasActiveSqliteLease(databasePath, resource, now = Date.now()) {
|
|
36
|
+
return Boolean(getSqliteLease(databasePath, resource, now));
|
|
37
|
+
}
|
|
38
|
+
function open(path) {
|
|
39
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
40
|
+
const db = new DatabaseSync(path);
|
|
41
|
+
db.exec(`PRAGMA busy_timeout=5000;
|
|
42
|
+
CREATE TABLE IF NOT EXISTS uomtiles_leases(
|
|
43
|
+
resource TEXT PRIMARY KEY,
|
|
44
|
+
owner TEXT NOT NULL,
|
|
45
|
+
pid INTEGER NOT NULL,
|
|
46
|
+
hostname TEXT NOT NULL,
|
|
47
|
+
acquired_at INTEGER NOT NULL,
|
|
48
|
+
heartbeat_at INTEGER NOT NULL,
|
|
49
|
+
expires_at INTEGER NOT NULL);`);
|
|
50
|
+
return db;
|
|
51
|
+
}
|
|
52
|
+
export function acquireSqliteLease(databasePath, resource, leaseMs = DEFAULT_LEASE_MS) {
|
|
53
|
+
if (!resource)
|
|
54
|
+
throw new RangeError('SQLite lease resource cannot be empty');
|
|
55
|
+
if (!Number.isSafeInteger(leaseMs) || leaseMs <= 0)
|
|
56
|
+
throw new RangeError('SQLite lease duration must be a positive integer');
|
|
57
|
+
const db = open(databasePath);
|
|
58
|
+
const owner = randomUUID();
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
try {
|
|
61
|
+
db.exec('BEGIN IMMEDIATE');
|
|
62
|
+
const current = db.prepare('SELECT owner,pid,hostname,expires_at FROM uomtiles_leases WHERE resource=?').get(resource);
|
|
63
|
+
if (current && current.expires_at > now) {
|
|
64
|
+
throw new Error(`SQLite 资源正被占用:${resource} (pid ${current.pid} on ${current.hostname})`);
|
|
65
|
+
}
|
|
66
|
+
db.prepare(`INSERT OR REPLACE INTO uomtiles_leases(resource,owner,pid,hostname,acquired_at,heartbeat_at,expires_at)
|
|
67
|
+
VALUES(?,?,?,?,?,?,?)`).run(resource, owner, process.pid, hostname(), now, now, now + leaseMs);
|
|
68
|
+
db.exec('COMMIT');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
try {
|
|
72
|
+
db.exec('ROLLBACK');
|
|
73
|
+
}
|
|
74
|
+
catch { }
|
|
75
|
+
db.close();
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
let released = false;
|
|
79
|
+
return {
|
|
80
|
+
resource,
|
|
81
|
+
owner,
|
|
82
|
+
heartbeat() {
|
|
83
|
+
if (released)
|
|
84
|
+
return;
|
|
85
|
+
const heartbeatAt = Date.now();
|
|
86
|
+
const result = db.prepare('UPDATE uomtiles_leases SET heartbeat_at=?,expires_at=? WHERE resource=? AND owner=?')
|
|
87
|
+
.run(heartbeatAt, heartbeatAt + leaseMs, resource, owner);
|
|
88
|
+
if (result.changes !== 1)
|
|
89
|
+
throw new Error(`SQLite lease 已丢失:${resource}`);
|
|
90
|
+
},
|
|
91
|
+
release() {
|
|
92
|
+
if (released)
|
|
93
|
+
return;
|
|
94
|
+
released = true;
|
|
95
|
+
try {
|
|
96
|
+
db.prepare('DELETE FROM uomtiles_leases WHERE resource=? AND owner=?').run(resource, owner);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
db.close();
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
export function uomtilesDataDir(fallback) {
|
|
4
|
+
const explicit = process.env.UOMTILES_DATA_DIR?.trim() || process.env.NUXT_DATA_DIR?.trim() || fallback?.trim();
|
|
5
|
+
return resolve(explicit || resolve(homedir(), '.uomtiles'));
|
|
6
|
+
}
|
|
7
|
+
export function accountFile(fallbackDataDir) {
|
|
8
|
+
const explicit = process.env.UOMTILES_AUTH_FILE?.trim();
|
|
9
|
+
return resolve(explicit || uomtilesDataDir(fallbackDataDir), explicit ? '' : 'auth.json');
|
|
10
|
+
}
|
|
11
|
+
export function workspaceDirectory(fallbackDataDir) {
|
|
12
|
+
return resolve(uomtilesDataDir(fallbackDataDir), 'workspace');
|
|
13
|
+
}
|