akanjs 3.0.0-beta.20 → 3.0.0-beta.21
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/README.ko.md +0 -1
- package/README.md +0 -1
- package/base/baseEnv.ts +40 -3
- package/client/cookie.ts +56 -20
- package/client/device.ts +47 -95
- package/client/frameConfig.ts +2 -2
- package/client/native.ts +44 -0
- package/client/router.ts +11 -1
- package/client/rscNavigation.ts +5 -0
- package/client/storage.ts +68 -39
- package/fetch/client/fetchClient.ts +13 -4
- package/index.ts +47 -46
- package/package.json +6 -87
- package/server/devtools/signalSerializer.ts +1 -2
- package/server/hmr/devHmrController.ts +29 -11
- package/server/resolver/signal.resolver.ts +1 -10
- package/server/routeTreeBuilder.ts +8 -11
- package/server/routing/apiRouter.ts +15 -2
- package/server/rscClient.tsx +1 -2
- package/server/ssrFromRscRenderer.tsx +2 -0
- package/server/webRouter.ts +1 -0
- package/signal/CrossSiteGuard.ts +34 -2
- package/signal/endpoint.ts +12 -7
- package/signal/endpointInfo.ts +13 -0
- package/signal/internal.ts +9 -5
- package/signal/serializer/fetch.serializer.ts +6 -3
- package/signal/slice.ts +34 -24
- package/store/baseSt.ts +0 -1
- package/store/storeInstance.ts +29 -17
- package/types/client/cookie.d.ts +6 -4
- package/types/client/device.d.ts +7 -10
- package/types/client/native.d.ts +26 -0
- package/types/client/rscNavigation.d.ts +4 -0
- package/types/client/storage.d.ts +8 -1
- package/types/index.d.ts +48 -44
- package/types/server/hmr/devHmrController.d.ts +2 -1
- package/types/server/resolver/signal.resolver.d.ts +0 -1
- package/types/server/rscClient.d.ts +0 -3
- package/types/signal/CrossSiteGuard.d.ts +7 -2
- package/types/signal/endpoint.d.ts +1 -1
- package/types/signal/endpointInfo.d.ts +3 -0
- package/types/signal/slice.d.ts +3 -2
- package/types/store/baseSt.d.ts +0 -13
- package/types/vendor/@akanjs/native/packages/cli/src/api.d.ts +182 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/build.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/compat.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/dev.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/doctor.d.ts +37 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/plugin.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/signing.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/test.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/toolchain.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/update.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/config.d.ts +278 -0
- package/types/vendor/@akanjs/native/packages/cli/src/index.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/acl.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apilevel.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apk.d.ts +36 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/args.d.ts +9 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/boot.d.ts +32 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/chrome.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/codegen.d.ts +94 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/compat.d.ts +49 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/configkeys.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/csp.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/env.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/exec.d.ts +31 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/googleservices.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/hmr.d.ts +120 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/html.d.ts +20 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/icons.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/image.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/iossigning.d.ts +81 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/launch.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/log.d.ts +42 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.d.ts +18 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/maven.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/names.d.ts +45 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.d.ts +67 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/permissions.d.ts +10 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/plist.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/png.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/prepare.d.ts +138 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/privacy.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/project.d.ts +208 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/root.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/routes.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/serve.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/signing.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/spec.d.ts +96 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/toolchains.d.ts +150 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/updates.d.ts +77 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/vectors.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/xml.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/android.d.ts +57 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/ios.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/linux.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/macos.d.ts +7 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/targets.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web-run.d.ts +15 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/windows.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/core/src/acl.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/core/src/boot.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/contract.d.ts +35 -0
- package/types/vendor/@akanjs/native/packages/core/src/errors.d.ts +27 -0
- package/types/vendor/@akanjs/native/packages/core/src/files.d.ts +23 -0
- package/types/vendor/@akanjs/native/packages/core/src/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/core/src/kernel.d.ts +112 -0
- package/types/vendor/@akanjs/native/packages/core/src/live.d.ts +12 -0
- package/types/vendor/@akanjs/native/packages/core/src/mime.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/plugin.d.ts +71 -0
- package/types/vendor/@akanjs/native/packages/core/src/protocol.d.ts +109 -0
- package/types/vendor/@akanjs/native/packages/core/src/runtime.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/state.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/core/src/testing.d.ts +41 -0
- package/types/vendor/@akanjs/native/packages/core/src/version.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/core/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/deeplinks.d.ts +24 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/delta.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/dispatcher.d.ts +95 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/ffi.d.ts +144 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/host.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/lifecycle.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/main.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/page-veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/paths.d.ts +25 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/plugin.d.ts +179 -0
- package/types/vendor/@akanjs/native/packages/react/src/index.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/react/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/announce.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/index.d.ts +47 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/app/src/index.d.ts +66 -0
- package/types/vendor/@akanjs/native/plugins/app/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/setting.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/args.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/desktop.d.ts +17 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/index.d.ts +41 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/desktop.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/index.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/count.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/index.d.ts +37 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/badge/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src/index.d.ts +53 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/args.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/index.d.ts +36 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/browser/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/camera/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/index.d.ts +40 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/device/src/desktop.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/device/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/device/src/web.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/device/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/index.d.ts +60 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/options.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/index.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/dock/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/common.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/index.d.ts +84 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/web.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/common.d.ts +49 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/index.d.ts +123 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/index.d.ts +93 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/web.d.ts +11 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/index.d.ts +52 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/index.d.ts +31 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/http/src/common.d.ts +71 -0
- package/types/vendor/@akanjs/native/plugins/http/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/http/src/index.d.ts +104 -0
- package/types/vendor/@akanjs/native/plugins/http/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/http/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/iap/src/index.d.ts +171 -0
- package/types/vendor/@akanjs/native/plugins/iap/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/desktop.d.ts +15 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/index.d.ts +42 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/desktop.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/index.d.ts +126 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/schedule.d.ts +38 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/timers.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/index.d.ts +85 -0
- package/types/vendor/@akanjs/native/plugins/menu/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/network/src/index.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/network/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/network/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/desktop.d.ts +14 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/url.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/opener/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/index.d.ts +26 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/push/src/index.d.ts +57 -0
- package/types/vendor/@akanjs/native/plugins/push/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/index.d.ts +70 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/web.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/types.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/desktop.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/index.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/share/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/share/src/options.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/share/src/web.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/share/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/index.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/socket.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/common.d.ts +34 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/index.d.ts +115 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/index.d.ts +30 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/queue.d.ts +23 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/toast/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/index.d.ts +113 -0
- package/types/vendor/@akanjs/native/plugins/tray/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/desktop.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/index.d.ts +68 -0
- package/types/vendor/@akanjs/native/plugins/updates/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/window/src/index.d.ts +185 -0
- package/types/vendor/@akanjs/native/plugins/window/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/window/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/desktop.d.ts +7 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/state.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src.d.ts +1 -0
- package/types/webkit/index.d.ts +0 -2
- package/types/webkit/nativeNavigation.d.ts +25 -0
- package/types/webkit/nativePurchase.d.ts +37 -0
- package/types/webkit/useCamera.d.ts +13 -15
- package/types/webkit/useGeoLocation.d.ts +4 -5
- package/types/webkit/usePurchase.d.ts +12 -16
- package/ui/Link/Anchor.tsx +2 -5
- package/ui/System/Client.tsx +2 -6
- package/vendor/@akanjs/native/LICENSE +21 -0
- package/vendor/@akanjs/native/README.ko.md +88 -0
- package/vendor/@akanjs/native/README.md +93 -0
- package/vendor/@akanjs/native/THIRD_PARTY_NOTICES.md +237 -0
- package/vendor/@akanjs/native/native/android/maven.lock.json +1751 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAcl.kt +243 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeActivity.kt +936 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeApplication.kt +189 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAssetServer.kt +225 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeBridge.kt +444 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeCompat.kt +55 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeContract.kt +99 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeEd25519.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeFileProvider.kt +71 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeKernel.kt +324 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativePlugin.kt +361 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeSpec.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeUpdates.kt +305 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeVectors.kt +132 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.lock +2565 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.toml +49 -0
- package/vendor/@akanjs/native/native/desktop/build.rs +19 -0
- package/vendor/@akanjs/native/native/desktop/rust-toolchain.toml +7 -0
- package/vendor/@akanjs/native/native/desktop/src/accelerator.rs +466 -0
- package/vendor/@akanjs/native/native/desktop/src/autostart.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/camera.rs +53 -0
- package/vendor/@akanjs/native/native/desktop/src/chrome.rs +710 -0
- package/vendor/@akanjs/native/native/desktop/src/contract.rs +105 -0
- package/vendor/@akanjs/native/native/desktop/src/devproxy.rs +234 -0
- package/vendor/@akanjs/native/native/desktop/src/dialog_args.rs +189 -0
- package/vendor/@akanjs/native/native/desktop/src/dock.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/hotkey.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/js_panels.rs +125 -0
- package/vendor/@akanjs/native/native/desktop/src/json.rs +272 -0
- package/vendor/@akanjs/native/native/desktop/src/keychain.rs +151 -0
- package/vendor/@akanjs/native/native/desktop/src/lib.rs +2185 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/appearance.rs +177 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/camera.rs +11 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/clipboard.rs +48 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/device.rs +9 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dialogs.rs +348 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dock.rs +146 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/hotkey.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/keychain.rs +243 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/menu.rs +445 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/mod.rs +116 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/notify.rs +211 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/open.rs +79 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/power.rs +155 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/screen.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/tray.rs +604 -0
- package/vendor/@akanjs/native/native/desktop/src/menu.rs +517 -0
- package/vendor/@akanjs/native/native/desktop/src/navigation.rs +381 -0
- package/vendor/@akanjs/native/native/desktop/src/notify.rs +411 -0
- package/vendor/@akanjs/native/native/desktop/src/notify_schedule.rs +382 -0
- package/vendor/@akanjs/native/native/desktop/src/page_menu.rs +287 -0
- package/vendor/@akanjs/native/native/desktop/src/panels.rs +333 -0
- package/vendor/@akanjs/native/native/desktop/src/placement.rs +92 -0
- package/vendor/@akanjs/native/native/desktop/src/routes.rs +153 -0
- package/vendor/@akanjs/native/native/desktop/src/screen.rs +190 -0
- package/vendor/@akanjs/native/native/desktop/src/tray.rs +279 -0
- package/vendor/@akanjs/native/native/desktop/src/vectors.rs +126 -0
- package/vendor/@akanjs/native/native/desktop/src/win/appearance.rs +51 -0
- package/vendor/@akanjs/native/native/desktop/src/win/autostart.rs +77 -0
- package/vendor/@akanjs/native/native/desktop/src/win/camera.rs +34 -0
- package/vendor/@akanjs/native/native/desktop/src/win/clipboard.rs +106 -0
- package/vendor/@akanjs/native/native/desktop/src/win/device.rs +80 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dialogs.rs +917 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dock.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/win/hotkey.rs +110 -0
- package/vendor/@akanjs/native/native/desktop/src/win/keychain.rs +103 -0
- package/vendor/@akanjs/native/native/desktop/src/win/menu.rs +500 -0
- package/vendor/@akanjs/native/native/desktop/src/win/mod.rs +100 -0
- package/vendor/@akanjs/native/native/desktop/src/win/msgwin.rs +86 -0
- package/vendor/@akanjs/native/native/desktop/src/win/notify.rs +334 -0
- package/vendor/@akanjs/native/native/desktop/src/win/open.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/power.rs +64 -0
- package/vendor/@akanjs/native/native/desktop/src/win/registry.rs +87 -0
- package/vendor/@akanjs/native/native/desktop/src/win/screen.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/tray.rs +280 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeAcl.swift +241 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeApp.swift +285 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeBridge.swift +407 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeContract.swift +106 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeKernel.swift +317 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativePlugin.swift +250 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSchemeHandler.swift +209 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeShell.swift +161 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSpec.swift +143 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeUpdates.swift +270 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeVectors.swift +155 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeViewController.swift +371 -0
- package/vendor/@akanjs/native/packages/cli/src/api.ts +600 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/build.ts +101 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/compat.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/dev.ts +249 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/doctor.ts +536 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/plugin.ts +164 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/signing.ts +32 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/test.ts +130 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/toolchain.ts +143 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/update.ts +168 -0
- package/vendor/@akanjs/native/packages/cli/src/config.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/index.ts +77 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/acl.ts +420 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apilevel.ts +245 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apk.ts +203 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/args.ts +44 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/boot.ts +73 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/chrome.ts +89 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/codegen.ts +1128 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/compat.ts +185 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/configkeys.ts +91 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/csp.ts +198 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/env.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/exec.ts +104 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/googleservices.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/hmr.ts +534 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/html.ts +63 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/icons.ts +316 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/image.ts +175 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/iossigning.ts +295 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/launch.ts +98 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/log.ts +105 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.ts +107 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/maven.ts +244 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/names.ts +202 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.ts +326 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.ts +68 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/permissions.ts +80 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/plist.ts +139 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/png.ts +240 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/prepare.ts +290 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/privacy.ts +64 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/project.ts +710 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/root.ts +18 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/routes.ts +3 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/serve.ts +83 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/signing.ts +117 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/spec.ts +521 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/toolchains.ts +579 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/updates.ts +160 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/vectors.ts +121 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/xml.ts +72 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/android.ts +1320 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.ts +78 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop.ts +279 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/index.ts +31 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/ios.ts +801 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/linux.ts +52 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/macos.ts +97 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/targets.ts +12 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web-run.ts +69 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web.ts +28 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/windows.ts +82 -0
- package/vendor/@akanjs/native/packages/core/contract.json +96 -0
- package/vendor/@akanjs/native/packages/core/src/acl.ts +272 -0
- package/vendor/@akanjs/native/packages/core/src/boot.ts +97 -0
- package/vendor/@akanjs/native/packages/core/src/contract.ts +100 -0
- package/vendor/@akanjs/native/packages/core/src/errors.ts +95 -0
- package/vendor/@akanjs/native/packages/core/src/files.ts +105 -0
- package/vendor/@akanjs/native/packages/core/src/index.ts +35 -0
- package/vendor/@akanjs/native/packages/core/src/kernel.ts +281 -0
- package/vendor/@akanjs/native/packages/core/src/live.ts +62 -0
- package/vendor/@akanjs/native/packages/core/src/mime.ts +8 -0
- package/vendor/@akanjs/native/packages/core/src/plugin.ts +358 -0
- package/vendor/@akanjs/native/packages/core/src/protocol.ts +194 -0
- package/vendor/@akanjs/native/packages/core/src/runtime.ts +520 -0
- package/vendor/@akanjs/native/packages/core/src/state.ts +46 -0
- package/vendor/@akanjs/native/packages/core/src/testing.ts +176 -0
- package/vendor/@akanjs/native/packages/core/src/version.ts +2 -0
- package/vendor/@akanjs/native/packages/core/src/veto.ts +55 -0
- package/vendor/@akanjs/native/packages/core/vectors/acl.json +57 -0
- package/vendor/@akanjs/native/packages/core/vectors/bridge.json +76 -0
- package/vendor/@akanjs/native/packages/core/vectors/ed25519.json +29 -0
- package/vendor/@akanjs/native/packages/core/vectors/ids.json +73 -0
- package/vendor/@akanjs/native/packages/core/vectors/navigation.json +75 -0
- package/vendor/@akanjs/native/packages/core/vectors/ranges.json +39 -0
- package/vendor/@akanjs/native/packages/core/vectors/retained.json +17 -0
- package/vendor/@akanjs/native/packages/core/vectors/routes.json +66 -0
- package/vendor/@akanjs/native/packages/core/vectors/scope.json +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/deeplinks.ts +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/delta.ts +174 -0
- package/vendor/@akanjs/native/packages/desktop/src/dispatcher.ts +679 -0
- package/vendor/@akanjs/native/packages/desktop/src/ffi.ts +76 -0
- package/vendor/@akanjs/native/packages/desktop/src/host.ts +355 -0
- package/vendor/@akanjs/native/packages/desktop/src/lifecycle.ts +142 -0
- package/vendor/@akanjs/native/packages/desktop/src/main.ts +133 -0
- package/vendor/@akanjs/native/packages/desktop/src/page-veto.ts +103 -0
- package/vendor/@akanjs/native/packages/desktop/src/paths.ts +59 -0
- package/vendor/@akanjs/native/packages/desktop/src/plugin.ts +232 -0
- package/vendor/@akanjs/native/packages/react/src/index.ts +23 -0
- package/vendor/@akanjs/native/plugins/accessibility/android/AccessibilityPlugin.kt +96 -0
- package/vendor/@akanjs/native/plugins/accessibility/ios/AccessibilityPlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/accessibility/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/announce.ts +71 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/web.ts +52 -0
- package/vendor/@akanjs/native/plugins/app/android/AppPlugin.kt +72 -0
- package/vendor/@akanjs/native/plugins/app/ios/AppPlugin.swift +52 -0
- package/vendor/@akanjs/native/plugins/app/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/app/src/desktop.ts +64 -0
- package/vendor/@akanjs/native/plugins/app/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/app/src/web.ts +12 -0
- package/vendor/@akanjs/native/plugins/app-state/android/AppStatePlugin.kt +54 -0
- package/vendor/@akanjs/native/plugins/app-state/ios/AppStatePlugin.swift +58 -0
- package/vendor/@akanjs/native/plugins/app-state/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/app-state/src/index.ts +42 -0
- package/vendor/@akanjs/native/plugins/app-state/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/appearance/android/AppearancePlugin.kt +133 -0
- package/vendor/@akanjs/native/plugins/appearance/ios/AppearancePlugin.swift +109 -0
- package/vendor/@akanjs/native/plugins/appearance/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/appearance/src/index.ts +62 -0
- package/vendor/@akanjs/native/plugins/appearance/src/setting.ts +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/web.ts +25 -0
- package/vendor/@akanjs/native/plugins/auth-session/android/AuthSessionPlugin.kt +171 -0
- package/vendor/@akanjs/native/plugins/auth-session/ios/AuthSessionPlugin.swift +112 -0
- package/vendor/@akanjs/native/plugins/auth-session/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/args.ts +62 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/index.ts +39 -0
- package/vendor/@akanjs/native/plugins/autostart/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/autostart/src/desktop.ts +189 -0
- package/vendor/@akanjs/native/plugins/autostart/src/index.ts +51 -0
- package/vendor/@akanjs/native/plugins/badge/ios/BadgePlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/badge/native-plugin.json +15 -0
- package/vendor/@akanjs/native/plugins/badge/src/count.ts +12 -0
- package/vendor/@akanjs/native/plugins/badge/src/desktop.ts +24 -0
- package/vendor/@akanjs/native/plugins/badge/src/index.ts +40 -0
- package/vendor/@akanjs/native/plugins/badge/src/web.ts +37 -0
- package/vendor/@akanjs/native/plugins/biometric/android/BiometricPlugin.kt +179 -0
- package/vendor/@akanjs/native/plugins/biometric/ios/BiometricPlugin.swift +129 -0
- package/vendor/@akanjs/native/plugins/biometric/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/biometric/src/index.ts +100 -0
- package/vendor/@akanjs/native/plugins/browser/android/BrowserPlugin.kt +178 -0
- package/vendor/@akanjs/native/plugins/browser/ios/BrowserPlugin.swift +63 -0
- package/vendor/@akanjs/native/plugins/browser/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/browser/src/args.ts +34 -0
- package/vendor/@akanjs/native/plugins/browser/src/desktop.ts +40 -0
- package/vendor/@akanjs/native/plugins/browser/src/index.ts +47 -0
- package/vendor/@akanjs/native/plugins/browser/src/web.ts +60 -0
- package/vendor/@akanjs/native/plugins/camera/android/CameraPlugin.kt +365 -0
- package/vendor/@akanjs/native/plugins/camera/ios/CameraPlugin.swift +296 -0
- package/vendor/@akanjs/native/plugins/camera/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/camera/src/desktop.ts +27 -0
- package/vendor/@akanjs/native/plugins/camera/src/index.ts +85 -0
- package/vendor/@akanjs/native/plugins/camera/src/web.ts +267 -0
- package/vendor/@akanjs/native/plugins/clipboard/android/ClipboardPlugin.kt +51 -0
- package/vendor/@akanjs/native/plugins/clipboard/ios/ClipboardPlugin.swift +35 -0
- package/vendor/@akanjs/native/plugins/clipboard/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/desktop.ts +66 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/web.ts +69 -0
- package/vendor/@akanjs/native/plugins/device/android/DevicePlugin.kt +70 -0
- package/vendor/@akanjs/native/plugins/device/ios/DevicePlugin.swift +80 -0
- package/vendor/@akanjs/native/plugins/device/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/device/src/desktop.ts +276 -0
- package/vendor/@akanjs/native/plugins/device/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/device/src/web.ts +162 -0
- package/vendor/@akanjs/native/plugins/dialog/android/DialogPlugin.kt +260 -0
- package/vendor/@akanjs/native/plugins/dialog/ios/DialogPlugin.swift +198 -0
- package/vendor/@akanjs/native/plugins/dialog/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/dialog/src/desktop.ts +80 -0
- package/vendor/@akanjs/native/plugins/dialog/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/dialog/src/options.ts +111 -0
- package/vendor/@akanjs/native/plugins/dialog/src/web.ts +296 -0
- package/vendor/@akanjs/native/plugins/dock/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/dock/src/desktop.ts +34 -0
- package/vendor/@akanjs/native/plugins/dock/src/index.ts +46 -0
- package/vendor/@akanjs/native/plugins/file-picker/android/FilePickerPlugin.kt +316 -0
- package/vendor/@akanjs/native/plugins/file-picker/ios/FilePickerPlugin.swift +366 -0
- package/vendor/@akanjs/native/plugins/file-picker/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/common.ts +125 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/desktop.ts +164 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/index.ts +187 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/filesystem/android/FilesystemPlugin.kt +561 -0
- package/vendor/@akanjs/native/plugins/filesystem/ios/FilesystemPlugin.swift +596 -0
- package/vendor/@akanjs/native/plugins/filesystem/native-plugin.json +45 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/common.ts +150 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/desktop.ts +438 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/index.ts +179 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/web.ts +334 -0
- package/vendor/@akanjs/native/plugins/geolocation/android/GeolocationPlugin.kt +360 -0
- package/vendor/@akanjs/native/plugins/geolocation/ios/GeolocationPlugin.swift +284 -0
- package/vendor/@akanjs/native/plugins/geolocation/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/index.ts +155 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/web.ts +132 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.ts +36 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/index.ts +55 -0
- package/vendor/@akanjs/native/plugins/haptics/android/HapticsPlugin.kt +127 -0
- package/vendor/@akanjs/native/plugins/haptics/ios/HapticsPlugin.swift +127 -0
- package/vendor/@akanjs/native/plugins/haptics/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/haptics/src/index.ts +34 -0
- package/vendor/@akanjs/native/plugins/haptics/src/web.ts +53 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpPlugin.kt +234 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpUrl.kt +182 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpPlugin.swift +228 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpUrl.swift +166 -0
- package/vendor/@akanjs/native/plugins/http/native-plugin.json +27 -0
- package/vendor/@akanjs/native/plugins/http/src/common.ts +294 -0
- package/vendor/@akanjs/native/plugins/http/src/desktop.ts +69 -0
- package/vendor/@akanjs/native/plugins/http/src/index.ts +181 -0
- package/vendor/@akanjs/native/plugins/http/src/web.ts +40 -0
- package/vendor/@akanjs/native/plugins/iap/android/IapPlugin.kt +358 -0
- package/vendor/@akanjs/native/plugins/iap/ios/IapPlugin.swift +306 -0
- package/vendor/@akanjs/native/plugins/iap/native-plugin.json +28 -0
- package/vendor/@akanjs/native/plugins/iap/src/index.ts +206 -0
- package/vendor/@akanjs/native/plugins/keep-awake/android/KeepAwakePlugin.kt +48 -0
- package/vendor/@akanjs/native/plugins/keep-awake/ios/KeepAwakePlugin.swift +36 -0
- package/vendor/@akanjs/native/plugins/keep-awake/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/desktop.ts +127 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/index.ts +79 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/web.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/android/KeyboardPlugin.kt +77 -0
- package/vendor/@akanjs/native/plugins/keyboard/ios/KeyboardPlugin.swift +93 -0
- package/vendor/@akanjs/native/plugins/keyboard/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/index.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/web.ts +57 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt +38 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotifications.kt +284 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationsPlugin.kt +248 -0
- package/vendor/@akanjs/native/plugins/local-notifications/ios/LocalNotificationsPlugin.swift +279 -0
- package/vendor/@akanjs/native/plugins/local-notifications/native-plugin.json +35 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/desktop.ts +196 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/index.ts +174 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/schedule.ts +164 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/timers.ts +72 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/menu/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/menu/src/desktop.ts +52 -0
- package/vendor/@akanjs/native/plugins/menu/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/network/android/NetworkPlugin.kt +124 -0
- package/vendor/@akanjs/native/plugins/network/ios/NetworkPlugin.swift +82 -0
- package/vendor/@akanjs/native/plugins/network/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/network/src/index.ts +59 -0
- package/vendor/@akanjs/native/plugins/network/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/opener/android/OpenerPlugin.kt +81 -0
- package/vendor/@akanjs/native/plugins/opener/ios/OpenerPlugin.swift +83 -0
- package/vendor/@akanjs/native/plugins/opener/native-plugin.json +25 -0
- package/vendor/@akanjs/native/plugins/opener/src/desktop.ts +88 -0
- package/vendor/@akanjs/native/plugins/opener/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/opener/src/url.ts +39 -0
- package/vendor/@akanjs/native/plugins/opener/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/preferences/android/PreferencesPlugin.kt +44 -0
- package/vendor/@akanjs/native/plugins/preferences/ios/PreferencesPlugin.swift +47 -0
- package/vendor/@akanjs/native/plugins/preferences/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/preferences/src/desktop.ts +59 -0
- package/vendor/@akanjs/native/plugins/preferences/src/index.ts +75 -0
- package/vendor/@akanjs/native/plugins/preferences/src/web.ts +55 -0
- package/vendor/@akanjs/native/plugins/push/android/AkanNativeMessagingService.kt +17 -0
- package/vendor/@akanjs/native/plugins/push/android/PushPlugin.kt +257 -0
- package/vendor/@akanjs/native/plugins/push/ios/PushPlugin.swift +169 -0
- package/vendor/@akanjs/native/plugins/push/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/push/src/index.ts +73 -0
- package/vendor/@akanjs/native/plugins/screen/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/screen/src/desktop.ts +50 -0
- package/vendor/@akanjs/native/plugins/screen/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/screen/src/web.ts +92 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/android/ScreenOrientationPlugin.kt +113 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/ios/ScreenOrientationPlugin.swift +150 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/index.ts +69 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/types.ts +26 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/web.ts +67 -0
- package/vendor/@akanjs/native/plugins/secure-storage/android/SecureStoragePlugin.kt +184 -0
- package/vendor/@akanjs/native/plugins/secure-storage/ios/SecureStoragePlugin.swift +145 -0
- package/vendor/@akanjs/native/plugins/secure-storage/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/desktop.ts +332 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/index.ts +33 -0
- package/vendor/@akanjs/native/plugins/share/android/SharePlugin.kt +218 -0
- package/vendor/@akanjs/native/plugins/share/ios/SharePlugin.swift +142 -0
- package/vendor/@akanjs/native/plugins/share/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/share/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/share/src/options.ts +43 -0
- package/vendor/@akanjs/native/plugins/share/src/web.ts +116 -0
- package/vendor/@akanjs/native/plugins/single-instance/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/desktop.ts +63 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/index.ts +32 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/socket.ts +248 -0
- package/vendor/@akanjs/native/plugins/splash-screen/android/SplashScreenPlugin.kt +19 -0
- package/vendor/@akanjs/native/plugins/splash-screen/ios/SplashScreenPlugin.swift +20 -0
- package/vendor/@akanjs/native/plugins/splash-screen/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/index.ts +24 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/web.ts +17 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlStatements.kt +121 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlitePlugin.kt +327 -0
- package/vendor/@akanjs/native/plugins/sqlite/ios/SqlitePlugin.swift +361 -0
- package/vendor/@akanjs/native/plugins/sqlite/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/common.ts +221 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/desktop.ts +140 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/index.ts +114 -0
- package/vendor/@akanjs/native/plugins/toast/android/ToastPlugin.kt +27 -0
- package/vendor/@akanjs/native/plugins/toast/native-plugin.json +14 -0
- package/vendor/@akanjs/native/plugins/toast/src/index.ts +41 -0
- package/vendor/@akanjs/native/plugins/toast/src/queue.ts +77 -0
- package/vendor/@akanjs/native/plugins/toast/src/web.ts +130 -0
- package/vendor/@akanjs/native/plugins/tray/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/tray/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/tray/src/index.ts +111 -0
- package/vendor/@akanjs/native/plugins/updates/android/UpdatesPlugin.kt +290 -0
- package/vendor/@akanjs/native/plugins/updates/ios/UpdatesPlugin.swift +292 -0
- package/vendor/@akanjs/native/plugins/updates/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/updates/src/desktop.ts +558 -0
- package/vendor/@akanjs/native/plugins/updates/src/index.ts +95 -0
- package/vendor/@akanjs/native/plugins/window/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/window/src/desktop.ts +170 -0
- package/vendor/@akanjs/native/plugins/window/src/index.ts +342 -0
- package/vendor/@akanjs/native/plugins/window/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/window-state/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/window-state/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/window-state/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/window-state/src/state.ts +146 -0
- package/webkit/bootCsr.tsx +26 -14
- package/webkit/index.ts +0 -2
- package/webkit/nativeNavigation.ts +116 -0
- package/webkit/nativePurchase.ts +93 -0
- package/webkit/useCamera.tsx +76 -71
- package/webkit/useCsrValues.ts +10 -124
- package/webkit/useGeoLocation.tsx +11 -13
- package/webkit/usePurchase.tsx +68 -123
- package/capacitor.base.config.ts +0 -140
- package/client/capacitor.ts +0 -252
- package/types/capacitor.base.config.d.ts +0 -3
- package/types/client/capacitor.d.ts +0 -290
- package/types/webkit/useCodepush.d.ts +0 -16
- package/types/webkit/useContact.d.ts +0 -11
- package/webkit/useCodepush.tsx +0 -76
- package/webkit/useContact.tsx +0 -45
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { AkanNativeError, type CallScope, scopePermits } from "../../../packages/core/src/index.ts";
|
|
4
|
+
import type { BodyEncoding, HttpMethod, NativeResponseType } from "./index.ts";
|
|
5
|
+
|
|
6
|
+
export const METHODS: readonly HttpMethod[] = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
7
|
+
/** Whole request, redirects and body included. */
|
|
8
|
+
export const DEFAULT_TIMEOUT = 60_000;
|
|
9
|
+
/** Android takes timeouts as int milliseconds. */
|
|
10
|
+
export const MAX_TIMEOUT = 2_147_483_647;
|
|
11
|
+
/** The fetch standard's limit. */
|
|
12
|
+
export const MAX_REDIRECTS = 20;
|
|
13
|
+
export const REDIRECTS = new Set([301, 302, 303, 307, 308]);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Headers the HTTP stack owns: it frames the body, the connection and compression itself (every
|
|
17
|
+
* platform decodes gzip on its own, and Android stops doing so once the app sets Accept-Encoding).
|
|
18
|
+
*/
|
|
19
|
+
export const RESERVED_HEADERS = new Set([
|
|
20
|
+
"host",
|
|
21
|
+
"content-length",
|
|
22
|
+
"transfer-encoding",
|
|
23
|
+
"connection",
|
|
24
|
+
"keep-alive",
|
|
25
|
+
"upgrade",
|
|
26
|
+
"te",
|
|
27
|
+
"trailer",
|
|
28
|
+
"expect",
|
|
29
|
+
"accept-encoding",
|
|
30
|
+
]);
|
|
31
|
+
const TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
32
|
+
|
|
33
|
+
const invalid = (message: string) => new AkanNativeError("INVALID_ARGS", message);
|
|
34
|
+
|
|
35
|
+
/** What RFC 3986 allows unescaped in a path and query (unreserved, sub-delims, ":", "@", "/", "?"). */
|
|
36
|
+
const PATH_CHAR = /^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/;
|
|
37
|
+
/** A host name: RFC 3986 reg-name without percent escapes (a deny of a host must not be passed by escaping a letter). */
|
|
38
|
+
const HOST = /^[A-Za-z0-9\-._~!$&'()*+,;=]+$/;
|
|
39
|
+
const IPV6 = /^\[[0-9A-Fa-f:.]+\]$/;
|
|
40
|
+
/** Path segments that mean "this" or "parent" (WHATWG also reads %2e as "."). */
|
|
41
|
+
const DOT_SEGMENTS = new Set([".", "..", "%2e", "%2e%2e", ".%2e", "%2e."]);
|
|
42
|
+
const isHex = (b: number | undefined) =>
|
|
43
|
+
b !== undefined && ((b >= 0x30 && b <= 0x39) || (b >= 0x41 && b <= 0x46) || (b >= 0x61 && b <= 0x66));
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The form a URL is matched against the app's scope in and sent in, the same on every platform:
|
|
47
|
+
* lowercase scheme and host, no default port, "/" for an empty path, no fragment, and the path and
|
|
48
|
+
* query percent-encoded where RFC 3986 needs it (UTF-8; valid %XX kept). null for anything that is
|
|
49
|
+
* not an absolute http(s) URL, has credentials or a malformed host or port, or still has dot
|
|
50
|
+
* segments (they must be resolved before a scope can be checked).
|
|
51
|
+
*/
|
|
52
|
+
export function canonicalUrl(text: string): string | null {
|
|
53
|
+
const hash = text.indexOf("#");
|
|
54
|
+
if (hash >= 0) text = text.slice(0, hash);
|
|
55
|
+
const scheme = /^(https?):\/\//i.exec(text);
|
|
56
|
+
if (!scheme) return null;
|
|
57
|
+
const rest = text.slice(scheme[0].length);
|
|
58
|
+
let end = rest.search(/[/?]/);
|
|
59
|
+
if (end < 0) end = rest.length;
|
|
60
|
+
const authority = rest.slice(0, end);
|
|
61
|
+
if (!authority || authority.includes("@")) return null;
|
|
62
|
+
let host: string;
|
|
63
|
+
let port = "";
|
|
64
|
+
if (authority.startsWith("[")) {
|
|
65
|
+
const close = authority.indexOf("]");
|
|
66
|
+
if (close < 0) return null;
|
|
67
|
+
host = authority.slice(0, close + 1);
|
|
68
|
+
const after = authority.slice(close + 1);
|
|
69
|
+
if (after && !after.startsWith(":")) return null;
|
|
70
|
+
port = after.slice(1);
|
|
71
|
+
if (!IPV6.test(host)) return null;
|
|
72
|
+
} else {
|
|
73
|
+
const colon = authority.lastIndexOf(":");
|
|
74
|
+
host = colon < 0 ? authority : authority.slice(0, colon);
|
|
75
|
+
port = colon < 0 ? "" : authority.slice(colon + 1);
|
|
76
|
+
if (!HOST.test(host)) return null;
|
|
77
|
+
}
|
|
78
|
+
const name = scheme[1]!.toLowerCase();
|
|
79
|
+
let portPart = "";
|
|
80
|
+
if (port) {
|
|
81
|
+
if (!/^[0-9]{1,5}$/.test(port) || Number(port) > 65535) return null;
|
|
82
|
+
const n = Number(port);
|
|
83
|
+
if (!((name === "http" && n === 80) || (name === "https" && n === 443))) portPart = `:${n}`;
|
|
84
|
+
}
|
|
85
|
+
const bytes = new TextEncoder().encode(rest.slice(end));
|
|
86
|
+
let tail = "";
|
|
87
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
88
|
+
const b = bytes[i]!;
|
|
89
|
+
if (b === 0x25 && isHex(bytes[i + 1]) && isHex(bytes[i + 2])) {
|
|
90
|
+
tail += String.fromCharCode(b, bytes[i + 1]!, bytes[i + 2]!);
|
|
91
|
+
i += 2;
|
|
92
|
+
} else if (b < 0x80 && PATH_CHAR.test(String.fromCharCode(b))) tail += String.fromCharCode(b);
|
|
93
|
+
else tail += `%${b.toString(16).toUpperCase().padStart(2, "0")}`;
|
|
94
|
+
}
|
|
95
|
+
const q = tail.indexOf("?");
|
|
96
|
+
const path = (q < 0 ? tail : tail.slice(0, q)) || "/";
|
|
97
|
+
if (path.split("/").some((segment) => DOT_SEGMENTS.has(segment.toLowerCase()))) return null;
|
|
98
|
+
return `${name}://${host.toLowerCase()}${portPart}${path}${q < 0 ? "" : tail.slice(q)}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A URL as the page gives it → the canonical form, after WHATWG parsing (new URL) resolves dots, IDN hosts and escapes. */
|
|
102
|
+
export function normalizeUrl(url: unknown): string {
|
|
103
|
+
if (typeof url !== "string" || url.length === 0) throw invalid("url must be an absolute http or https URL");
|
|
104
|
+
let parsed: URL;
|
|
105
|
+
try {
|
|
106
|
+
parsed = new URL(url);
|
|
107
|
+
} catch {
|
|
108
|
+
throw invalid(`${url} is not an absolute URL`);
|
|
109
|
+
}
|
|
110
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
|
|
111
|
+
throw invalid(`only http and https URLs can be requested (got ${parsed.protocol})`);
|
|
112
|
+
if (parsed.username || parsed.password)
|
|
113
|
+
throw invalid("url must not hold credentials; send an Authorization header instead");
|
|
114
|
+
const canonical = canonicalUrl(parsed.href);
|
|
115
|
+
if (!canonical) throw invalid(`${url} is not an http or https URL akan-native can request`);
|
|
116
|
+
return canonical;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** The origin of a canonical URL (whose path always starts with "/"): scheme, host and port. */
|
|
120
|
+
export function originOf(url: string): string {
|
|
121
|
+
const slash = url.indexOf("/", url.indexOf("://") + 3);
|
|
122
|
+
return slash < 0 ? url : url.slice(0, slash);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** PL-11: the app's capabilities may limit requests to scopes { url } (URL patterns, urlMatch in @akanjs/native/core). */
|
|
126
|
+
export function checkScope(scope: CallScope | undefined, url: string, what = "request to"): void {
|
|
127
|
+
if (!scopePermits(scope, { url }, [], ["url"]))
|
|
128
|
+
throw new AkanNativeError("NOT_ALLOWED", `${what} ${url} is outside the app's capabilities`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface Prepared {
|
|
132
|
+
url: string;
|
|
133
|
+
method: HttpMethod;
|
|
134
|
+
/** Names as given; unique regardless of case. */
|
|
135
|
+
headers: [string, string][];
|
|
136
|
+
body: Uint8Array | null;
|
|
137
|
+
responseType: NativeResponseType;
|
|
138
|
+
timeout: number;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const BASE64 = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
142
|
+
|
|
143
|
+
export function base64ToBytes(data: string): Uint8Array | null {
|
|
144
|
+
if (!BASE64.test(data) || data.length % 4 === 1 || (data.includes("=") && data.length % 4 !== 0)) return null;
|
|
145
|
+
const binary = atob(data.padEnd(Math.ceil(data.length / 4) * 4, "="));
|
|
146
|
+
const bytes = new Uint8Array(binary.length);
|
|
147
|
+
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
148
|
+
return bytes;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function bytesToBase64(bytes: Uint8Array): string {
|
|
152
|
+
const native = (bytes as Uint8Array & { toBase64?: () => string }).toBase64;
|
|
153
|
+
if (typeof native === "function") return native.call(bytes);
|
|
154
|
+
let binary = "";
|
|
155
|
+
for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
156
|
+
return btoa(binary);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Checks a request as the host receives it (the page wrapper already made url canonical). */
|
|
160
|
+
export function prepare(args: unknown): Prepared {
|
|
161
|
+
if (!args || typeof args !== "object" || Array.isArray(args)) throw invalid("options must be an object");
|
|
162
|
+
const o = args as Record<string, unknown>;
|
|
163
|
+
if (typeof o.url !== "string") throw invalid("url must be an absolute http or https URL");
|
|
164
|
+
const url = canonicalUrl(o.url);
|
|
165
|
+
if (!url) throw invalid(`${o.url} is not an http or https URL akan-native can request`);
|
|
166
|
+
|
|
167
|
+
const method = (o.method ?? "GET") as HttpMethod;
|
|
168
|
+
if (!METHODS.includes(method)) throw invalid(`method must be one of ${METHODS.join(", ")}`);
|
|
169
|
+
|
|
170
|
+
const headers: [string, string][] = [];
|
|
171
|
+
if (o.headers !== undefined && o.headers !== null) {
|
|
172
|
+
if (typeof o.headers !== "object" || Array.isArray(o.headers))
|
|
173
|
+
throw invalid("headers must be an object of strings");
|
|
174
|
+
const seen = new Set<string>();
|
|
175
|
+
for (const [name, value] of Object.entries(o.headers as Record<string, unknown>)) {
|
|
176
|
+
if (!TOKEN.test(name)) throw invalid(`header name ${JSON.stringify(name)} is not valid`);
|
|
177
|
+
const lower = name.toLowerCase();
|
|
178
|
+
if (RESERVED_HEADERS.has(lower)) throw invalid(`header ${name} is set by the HTTP stack`);
|
|
179
|
+
if (seen.has(lower)) throw invalid(`header ${name} is given twice`);
|
|
180
|
+
seen.add(lower);
|
|
181
|
+
if (typeof value !== "string") throw invalid(`headers.${name} must be a string`);
|
|
182
|
+
if (/[\r\n\0]/.test(value)) throw invalid(`headers.${name} must not contain CR, LF or NUL`);
|
|
183
|
+
headers.push([name, value.replace(/^[ \t]+|[ \t]+$/g, "")]);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const encoding = (o.bodyEncoding ?? "utf8") as BodyEncoding;
|
|
188
|
+
if (encoding !== "utf8" && encoding !== "base64") throw invalid("bodyEncoding must be one of utf8, base64");
|
|
189
|
+
let body: Uint8Array | null = null;
|
|
190
|
+
if (o.body !== undefined && o.body !== null) {
|
|
191
|
+
if (typeof o.body !== "string")
|
|
192
|
+
throw invalid('body must be a string (text, or base64 with bodyEncoding: "base64")');
|
|
193
|
+
if (method === "GET" || method === "HEAD") throw invalid(`a ${method} request cannot have a body`);
|
|
194
|
+
body = encoding === "base64" ? base64ToBytes(o.body) : new TextEncoder().encode(o.body);
|
|
195
|
+
if (!body) throw invalid("body is not valid base64");
|
|
196
|
+
if (!headers.some(([name]) => name.toLowerCase() === "content-type")) {
|
|
197
|
+
headers.push(["Content-Type", encoding === "base64" ? "application/octet-stream" : "text/plain;charset=UTF-8"]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const responseType = (o.responseType ?? "text") as NativeResponseType;
|
|
202
|
+
if (responseType !== "text" && responseType !== "base64") throw invalid("responseType must be one of text, base64");
|
|
203
|
+
|
|
204
|
+
const timeout = o.timeout ?? DEFAULT_TIMEOUT;
|
|
205
|
+
if (typeof timeout !== "number" || !Number.isFinite(timeout) || timeout <= 0 || timeout > MAX_TIMEOUT) {
|
|
206
|
+
throw invalid(`timeout must be a number of milliseconds between 1 and ${MAX_TIMEOUT}`);
|
|
207
|
+
}
|
|
208
|
+
return { url, method, headers, body, responseType, timeout };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Methods that get an empty body (Content-Length: 0) when none is given. */
|
|
212
|
+
export const BODY_METHODS = new Set(["POST", "PUT", "PATCH"]);
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* The next hop of a redirect, per the fetch standard (HTTP-redirect fetch, steps 12-13 and the
|
|
216
|
+
* cross-origin Authorization rule): 301/302 turn POST into GET, 303 turns everything but GET/HEAD
|
|
217
|
+
* into GET, both dropping the body and its headers; 307/308 keep method and body. Credentials
|
|
218
|
+
* (Authorization, Cookie, Proxy-Authorization) do not follow to another origin.
|
|
219
|
+
*/
|
|
220
|
+
export function redirected(
|
|
221
|
+
status: number,
|
|
222
|
+
request: { method: HttpMethod; headers: [string, string][]; body: Uint8Array | null },
|
|
223
|
+
from: string,
|
|
224
|
+
to: string,
|
|
225
|
+
): { method: HttpMethod; headers: [string, string][]; body: Uint8Array | null } {
|
|
226
|
+
let { method, headers, body } = request;
|
|
227
|
+
if (
|
|
228
|
+
((status === 301 || status === 302) && method === "POST") ||
|
|
229
|
+
(status === 303 && method !== "GET" && method !== "HEAD")
|
|
230
|
+
) {
|
|
231
|
+
method = "GET";
|
|
232
|
+
body = null;
|
|
233
|
+
headers = headers.filter(
|
|
234
|
+
([name]) =>
|
|
235
|
+
!["content-type", "content-encoding", "content-language", "content-location"].includes(name.toLowerCase()),
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
if (originOf(from) !== originOf(to)) {
|
|
239
|
+
headers = headers.filter(
|
|
240
|
+
([name]) => !["authorization", "cookie", "proxy-authorization"].includes(name.toLowerCase()),
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
return { method, headers, body };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** A redirect target: Location resolved against the current URL, in canonical form. */
|
|
247
|
+
export function redirectTarget(location: string, current: string): string {
|
|
248
|
+
let next: string | null = null;
|
|
249
|
+
try {
|
|
250
|
+
next = canonicalUrl(new URL(location, current).href);
|
|
251
|
+
} catch {
|
|
252
|
+
}
|
|
253
|
+
if (!next) throw new AkanNativeError("INTERNAL", `cannot follow the redirect from ${current} to ${location}`);
|
|
254
|
+
return next;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Response headers: lowercase names, repeated headers joined with ", " (Set-Cookie too, as
|
|
259
|
+
* iOS and Android give them). Content-Encoding and Content-Length describe the encoded body,
|
|
260
|
+
* which every platform has already decoded, so they are left out then (Android drops them too).
|
|
261
|
+
*/
|
|
262
|
+
export function responseHeaders(headers: Headers): Record<string, string> {
|
|
263
|
+
const out: Record<string, string> = {};
|
|
264
|
+
headers.forEach((value, name) => {
|
|
265
|
+
if (name !== "set-cookie") out[name] = out[name] === undefined ? value : `${out[name]}, ${value}`;
|
|
266
|
+
});
|
|
267
|
+
const cookies = typeof headers.getSetCookie === "function" ? headers.getSetCookie() : [];
|
|
268
|
+
if (cookies.length) out["set-cookie"] = cookies.join(", ");
|
|
269
|
+
const encoding = out["content-encoding"];
|
|
270
|
+
if (encoding !== undefined && encoding.toLowerCase() !== "identity") {
|
|
271
|
+
delete out["content-encoding"];
|
|
272
|
+
delete out["content-length"];
|
|
273
|
+
}
|
|
274
|
+
return out;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const utf8 = new TextDecoder("utf-8");
|
|
278
|
+
|
|
279
|
+
/** The body for the bridge: UTF-8 text (BOM dropped, bad bytes as U+FFFD, as fetch's text()) or base64. */
|
|
280
|
+
export function encodeBody(bytes: Uint8Array, type: NativeResponseType): string {
|
|
281
|
+
return type === "base64" ? bytesToBase64(bytes) : utf8.decode(bytes);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Any failure of the transfer itself (DNS, connect, TLS, reset, timeout): INTERNAL. */
|
|
285
|
+
export function networkError(error: unknown, request: Prepared, hint = ""): AkanNativeError {
|
|
286
|
+
if (error instanceof AkanNativeError) return error;
|
|
287
|
+
const name = (error as { name?: string })?.name;
|
|
288
|
+
if (name === "TimeoutError")
|
|
289
|
+
return new AkanNativeError("INTERNAL", `request to ${request.url} timed out after ${request.timeout} ms`);
|
|
290
|
+
return new AkanNativeError(
|
|
291
|
+
"INTERNAL",
|
|
292
|
+
`request to ${request.url} failed: ${String((error as Error)?.message ?? error)}${hint}`,
|
|
293
|
+
);
|
|
294
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
4
|
+
import { defineDesktopPlugin } from "../../../packages/desktop/src/plugin.ts";
|
|
5
|
+
import {
|
|
6
|
+
BODY_METHODS,
|
|
7
|
+
checkScope,
|
|
8
|
+
encodeBody,
|
|
9
|
+
MAX_REDIRECTS,
|
|
10
|
+
networkError,
|
|
11
|
+
prepare,
|
|
12
|
+
REDIRECTS,
|
|
13
|
+
redirected,
|
|
14
|
+
redirectTarget,
|
|
15
|
+
responseHeaders,
|
|
16
|
+
} from "./common.ts";
|
|
17
|
+
import type { HttpSpec } from "./index.ts";
|
|
18
|
+
|
|
19
|
+
/** `send` is replaceable for tests; the default is Bun's fetch. */
|
|
20
|
+
export function createDesktopHttp(send: typeof fetch = globalThis.fetch) {
|
|
21
|
+
return defineDesktopPlugin<HttpSpec>({
|
|
22
|
+
id: "http",
|
|
23
|
+
methods: {
|
|
24
|
+
async request(args, ctx) {
|
|
25
|
+
const request = prepare(args);
|
|
26
|
+
checkScope(ctx.scope, request.url);
|
|
27
|
+
|
|
28
|
+
const signal = ctx.signal
|
|
29
|
+
? AbortSignal.any([AbortSignal.timeout(request.timeout), ctx.signal])
|
|
30
|
+
: AbortSignal.timeout(request.timeout);
|
|
31
|
+
let url = request.url;
|
|
32
|
+
let hop = { method: request.method, headers: request.headers, body: request.body };
|
|
33
|
+
try {
|
|
34
|
+
for (let redirects = 0; ; redirects++) {
|
|
35
|
+
const body = hop.body ?? (BODY_METHODS.has(hop.method) ? new Uint8Array(0) : null);
|
|
36
|
+
const response = await send(url, {
|
|
37
|
+
method: hop.method,
|
|
38
|
+
headers: hop.headers,
|
|
39
|
+
body: body as BodyInit | null,
|
|
40
|
+
redirect: "manual",
|
|
41
|
+
signal,
|
|
42
|
+
});
|
|
43
|
+
const location = REDIRECTS.has(response.status) ? response.headers.get("location") : null;
|
|
44
|
+
if (location === null) {
|
|
45
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
46
|
+
return {
|
|
47
|
+
status: response.status,
|
|
48
|
+
headers: responseHeaders(response.headers),
|
|
49
|
+
data: encodeBody(bytes, request.responseType),
|
|
50
|
+
url,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
await response.body?.cancel();
|
|
54
|
+
if (redirects === MAX_REDIRECTS)
|
|
55
|
+
throw new AkanNativeError("INTERNAL", `${request.url} redirected more than ${MAX_REDIRECTS} times`);
|
|
56
|
+
const next = redirectTarget(location, url);
|
|
57
|
+
checkScope(ctx.scope, next, "redirect to");
|
|
58
|
+
hop = redirected(response.status, hop, url, next);
|
|
59
|
+
url = next;
|
|
60
|
+
}
|
|
61
|
+
} catch (error) {
|
|
62
|
+
throw networkError(error, request);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default createDesktopHttp();
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { AkanNativeError, type CallOptions, definePlugin, type Plugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import { base64ToBytes, bytesToBase64, normalizeUrl } from "./common.ts";
|
|
3
|
+
import { web } from "./web.ts";
|
|
4
|
+
|
|
5
|
+
export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
|
|
6
|
+
export type BodyEncoding = "utf8" | "base64";
|
|
7
|
+
/** How the host hands the body over the bridge. "json" (below) is text parsed in the page. */
|
|
8
|
+
export type NativeResponseType = "text" | "base64";
|
|
9
|
+
export type ResponseType = NativeResponseType | "json";
|
|
10
|
+
|
|
11
|
+
/** A request as the host receives it (the PL-10 spec types). */
|
|
12
|
+
export interface NativeRequest {
|
|
13
|
+
/**
|
|
14
|
+
* Absolute http or https URL. The page sends it in canonical form (WHATWG-parsed, lowercase
|
|
15
|
+
* scheme and host, no default port or fragment): that is what the app's scope matches.
|
|
16
|
+
*/
|
|
17
|
+
url: string;
|
|
18
|
+
/** Default GET. */
|
|
19
|
+
method?: HttpMethod;
|
|
20
|
+
/**
|
|
21
|
+
* Request headers, each name once (whatever its case). Host, Content-Length, Transfer-Encoding,
|
|
22
|
+
* Connection, Keep-Alive, Upgrade, TE, Trailer, Expect and Accept-Encoding belong to the HTTP
|
|
23
|
+
* stack and reject INVALID_ARGS. Nothing adds cookies: send a Cookie header yourself.
|
|
24
|
+
*/
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
/**
|
|
27
|
+
* Text (sent as UTF-8) or, with bodyEncoding "base64", bytes. Without a Content-Type header one
|
|
28
|
+
* is added: text/plain;charset=UTF-8 or application/octet-stream. GET and HEAD cannot have one;
|
|
29
|
+
* POST, PUT and PATCH without one send an empty body.
|
|
30
|
+
*/
|
|
31
|
+
body?: string;
|
|
32
|
+
/** Default utf8. */
|
|
33
|
+
bodyEncoding?: BodyEncoding;
|
|
34
|
+
/** Default text. */
|
|
35
|
+
responseType?: NativeResponseType;
|
|
36
|
+
/** Milliseconds for the whole request (redirects and body included). Default 60000. */
|
|
37
|
+
timeout?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface NativeResponse {
|
|
41
|
+
status: number;
|
|
42
|
+
/**
|
|
43
|
+
* Lowercase names; a repeated header (Set-Cookie too) is joined with ", ". Content-Encoding and
|
|
44
|
+
* Content-Length are left out when the body came compressed (it is always decoded).
|
|
45
|
+
*/
|
|
46
|
+
headers: Record<string, string>;
|
|
47
|
+
/** Text (UTF-8, BOM dropped, invalid bytes as U+FFFD) or base64. */
|
|
48
|
+
data: string;
|
|
49
|
+
/** The URL that answered, after redirects, in canonical form. */
|
|
50
|
+
url: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The bridge spec the Swift and Kotlin bindings are generated from (PL-10). */
|
|
54
|
+
export interface HttpSpec {
|
|
55
|
+
request(options: NativeRequest): Promise<NativeResponse>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface HttpRequestOptions extends Omit<NativeRequest, "responseType"> {
|
|
59
|
+
/** "json" parses the text in the page (an empty body is null); invalid JSON rejects INTERNAL. Default text. */
|
|
60
|
+
responseType?: ResponseType;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface HttpResponse<T = string> extends Omit<NativeResponse, "data"> {
|
|
64
|
+
data: T;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* HTTP from the native side of the app (WV-5, Capacitor's CapacitorHttp approach): no CORS, since
|
|
69
|
+
* the request does not come from the page. iOS URLSession, Android HttpURLConnection, desktop
|
|
70
|
+
* Bun's fetch; the web falls back to the page's fetch, where CORS and the page's
|
|
71
|
+
* Content-Security-Policy (connect-src) apply as usual.
|
|
72
|
+
*
|
|
73
|
+
* - Any status resolves (404 and 500 too); network failures (DNS, refused, TLS, timeout) reject
|
|
74
|
+
* INTERNAL, invalid options INVALID_ARGS.
|
|
75
|
+
* - Redirects are followed (at most 20) as fetch does: 301/302 POST and 303 become GET,
|
|
76
|
+
* Authorization and Cookie are not sent to another origin, and every hop must be inside the
|
|
77
|
+
* app's scope.
|
|
78
|
+
* - No cookie jar and no cache on any platform.
|
|
79
|
+
* - Plain http:// is refused by iOS App Transport Security and Android's cleartext policy unless
|
|
80
|
+
* the app allows it (PERMISSION_DENIED); desktop allows it.
|
|
81
|
+
* - The app's capabilities (PL-11) limit URLs with scopes { url }: URL patterns whose scheme,
|
|
82
|
+
* host, port and path are compared separately (urlMatch in @akanjs/native/core; no port = the default port
|
|
83
|
+
* in allow, any port in deny), e.g. { identifier: "http:default", allow: [{ url: "https://api.example.com/*" }] }.
|
|
84
|
+
* http:default allows no URL until the app lists them.
|
|
85
|
+
* - Bodies travel over the bridge as text or base64: fine for API calls, not for large downloads.
|
|
86
|
+
*/
|
|
87
|
+
export interface HttpApi {
|
|
88
|
+
request(options: HttpRequestOptions & { responseType: "json" }): Promise<HttpResponse<unknown>>;
|
|
89
|
+
request(options: HttpRequestOptions & { responseType?: NativeResponseType }): Promise<HttpResponse<string>>;
|
|
90
|
+
request(options: HttpRequestOptions): Promise<HttpResponse<unknown>>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const handle = definePlugin<HttpSpec>("http", { methods: ["request"], web });
|
|
94
|
+
|
|
95
|
+
const RESPONSE_TYPES: readonly ResponseType[] = ["text", "json", "base64"];
|
|
96
|
+
|
|
97
|
+
function asJson(response: NativeResponse): HttpResponse<unknown> {
|
|
98
|
+
if (response.data === "") return { ...response, data: null };
|
|
99
|
+
try {
|
|
100
|
+
return { ...response, data: JSON.parse(response.data) };
|
|
101
|
+
} catch (error) {
|
|
102
|
+
throw new AkanNativeError(
|
|
103
|
+
"INTERNAL",
|
|
104
|
+
`${response.url} answered ${response.status} with a body that is not JSON: ${(error as Error).message}`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function request(options: HttpRequestOptions, call?: CallOptions): Promise<HttpResponse<unknown>> {
|
|
110
|
+
try {
|
|
111
|
+
if (!options || typeof options !== "object") throw new AkanNativeError("INVALID_ARGS", "options must be an object");
|
|
112
|
+
const { responseType, method, ...rest } = options;
|
|
113
|
+
if (responseType !== undefined && !RESPONSE_TYPES.includes(responseType)) {
|
|
114
|
+
throw new AkanNativeError("INVALID_ARGS", `responseType must be one of ${RESPONSE_TYPES.join(", ")}`);
|
|
115
|
+
}
|
|
116
|
+
const wire: NativeRequest = { ...rest, url: normalizeUrl(options.url) };
|
|
117
|
+
if (method !== undefined) wire.method = (typeof method === "string" ? method.toUpperCase() : method) as HttpMethod;
|
|
118
|
+
if (responseType === "text" || responseType === "base64") wire.responseType = responseType;
|
|
119
|
+
const sent = call ? handle.request(wire, call) : handle.request(wire);
|
|
120
|
+
return responseType === "json" ? sent.then(asJson) : sent;
|
|
121
|
+
} catch (error) {
|
|
122
|
+
return Promise.reject(AkanNativeError.from(error));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type Http = Plugin<HttpApi>;
|
|
127
|
+
|
|
128
|
+
export const http: Http = Object.freeze({ ...handle, request }) as unknown as Http;
|
|
129
|
+
|
|
130
|
+
export interface FetchOptions {
|
|
131
|
+
/** Default GET; any case. */
|
|
132
|
+
method?: string;
|
|
133
|
+
headers?: HeadersInit;
|
|
134
|
+
body?: string | ArrayBuffer | ArrayBufferView | URLSearchParams | null;
|
|
135
|
+
/** Milliseconds for the whole request. Default 60000. */
|
|
136
|
+
timeout?: number;
|
|
137
|
+
/** Stops the request (the host cancels it too); rejects with CANCELLED, or TIMEOUT for AbortSignal.timeout. */
|
|
138
|
+
signal?: AbortSignal;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const NULL_BODY = new Set([101, 103, 204, 205, 304]);
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* A small fetch() over http.request, for code written against fetch: the Response is built from
|
|
145
|
+
* the native result (body as bytes, so text(), json(), arrayBuffer() and blob() work; `url` is the
|
|
146
|
+
* final URL). No streaming, no Request objects. `signal` cancels the request on the host too.
|
|
147
|
+
*/
|
|
148
|
+
export async function fetch(input: string | URL, init: FetchOptions = {}): Promise<Response> {
|
|
149
|
+
const headers: Record<string, string> = {};
|
|
150
|
+
for (const [name, value] of new Headers(init.headers)) headers[name] = value;
|
|
151
|
+
const method = (init.method ?? "GET").toUpperCase() as HttpMethod;
|
|
152
|
+
const options: HttpRequestOptions = { url: String(input), method, headers, responseType: "base64" };
|
|
153
|
+
const body = init.body;
|
|
154
|
+
if (typeof body === "string") options.body = body;
|
|
155
|
+
else if (body instanceof URLSearchParams) {
|
|
156
|
+
options.body = body.toString();
|
|
157
|
+
headers["content-type"] ??= "application/x-www-form-urlencoded;charset=UTF-8";
|
|
158
|
+
} else if (body instanceof ArrayBuffer) {
|
|
159
|
+
options.body = bytesToBase64(new Uint8Array(body));
|
|
160
|
+
options.bodyEncoding = "base64";
|
|
161
|
+
} else if (ArrayBuffer.isView(body)) {
|
|
162
|
+
options.body = bytesToBase64(new Uint8Array(body.buffer, body.byteOffset, body.byteLength));
|
|
163
|
+
options.bodyEncoding = "base64";
|
|
164
|
+
} else if (body !== undefined && body !== null) {
|
|
165
|
+
throw new AkanNativeError("INVALID_ARGS", "body must be a string, ArrayBuffer, typed array or URLSearchParams");
|
|
166
|
+
}
|
|
167
|
+
if (init.timeout !== undefined) options.timeout = init.timeout;
|
|
168
|
+
|
|
169
|
+
const result = (await request(options, init.signal ? { signal: init.signal } : undefined)) as HttpResponse<string>;
|
|
170
|
+
const responseHeaders = new Headers();
|
|
171
|
+
for (const [name, value] of Object.entries(result.headers)) {
|
|
172
|
+
try {
|
|
173
|
+
responseHeaders.append(name, value);
|
|
174
|
+
} catch {
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const bytes = NULL_BODY.has(result.status) || method === "HEAD" ? null : base64ToBytes(result.data);
|
|
178
|
+
const response = new Response(bytes as BodyInit | null, { status: result.status, headers: responseHeaders });
|
|
179
|
+
Object.defineProperty(response, "url", { value: result.url });
|
|
180
|
+
return response;
|
|
181
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { defineWebPlugin, type WebCallContext } from "../../../packages/core/src/index.ts";
|
|
4
|
+
import { canonicalUrl, checkScope, encodeBody, networkError, prepare, responseHeaders } from "./common.ts";
|
|
5
|
+
import type { HttpSpec } from "./index.ts";
|
|
6
|
+
|
|
7
|
+
const HINT =
|
|
8
|
+
" (on the web the server must allow this origin (CORS) and the page's Content-Security-Policy must allow it in connect-src)";
|
|
9
|
+
|
|
10
|
+
export const web = defineWebPlugin<HttpSpec>({
|
|
11
|
+
methods: {
|
|
12
|
+
async request(args, ctx?: WebCallContext) {
|
|
13
|
+
const request = prepare(args);
|
|
14
|
+
checkScope(ctx?.scope, request.url);
|
|
15
|
+
let response: Response;
|
|
16
|
+
let bytes: Uint8Array;
|
|
17
|
+
try {
|
|
18
|
+
response = await globalThis.fetch(request.url, {
|
|
19
|
+
method: request.method,
|
|
20
|
+
headers: request.headers,
|
|
21
|
+
body: request.body as BodyInit | null,
|
|
22
|
+
redirect: "follow",
|
|
23
|
+
cache: "no-store",
|
|
24
|
+
signal: AbortSignal.timeout(request.timeout),
|
|
25
|
+
});
|
|
26
|
+
bytes = new Uint8Array(await response.arrayBuffer());
|
|
27
|
+
} catch (error) {
|
|
28
|
+
throw networkError(error, request, HINT);
|
|
29
|
+
}
|
|
30
|
+
const url = (response.url && canonicalUrl(response.url)) || request.url;
|
|
31
|
+
if (url !== request.url) checkScope(ctx?.scope, url, "redirect to");
|
|
32
|
+
return {
|
|
33
|
+
status: response.status,
|
|
34
|
+
headers: responseHeaders(response.headers),
|
|
35
|
+
data: encodeBody(bytes, request.responseType),
|
|
36
|
+
url,
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|