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,317 @@
|
|
|
1
|
+
// Decisions every akan-native host makes the same way (docs/architecture.md §5): a port of
|
|
2
|
+
// packages/core/src/kernel.ts and protocol.ts validateRequest. Foundation only, so
|
|
3
|
+
// scripts/native-vectors.ts compiles it on the Mac with swiftc, and the self-test runs the same
|
|
4
|
+
// vectors on the device (AkanNativeVectors.swift, dev builds). Tables come from AkanNativeContract.swift.
|
|
5
|
+
|
|
6
|
+
import Foundation
|
|
7
|
+
|
|
8
|
+
enum AkanNativeRoute: Equatable {
|
|
9
|
+
case initScript
|
|
10
|
+
case ipc
|
|
11
|
+
case hello
|
|
12
|
+
case file(String)
|
|
13
|
+
case asset(String)
|
|
14
|
+
case notFound
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
enum AkanNativeRangeAnswer: Equatable {
|
|
18
|
+
case whole
|
|
19
|
+
/// First and last byte, inclusive.
|
|
20
|
+
case part(Int64, Int64)
|
|
21
|
+
case unsatisfiable
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
enum AkanNativeAdmission: String {
|
|
25
|
+
case current, new, ended, noDoc = "no-doc"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
enum AkanNativeNavigation: String {
|
|
29
|
+
case load, open, drop
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// kernel.ts RetainedEvents: events that can come before the page listens (links, taps; C2). A live
|
|
33
|
+
/// event goes to every listener; one that no listener accepted is kept when `retain` (at most
|
|
34
|
+
/// maxRetainedEvents) and replayed, in order, to the next listener, once. A listener returns false
|
|
35
|
+
/// when it is gone: it is dropped and the event counts as not delivered.
|
|
36
|
+
final class AkanNativeRetained<T> {
|
|
37
|
+
private var listeners: [(key: String, fn: (T) -> Bool)] = []
|
|
38
|
+
private var queue: [T] = []
|
|
39
|
+
|
|
40
|
+
func listen(_ key: String, _ fn: @escaping (T) -> Bool) {
|
|
41
|
+
if let i = listeners.firstIndex(where: { $0.key == key }) { listeners[i].fn = fn } else { listeners.append((key, fn)) }
|
|
42
|
+
while let first = queue.first {
|
|
43
|
+
if !fn(first) { return unlisten(key) }
|
|
44
|
+
queue.removeFirst()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func unlisten(_ key: String) {
|
|
49
|
+
listeners.removeAll { $0.key == key }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// Listeners registered (K13).
|
|
53
|
+
var listenerCount: Int { listeners.count }
|
|
54
|
+
|
|
55
|
+
func emit(_ event: T, retain: Bool) {
|
|
56
|
+
var delivered = false
|
|
57
|
+
for listener in listeners {
|
|
58
|
+
if listener.fn(event) { delivered = true } else { unlisten(listener.key) }
|
|
59
|
+
}
|
|
60
|
+
guard !delivered, retain else { return }
|
|
61
|
+
queue.append(event)
|
|
62
|
+
if queue.count > AkanNativeContract.maxRetainedEvents { queue.removeFirst() }
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
enum AkanNativeKernel {
|
|
67
|
+
// MARK: ids
|
|
68
|
+
|
|
69
|
+
/// Whether `s` follows an id grammar: its characters and length, and an optional ".ext" after the first dot.
|
|
70
|
+
static func idValid(_ spec: AkanNativeIdSpec, _ s: String) -> Bool {
|
|
71
|
+
let scalars = Array(s.unicodeScalars)
|
|
72
|
+
func run(_ part: ArraySlice<Unicode.Scalar>, _ chars: String, _ min: Int, _ max: Int) -> Bool {
|
|
73
|
+
(min...max).contains(part.count) && part.allSatisfy { chars.unicodeScalars.contains($0) }
|
|
74
|
+
}
|
|
75
|
+
if spec.extMax > 0 {
|
|
76
|
+
guard let dot = scalars.firstIndex(of: ".") else { return run(scalars[...], spec.chars, spec.min, spec.max) }
|
|
77
|
+
return run(scalars[..<dot], spec.chars, spec.min, spec.max) && run(scalars[(dot + 1)...], spec.extChars, 1, spec.extMax)
|
|
78
|
+
}
|
|
79
|
+
guard let first = scalars.first, (spec.min...spec.max).contains(scalars.count) else { return false }
|
|
80
|
+
let firstSet = spec.first.isEmpty ? spec.chars : spec.first
|
|
81
|
+
return firstSet.unicodeScalars.contains(first) && !spec.notFirst.unicodeScalars.contains(first)
|
|
82
|
+
&& scalars.dropFirst().allSatisfy { spec.chars.unicodeScalars.contains($0) }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static func isFileRefId(_ s: String) -> Bool { idValid(AkanNativeContract.idFileRef, s) }
|
|
86
|
+
static func isBundleId(_ s: String) -> Bool { idValid(AkanNativeContract.idBundle, s) }
|
|
87
|
+
static func isDocumentId(_ s: String) -> Bool { idValid(AkanNativeContract.idDocument, s) }
|
|
88
|
+
static func isName(_ s: String) -> Bool { idValid(AkanNativeContract.idName, s) }
|
|
89
|
+
|
|
90
|
+
// MARK: paths and routes
|
|
91
|
+
|
|
92
|
+
/// Strict percent-decoding: "%" and two hex digits, and the result must be UTF-8; otherwise nil.
|
|
93
|
+
/// (removingPercentEncoding is not used: what it accepts is not specified.)
|
|
94
|
+
static func decodePath(_ s: String) -> String? {
|
|
95
|
+
let input = Array(s.utf8)
|
|
96
|
+
var bytes: [UInt8] = []
|
|
97
|
+
bytes.reserveCapacity(input.count)
|
|
98
|
+
var i = 0
|
|
99
|
+
while i < input.count {
|
|
100
|
+
if input[i] == UInt8(ascii: "%") {
|
|
101
|
+
guard i + 2 < input.count, let hi = hex(input[i + 1]), let lo = hex(input[i + 2]) else { return nil }
|
|
102
|
+
bytes.append(hi << 4 | lo)
|
|
103
|
+
i += 3
|
|
104
|
+
} else {
|
|
105
|
+
bytes.append(input[i])
|
|
106
|
+
i += 1
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
var scalars = String.UnicodeScalarView()
|
|
110
|
+
var codec = UTF8()
|
|
111
|
+
var iterator = bytes.makeIterator()
|
|
112
|
+
while true {
|
|
113
|
+
switch codec.decode(&iterator) {
|
|
114
|
+
case .scalarValue(let scalar): scalars.append(scalar)
|
|
115
|
+
case .emptyInput: return String(scalars)
|
|
116
|
+
case .error: return nil
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private static func hex(_ c: UInt8) -> UInt8? {
|
|
122
|
+
switch c {
|
|
123
|
+
case UInt8(ascii: "0")...UInt8(ascii: "9"): c - UInt8(ascii: "0")
|
|
124
|
+
case UInt8(ascii: "a")...UInt8(ascii: "f"): c - UInt8(ascii: "a") + 10
|
|
125
|
+
case UInt8(ascii: "A")...UInt8(ascii: "F"): c - UInt8(ascii: "A") + 10
|
|
126
|
+
default: nil
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/// Maps a URL path (still percent-encoded) to a route (kernel.ts route): the host's own paths,
|
|
131
|
+
/// an existing file, index.html for an SPA route, or 404. `exists` tells whether a relative asset
|
|
132
|
+
/// path exists.
|
|
133
|
+
static func route(_ pathname: String, exists: (String) -> Bool) -> AkanNativeRoute {
|
|
134
|
+
guard let decoded = decodePath(pathname) else { return .notFound }
|
|
135
|
+
let segments = decoded.split(separator: "/", omittingEmptySubsequences: true).map(String.init)
|
|
136
|
+
if segments.contains(where: { $0 == ".." || $0 == "." || $0.contains("\\") || $0.contains("\0") }) { return .notFound }
|
|
137
|
+
if segments.first == AkanNativeContract.routeRoot {
|
|
138
|
+
if segments.count == 2 && segments[1] == AkanNativeContract.routeInit { return .initScript }
|
|
139
|
+
if segments.count == 2 && segments[1] == AkanNativeContract.routeIpc { return .ipc }
|
|
140
|
+
if segments.count == 2 && segments[1] == AkanNativeContract.routeHello { return .hello }
|
|
141
|
+
if segments.count == 3 && segments[1] == AkanNativeContract.routeFile && isFileRefId(segments[2]) { return .file(segments[2]) }
|
|
142
|
+
return .notFound
|
|
143
|
+
}
|
|
144
|
+
let relative = segments.joined(separator: "/")
|
|
145
|
+
if relative.isEmpty || relative == "index.html" { return .asset("index.html") }
|
|
146
|
+
// ":" never reaches the filesystem (kernel.ts); the path can still be an SPA route.
|
|
147
|
+
if !relative.contains(":") && exists(relative) { return .asset(relative) }
|
|
148
|
+
return segments.last!.contains(".") ? .notFound : .asset("index.html")
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// Paths the shell answers itself even with a dev server: /__akan_native/*, and paths that do not decode.
|
|
152
|
+
static func isHostPath(_ pathname: String) -> Bool {
|
|
153
|
+
guard let decoded = decodePath(pathname) else { return true }
|
|
154
|
+
return decoded.split(separator: "/", omittingEmptySubsequences: true).first.map(String.init) == AkanNativeContract.routeRoot
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// MARK: MIME
|
|
158
|
+
|
|
159
|
+
/// The MIME type for a file name (FileRefs): application/octet-stream when unknown.
|
|
160
|
+
static func fileMime(_ path: String) -> String {
|
|
161
|
+
let base = path.split(separator: "/", omittingEmptySubsequences: false).last.map(String.init) ?? path
|
|
162
|
+
guard let dot = base.lastIndex(of: "."), dot != base.startIndex else { return "application/octet-stream" }
|
|
163
|
+
return AkanNativeContract.mime[base[base.index(after: dot)...].lowercased()] ?? "application/octet-stream"
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/// The Content-Type an asset is served with: text types carry charset=utf-8.
|
|
167
|
+
static func assetMime(_ path: String) -> String {
|
|
168
|
+
let mime = fileMime(path)
|
|
169
|
+
return mime.hasPrefix("text/") || AkanNativeContract.mimeUtf8.contains(mime) ? "\(mime); charset=utf-8" : mime
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/// kernel.ts fileRefSandboxed: every FileRef but images other than SVG, audio, video, fonts and
|
|
173
|
+
/// PDF is served with `Content-Security-Policy: sandbox` (an opaque origin: no bridge, no page).
|
|
174
|
+
/// macOS WebKit draws nothing for a sandboxed PDF.
|
|
175
|
+
static func fileRefSandboxed(_ mime: String) -> Bool {
|
|
176
|
+
let kind = (mime.split(separator: ";", omittingEmptySubsequences: false).first.map(String.init) ?? "").trimmingCharacters(in: .whitespaces).lowercased()
|
|
177
|
+
return kind == "image/svg+xml" || !(["image/", "audio/", "video/", "font/"].contains { kind.hasPrefix($0) } || kind == "application/pdf")
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// MARK: Range
|
|
181
|
+
|
|
182
|
+
/// A Range header (IN-5, RFC 9110 §14) for a file of `size` bytes (kernel.ts parseRange): one
|
|
183
|
+
/// "bytes=" range; anything else is ignored (the whole file); a valid range the file cannot
|
|
184
|
+
/// satisfy is 416; at most maxRangeBytes from the start.
|
|
185
|
+
static func parseRange(_ header: String?, size: Int64) -> AkanNativeRangeAnswer {
|
|
186
|
+
guard let header, header.hasPrefix("bytes=") else { return .whole }
|
|
187
|
+
let spec = header.dropFirst("bytes=".count)
|
|
188
|
+
guard let dash = spec.firstIndex(of: "-") else { return .whole }
|
|
189
|
+
func number(_ s: Substring) -> Int64?? {
|
|
190
|
+
guard s.utf8.count <= 18, s.utf8.allSatisfy({ $0 >= UInt8(ascii: "0") && $0 <= UInt8(ascii: "9") }) else { return nil }
|
|
191
|
+
return .some(s.isEmpty ? nil : Int64(s))
|
|
192
|
+
}
|
|
193
|
+
guard let a = number(spec[..<dash]), let b = number(spec[spec.index(after: dash)...]) else { return .whole }
|
|
194
|
+
let start: Int64
|
|
195
|
+
let end: Int64
|
|
196
|
+
switch (a, b) {
|
|
197
|
+
case (nil, nil):
|
|
198
|
+
return .whole
|
|
199
|
+
case (nil, let suffix?):
|
|
200
|
+
if suffix == 0 || size == 0 { return .unsatisfiable }
|
|
201
|
+
start = Swift.max(0, size - suffix)
|
|
202
|
+
end = size - 1
|
|
203
|
+
case (let first?, let last):
|
|
204
|
+
if let last, last < first { return .whole }
|
|
205
|
+
if first >= size { return .unsatisfiable }
|
|
206
|
+
start = first
|
|
207
|
+
end = Swift.min(last ?? Int64.max, size - 1)
|
|
208
|
+
}
|
|
209
|
+
return .part(start, Swift.min(end, start + Int64(AkanNativeContract.maxRangeBytes) - 1))
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// MARK: bridge requests (protocol.ts validateRequest, the same messages)
|
|
213
|
+
|
|
214
|
+
static func validateRequest(_ value: Any?) -> String? {
|
|
215
|
+
guard let o = value as? [String: Any] else { return "request must be an object" }
|
|
216
|
+
guard let v = number(o["v"]), v == 1 else { return "unsupported protocol version: \(jsString(o["v"]))" }
|
|
217
|
+
guard let id = number(o["id"]), id == id.rounded(), abs(id) <= 9_007_199_254_740_991 else { return "id must be an integer" }
|
|
218
|
+
guard let plugin = o["plugin"] as? String, isName(plugin) else { return "invalid plugin name" }
|
|
219
|
+
guard let method = o["method"] as? String, isName(method) else { return "invalid method name" }
|
|
220
|
+
if let doc = o["doc"], !((doc as? String).map(isDocumentId) ?? false) { return "invalid document id" }
|
|
221
|
+
if method == "$listen" || method == "$unlisten", !((o["args"] as? [String: Any])?["event"] is String) {
|
|
222
|
+
return "\(method) requires args.event"
|
|
223
|
+
}
|
|
224
|
+
if plugin == "$bridge" {
|
|
225
|
+
let args = o["args"] as? [String: Any] ?? [:]
|
|
226
|
+
switch method {
|
|
227
|
+
case "cancel":
|
|
228
|
+
guard let id = number(args["id"]), id == id.rounded(), abs(id) <= 9_007_199_254_740_991 else { return "$bridge.cancel requires args.id" }
|
|
229
|
+
if args.keys.contains("reason"), !["abort", "timeout"].contains(args["reason"] as? String ?? "") { return "$bridge.cancel: reason must be abort or timeout" }
|
|
230
|
+
case "release":
|
|
231
|
+
guard args["url"] is String else { return "$bridge.release requires args.url" }
|
|
232
|
+
default:
|
|
233
|
+
return "unknown bridge operation $bridge.\(method)"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return nil
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/// A JSON number that is not a boolean, as a Double.
|
|
240
|
+
private static func number(_ value: Any?) -> Double? {
|
|
241
|
+
guard let n = value as? NSNumber, !(value is String), CFGetTypeID(n) != CFBooleanGetTypeID() else { return nil }
|
|
242
|
+
return n.doubleValue
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/// What JavaScript's String(value) gives for a JSON value (the version message names it).
|
|
246
|
+
private static func jsString(_ value: Any?) -> String {
|
|
247
|
+
switch value {
|
|
248
|
+
case nil: return "undefined"
|
|
249
|
+
case is NSNull: return "null"
|
|
250
|
+
case let s as String: return s
|
|
251
|
+
case let n as NSNumber where CFGetTypeID(n) == CFBooleanGetTypeID(): return n.boolValue ? "true" : "false"
|
|
252
|
+
case let n as NSNumber:
|
|
253
|
+
let d = n.doubleValue
|
|
254
|
+
return d == d.rounded() && abs(d) < 1e21 ? String(Int64(d)) : "\(d)"
|
|
255
|
+
case let a as [Any]: return a.map { $0 is NSNull ? "" : jsString($0) }.joined(separator: ",")
|
|
256
|
+
default: return "[object Object]"
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// MARK: documents (bridge v1.1)
|
|
261
|
+
|
|
262
|
+
/// kernel.ts admitDocument: join the current document, start a new one, refuse an ended one, or
|
|
263
|
+
/// refuse a request without an id while the current document has one.
|
|
264
|
+
static func admitDocument(current: String?, ended: [String], requested: String?) -> AkanNativeAdmission {
|
|
265
|
+
guard let requested else { return current == nil ? .new : current == "" ? .current : .noDoc }
|
|
266
|
+
if requested == current { return .current }
|
|
267
|
+
return ended.contains(requested) ? .ended : .new
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// MARK: declarations (L2)
|
|
271
|
+
|
|
272
|
+
/// kernel.ts declares: whether a plugin's boot.json declaration (its native methods and events on
|
|
273
|
+
/// this platform) lets a call through; undeclared ones are NOT_FOUND before the ACL and the plugin.
|
|
274
|
+
static func declares(_ decl: Any?, method: String, event: String?) -> Bool {
|
|
275
|
+
guard let decl = decl as? [String: Any] else { return false }
|
|
276
|
+
let subscription = method == "$listen" || method == "$unlisten"
|
|
277
|
+
guard let name = subscription ? event : method else { return false }
|
|
278
|
+
return ((decl[subscription ? "events" : "methods"] ?? [Any]()) as? [Any])?.contains { $0 as? String == name } ?? false
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// MARK: navigation (SH-4, L0)
|
|
282
|
+
|
|
283
|
+
/// The lowercase scheme of a URL, or nil when it has none.
|
|
284
|
+
static func schemeOf(_ url: String) -> String? {
|
|
285
|
+
guard let colon = url.firstIndex(of: ":") else { return nil }
|
|
286
|
+
let s = url[..<colon]
|
|
287
|
+
guard let first = s.unicodeScalars.first, first.isASCII, CharacterSet.letters.contains(first),
|
|
288
|
+
s.unicodeScalars.allSatisfy({ $0.isASCII && (CharacterSet.alphanumerics.contains($0) || "+.-".unicodeScalars.contains($0)) }) else { return nil }
|
|
289
|
+
return s.lowercased()
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/// The schemes the shell hands to the OS: the contract's, and what the app added (never the forbidden ones).
|
|
293
|
+
static func externalSchemes(_ extra: [String]) -> [String] {
|
|
294
|
+
AkanNativeContract.externalSchemes + extra.map { $0.lowercased() }.filter { !AkanNativeContract.neverExternalSchemes.contains($0) && !AkanNativeContract.externalSchemes.contains($0) }
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/// kernel.ts decideNavigation: the app's own pages (and about:) load; a top-level navigation
|
|
298
|
+
/// opens in the OS when its scheme is external and is dropped otherwise; a frame loads web content only.
|
|
299
|
+
static func decideNavigation(_ url: String, topLevel: Bool, origin: String, extra: [String]) -> AkanNativeNavigation {
|
|
300
|
+
let scheme = schemeOf(url)
|
|
301
|
+
let inApp = url == origin || (url.hasPrefix(origin) && "/?#".contains(url[url.index(url.startIndex, offsetBy: origin.count)]))
|
|
302
|
+
if inApp {
|
|
303
|
+
// The app's /__akan_native/* paths never become a document of its origin; a frame may show a
|
|
304
|
+
// FileRef, which is served sandboxed (kernel.ts).
|
|
305
|
+
let rest = url.dropFirst(origin.count)
|
|
306
|
+
let head = String(rest.prefix { $0 != "?" && $0 != "#" })
|
|
307
|
+
let path = head.isEmpty ? "/" : head
|
|
308
|
+
if !isHostPath(path) { return .load }
|
|
309
|
+
if case .file = route(path, exists: { _ in false }), !topLevel { return .load }
|
|
310
|
+
return .drop
|
|
311
|
+
}
|
|
312
|
+
if scheme == "about" { return .load }
|
|
313
|
+
guard let scheme else { return .drop }
|
|
314
|
+
if !topLevel { return AkanNativeContract.frameSchemes.contains(scheme) ? .load : .drop }
|
|
315
|
+
return externalSchemes(extra).contains(scheme) ? .open : .drop
|
|
316
|
+
}
|
|
317
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
// Plugin API for iOS (docs/architecture.md §6). Plugins are compiled into the app module together
|
|
2
|
+
// with the shell. Everything a plugin touches runs on the main actor; resolve/reject may be called
|
|
3
|
+
// from any thread (docs/research/ios.md §4.4: Swift 6 mode compiles without warnings this way).
|
|
4
|
+
|
|
5
|
+
import UIKit
|
|
6
|
+
import WebKit
|
|
7
|
+
|
|
8
|
+
enum AkanNativeErrorCode: String, Sendable {
|
|
9
|
+
case unsupported = "UNSUPPORTED"
|
|
10
|
+
case permissionDenied = "PERMISSION_DENIED"
|
|
11
|
+
case cancelled = "CANCELLED"
|
|
12
|
+
/// The page's time limit ran out (AbortSignal.timeout); CANCELLED is any other abort.
|
|
13
|
+
case timeout = "TIMEOUT"
|
|
14
|
+
case invalidArgs = "INVALID_ARGS"
|
|
15
|
+
case notFound = "NOT_FOUND"
|
|
16
|
+
/// The app's capabilities do not grant this (PL-11). permissionDenied is the OS or the user.
|
|
17
|
+
case notAllowed = "NOT_ALLOWED"
|
|
18
|
+
case internalError = "INTERNAL"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// A native plugin. The shell creates one instance per launch, listed in the generated
|
|
22
|
+
/// AkanNativeGeneratedPlugins.swift (no reflection).
|
|
23
|
+
@MainActor
|
|
24
|
+
protocol AkanNativePlugin: AnyObject {
|
|
25
|
+
static var id: String { get }
|
|
26
|
+
init(context: AkanNativePluginContext)
|
|
27
|
+
func handle(_ call: AkanNativeCall)
|
|
28
|
+
/// First page listener for `event` subscribed ($listen).
|
|
29
|
+
func startListening(_ event: String)
|
|
30
|
+
/// Last page listener for `event` left ($unlisten), or the page reloaded.
|
|
31
|
+
func stopListening(_ event: String)
|
|
32
|
+
/// The page's document (one page load) ended, after its calls, listeners and owned resources
|
|
33
|
+
/// (AkanNativeDocument.own) were closed: for per-page state kept by document id.
|
|
34
|
+
func documentEnded(_ document: String)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
extension AkanNativePlugin {
|
|
38
|
+
func startListening(_ event: String) {}
|
|
39
|
+
func stopListening(_ event: String) {}
|
|
40
|
+
func documentEnded(_ document: String) {}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// One bridge call. Resolve or reject exactly once, from any thread: WebKit aborts the app if a
|
|
44
|
+
/// reply handler runs twice (verified), so later calls are ignored. A call dropped without an
|
|
45
|
+
/// answer is rejected with INTERNAL instead of leaving the page's Promise pending.
|
|
46
|
+
///
|
|
47
|
+
/// The page may give up on a call (its AbortSignal, bridge v1.1 `cancel`), and a call ends with its
|
|
48
|
+
/// page: the bridge then answers it (CANCELLED or TIMEOUT) and runs the `onCancel` handlers, where a
|
|
49
|
+
/// plugin stops the work (closes a dialog, invalidates an LAContext, stops location updates).
|
|
50
|
+
final class AkanNativeCall: @unchecked Sendable {
|
|
51
|
+
let method: String
|
|
52
|
+
let args: [String: Any]
|
|
53
|
+
/// What the app's capabilities allow this call (PL-11); nil = only the plugin's own rules.
|
|
54
|
+
/// Enforce it with `call.scope?.permits([...], pathFields:, urlFields:) ?? true`.
|
|
55
|
+
var scope: AkanNativeScope?
|
|
56
|
+
private let lock = NSLock()
|
|
57
|
+
private var finish: (@MainActor ([String: Any]) -> Void)?
|
|
58
|
+
private var cancelled = false
|
|
59
|
+
private var cancelHandlers: [@MainActor () -> Void] = []
|
|
60
|
+
/// The calling page's document (set by the bridge): `call.document?.own { … }` ties a resource
|
|
61
|
+
/// to the page, closed when it ends. nil for the bridge's own calls.
|
|
62
|
+
@MainActor weak var document: AkanNativeDocument?
|
|
63
|
+
|
|
64
|
+
/// True once the page gave up on the call or went away; answers after that are dropped.
|
|
65
|
+
var isCancelled: Bool {
|
|
66
|
+
lock.lock()
|
|
67
|
+
defer { lock.unlock() }
|
|
68
|
+
return cancelled
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// Runs `handler` on the main actor when the call is cancelled (right away if it already was).
|
|
72
|
+
/// Not after the call was answered.
|
|
73
|
+
@MainActor
|
|
74
|
+
func onCancel(_ handler: @escaping @MainActor () -> Void) {
|
|
75
|
+
lock.lock()
|
|
76
|
+
let now = cancelled
|
|
77
|
+
if !now, finish != nil { cancelHandlers.append(handler) }
|
|
78
|
+
lock.unlock()
|
|
79
|
+
if now { handler() }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// The bridge ends the call: the handlers run, then the page gets `code` (it has stopped waiting).
|
|
83
|
+
@MainActor
|
|
84
|
+
func cancel(_ code: AkanNativeErrorCode, _ message: String) {
|
|
85
|
+
lock.lock()
|
|
86
|
+
guard !cancelled, finish != nil else { return lock.unlock() }
|
|
87
|
+
cancelled = true
|
|
88
|
+
let handlers = cancelHandlers
|
|
89
|
+
cancelHandlers = []
|
|
90
|
+
lock.unlock()
|
|
91
|
+
for handler in handlers { handler() }
|
|
92
|
+
reject(code, message)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
init(method: String, args: [String: Any], finish: @escaping @MainActor ([String: Any]) -> Void) {
|
|
96
|
+
self.method = method
|
|
97
|
+
self.args = args
|
|
98
|
+
self.finish = finish
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/// Rejects with NOT_ALLOWED unless `value` is inside the call's scope; true when allowed.
|
|
102
|
+
/// `fold`: the path fields name files on a case-insensitive volume.
|
|
103
|
+
func inScope(_ value: [String: String], pathFields: Set<String> = [], urlFields: Set<String> = [], fold: Bool = false, what: String) -> Bool {
|
|
104
|
+
if scope?.permits(value, pathFields: pathFields, urlFields: urlFields, fold: fold) ?? true { return true }
|
|
105
|
+
reject(.notAllowed, "\(what) is outside the app's capabilities")
|
|
106
|
+
return false
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
deinit {
|
|
110
|
+
guard let finish else { return }
|
|
111
|
+
let body = UncheckedBox(["ok": false, "error": ["code": "INTERNAL", "message": "\(method) was dropped without an answer"]] as [String: Any])
|
|
112
|
+
DispatchQueue.main.async { MainActor.assumeIsolated { finish(body.value) } }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
func resolve(_ result: Any? = nil) {
|
|
116
|
+
var body: [String: Any] = ["ok": true]
|
|
117
|
+
if let result { body["result"] = result }
|
|
118
|
+
complete(body)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// `data`: details the page can act on (JSON values), e.g. ["reason": "packageManaged"].
|
|
122
|
+
/// `retryable`: the same call may work later.
|
|
123
|
+
func reject(_ code: AkanNativeErrorCode, _ message: String, data: Any? = nil, retryable: Bool = false) {
|
|
124
|
+
var error: [String: Any] = ["code": code.rawValue, "message": message]
|
|
125
|
+
if let data { error["data"] = data }
|
|
126
|
+
if retryable { error["retryable"] = true }
|
|
127
|
+
complete(["ok": false, "error": error])
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private func complete(_ body: [String: Any]) {
|
|
131
|
+
lock.lock()
|
|
132
|
+
let f = finish
|
|
133
|
+
finish = nil
|
|
134
|
+
cancelHandlers = []
|
|
135
|
+
lock.unlock()
|
|
136
|
+
guard let f else { return }
|
|
137
|
+
let box = UncheckedBox(body)
|
|
138
|
+
if Thread.isMainThread {
|
|
139
|
+
MainActor.assumeIsolated { f(box.value) }
|
|
140
|
+
} else {
|
|
141
|
+
DispatchQueue.main.async { MainActor.assumeIsolated { f(box.value) } }
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
func string(_ key: String) -> String? { args[key] as? String }
|
|
146
|
+
func bool(_ key: String) -> Bool? { (args[key] as? NSNumber)?.boolValue }
|
|
147
|
+
func int(_ key: String) -> Int? { (args[key] as? NSNumber)?.intValue }
|
|
148
|
+
func double(_ key: String) -> Double? { (args[key] as? NSNumber)?.doubleValue }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/// Presenting from the topmost view controller. UIKit refuses to present while a presentation or
|
|
152
|
+
/// dismissal is animating (an alert right after the previous one closed, a picker asked for as a
|
|
153
|
+
/// sheet goes away) and only logs it; a completion handler or a plugin call waiting for that
|
|
154
|
+
/// controller would then wait forever. So a request during a transition waits for it to end (up
|
|
155
|
+
/// to three times), and `otherwise` runs when there is no window or the presentation was refused.
|
|
156
|
+
@MainActor
|
|
157
|
+
enum AkanNativePresent {
|
|
158
|
+
static func present(_ controller: UIViewController, over root: UIViewController?, attempt: Int = 0,
|
|
159
|
+
completion: (@MainActor () -> Void)? = nil, otherwise: @escaping @MainActor () -> Void)
|
|
160
|
+
{
|
|
161
|
+
guard var top = root, top.viewIfLoaded?.window != nil else { return otherwise() }
|
|
162
|
+
while let next = top.presentedViewController { top = next }
|
|
163
|
+
if top.isBeingPresented || top.isBeingDismissed, attempt < 3, let coordinator = top.transitionCoordinator {
|
|
164
|
+
coordinator.animate(alongsideTransition: nil) { _ in
|
|
165
|
+
present(controller, over: root, attempt: attempt + 1, completion: completion, otherwise: otherwise)
|
|
166
|
+
}
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
if top.isBeingDismissed, let below = top.presentingViewController { top = below }
|
|
170
|
+
top.present(controller, animated: true, completion: completion)
|
|
171
|
+
DispatchQueue.main.async {
|
|
172
|
+
MainActor.assumeIsolated {
|
|
173
|
+
if controller.presentingViewController == nil { otherwise() } // refused ("Attempt to present …")
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/// What the shell offers to a plugin.
|
|
180
|
+
@MainActor
|
|
181
|
+
final class AkanNativePluginContext {
|
|
182
|
+
let pluginId: String
|
|
183
|
+
private weak var bridge: AkanNativeBridge?
|
|
184
|
+
|
|
185
|
+
/// The window: what App services (AkanNativeLinks, AkanNativeNotifications, AkanNativeRemoteNotifications) file
|
|
186
|
+
/// this plugin's listeners under, so they go when the window ends.
|
|
187
|
+
let owner: ObjectIdentifier
|
|
188
|
+
|
|
189
|
+
init(pluginId: String, bridge: AkanNativeBridge) {
|
|
190
|
+
self.pluginId = pluginId
|
|
191
|
+
self.bridge = bridge
|
|
192
|
+
owner = ObjectIdentifier(bridge)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
var viewController: UIViewController? { bridge?.viewController }
|
|
196
|
+
/// The view controller to present from (the topmost presented one). Prefer `present`.
|
|
197
|
+
var presenter: UIViewController? {
|
|
198
|
+
var top = bridge?.viewController
|
|
199
|
+
while let next = top?.presentedViewController { top = next }
|
|
200
|
+
return top
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/// Presents `controller` over the app (AkanNativePresent): waits out a running transition, and runs
|
|
204
|
+
/// `otherwise` instead when nothing can present or UIKit refused, so the call can be answered.
|
|
205
|
+
func present(_ controller: UIViewController, completion: (@MainActor () -> Void)? = nil, otherwise: @escaping @MainActor () -> Void) {
|
|
206
|
+
AkanNativePresent.present(controller, over: viewController, completion: completion, otherwise: otherwise)
|
|
207
|
+
}
|
|
208
|
+
var webView: WKWebView? { bridge?.webView }
|
|
209
|
+
var windowScene: UIWindowScene? { bridge?.webView?.window?.windowScene }
|
|
210
|
+
|
|
211
|
+
/// Pushes an event of this plugin to the page. Delivered only while the page listens.
|
|
212
|
+
func emit(_ event: String, _ data: Any? = nil) {
|
|
213
|
+
bridge?.emit(plugin: pluginId, event: event, data: data)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/// Serves a local file at /__akan_native/file/<id> for the rest of the session and returns a FileRef.
|
|
217
|
+
func registerFile(_ url: URL, mime: String) -> [String: Any] {
|
|
218
|
+
let size = (try? url.resourceValues(forKeys: [.fileSizeKey]).fileSize) ?? 0
|
|
219
|
+
return ["url": AkanNativeFiles.shared.register(url, mime: mime), "mime": mime, "size": size]
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/// The file behind a FileRef URL ("/__akan_native/file/<id>" or "app://localhost/__akan_native/file/<id>"),
|
|
223
|
+
/// e.g. to hand a photo taken earlier to another API. nil if it is not a file of this session.
|
|
224
|
+
func file(_ ref: String) -> (url: URL, mime: String)? {
|
|
225
|
+
var path = ref
|
|
226
|
+
if path.hasPrefix("app://localhost") { path.removeFirst("app://localhost".count) }
|
|
227
|
+
guard path.hasPrefix("/__akan_native/file/") else { return nil }
|
|
228
|
+
return AkanNativeFiles.shared.lookup(String(path.dropFirst("/__akan_native/file/".count)))
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/// Switches the page to another web bundle (UP-2, AkanNativeUpdates) and reloads it; nil: the app's own.
|
|
232
|
+
func serveBundle(_ root: URL?) {
|
|
233
|
+
(bridge?.viewController as? AkanNativeViewController)?.serveBundle(root)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/// Fades out the launch screen cover (SH-6); nothing happens once it is gone.
|
|
237
|
+
func hideSplash(fadeOutDuration: TimeInterval) {
|
|
238
|
+
(bridge?.viewController as? AkanNativeViewController)?.hideSplash(fadeOut: fadeOutDuration)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/// A fresh path in the session's temporary folder (emptied at every launch).
|
|
242
|
+
func temporaryFile(_ ext: String) -> URL {
|
|
243
|
+
AkanNativeFiles.shared.directory.appendingPathComponent("\(UUID().uuidString.lowercased()).\(ext)")
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
final class UncheckedBox<T>: @unchecked Sendable {
|
|
248
|
+
let value: T
|
|
249
|
+
init(_ value: T) { self.value = value }
|
|
250
|
+
}
|