@legendapp/spark 0.0.1-next.2
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.md +21 -0
- package/app.ts +1 -0
- package/audio.ts +1 -0
- package/auth-session.ts +1 -0
- package/bin/spark.cjs +5 -0
- package/clipboard.ts +1 -0
- package/config-plugin.cjs +1 -0
- package/config.cjs +1 -0
- package/config.d.cts +1 -0
- package/context-menu.ts +1 -0
- package/dialogs.ts +2 -0
- package/drag-drop.ts +1 -0
- package/expo-config.cjs +1 -0
- package/expo-metro.cjs +1 -0
- package/files.ts +1 -0
- package/global-shortcuts.ts +1 -0
- package/init-template.cjs +2 -0
- package/links.ts +1 -0
- package/menus.ts +1 -0
- package/message-dialog.ts +1 -0
- package/metro-gate.cjs +1 -0
- package/metro.cjs +1 -0
- package/native.cjs +1 -0
- package/notifications.ts +1 -0
- package/package.json +161 -0
- package/processes.ts +1 -0
- package/runtime-entry.cjs +1 -0
- package/schema.json +305 -0
- package/secure-storage.ts +1 -0
- package/settings.ts +1 -0
- package/shortcuts.ts +1 -0
- package/sqlite.ts +1 -0
- package/system.ts +1 -0
- package/tray.ts +1 -0
- package/ui-uniwind.ts +1 -0
- package/ui.ts +1 -0
- package/universal.cjs +1 -0
- package/updates.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-audio/RNSparkAudio.podspec +18 -0
- package/vendor/node_modules/@legendapp/spark-audio/macos/RNSparkAudio.h +4 -0
- package/vendor/node_modules/@legendapp/spark-audio/macos/RNSparkAudio.mm +154 -0
- package/vendor/node_modules/@legendapp/spark-audio/package.json +49 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/NativeSparkAudio.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/desktop.ts +39 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/index.android.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/index.ios.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/index.web.ts +42 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/media-session-unavailable.ts +5 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/media-session.ts +25 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/media-session.web.ts +35 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/media-types.ts +32 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/mobile.ts +38 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/status-listeners.ts +22 -0
- package/vendor/node_modules/@legendapp/spark-audio/src/types.ts +21 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.def +3 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.h +146 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/SparkAudio.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-audio/windows/SparkAudio.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/package.json +41 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/core.ts +68 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/index.android.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/index.ios.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/index.ts +22 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/index.web.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/mobile.ts +52 -0
- package/vendor/node_modules/@legendapp/spark-auth-session/src/types.ts +38 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/add-desktop.js +164 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/build-mode.js +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/build.js +278 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/commands.js +107 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/create.js +99 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/credentials.js +69 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/dev-command.js +81 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/dev.js +408 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/examples.js +43 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/executable.js +19 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/expo-dev-extension.cjs +51 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/expo-dev-patch.cjs +38 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/expo-dev-preload.cjs +19 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/expo-metro.cjs +41 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/expo-native.cjs +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/expo-node.js +21 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/go-profile.js +20 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/helpers.js +79 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/index.js +263 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/init-template.cjs +25 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/local.js +124 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/macos-release.js +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/metro-gate.cjs +33 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/metro.cjs +63 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/metro.js +25 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/npm-bin/npm +6 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/npm-bin/npm.cmd +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/pack-archive.js +23 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/package-manager.js +45 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/package.js +199 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/platform.js +34 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/process.js +57 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/project.js +324 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/release.js +42 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/release.json +37 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/runner-install.js +138 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/runtime-entry.cjs +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/sdk-install.js +66 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/sdk-transfer.js +113 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/session-status.js +22 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/signing.js +175 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/universal.cjs +28 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/updates.js +110 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/windows-associations.js +45 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/windows-associations.ps1 +57 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/windows-geometry.js +33 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/windows-metro.js +112 -0
- package/vendor/node_modules/@legendapp/spark-cli/dist/windows.js +141 -0
- package/vendor/node_modules/@legendapp/spark-cli/package.json +22 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/App.tsx +29 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/app.json +11 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/assets/icon.png +0 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/desktop.config.json +19 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/gitignore +8 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/index.ts +5 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/metro.config.js +3 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/package.json +55 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/blank-typescript/tsconfig.json +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/App.tsx +34 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/Git.macos.tsx +13 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/Git.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/diff-lite/compare.ts +12 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/App.tsx +34 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.macos.tsx +57 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.tsx +13 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.web.tsx +14 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/Integration.windows.tsx +57 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/document.ts +58 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.desktop.ts +24 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.macos.ts +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.ts +31 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.web.ts +21 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/io.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/sessions.ts +8 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/document-editor/useDocument.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.desktop.tsx +31 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.macos.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.tsx +14 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.web.tsx +20 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/Lifecycle.windows.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.desktop.tsx +28 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.macos.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.tsx +2 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/OpenFiles.windows.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/document.ts +58 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.desktop.ts +24 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.macos.ts +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.ts +31 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.web.ts +21 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/io.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/lifecycle-types.ts +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/lifetime.ts +23 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/records.ts +51 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/storage.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/example-shared/useModel.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.desktop.tsx +4 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.macos.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/Activation.windows.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/App.tsx +38 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.desktop.ts +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.macos.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.ts +18 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.web.ts +37 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/assets.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/model.ts +91 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/music-lite/store.ts +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.desktop.tsx +5 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.macos.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Activation.windows.tsx +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/App.tsx +92 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.desktop.ts +25 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.macos.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.ts +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Desktop.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/Theme.tsx +17 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/model.ts +61 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/search.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/session.ts +16 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/store.ts +4 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/notes-lite/window-session.ts +62 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/App.tsx +57 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/app.json +15 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/assets/icon.png +0 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/desktop.config.json +62 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/gitignore +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/global.css +31 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/index.ts +4 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/metro.config.js +7 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/package.json +70 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/react-native.config.js +2 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/tsconfig.json +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/universal/uniwind-types.d.ts +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/App.tsx +16 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/app.json +11 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/assets/icon.png +0 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/desktop.config.json +10 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/gitignore +8 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/index.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/metro.config.js +3 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/package.json +56 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/react-native.config.js +2 -0
- package/vendor/node_modules/@legendapp/spark-cli/templates/windows/tsconfig.json +10 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/RNDesktopClipboard.podspec +16 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/macos/RNDesktopClipboard.h +4 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/macos/RNDesktopClipboard.mm +87 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/package.json +52 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/NativeDesktopClipboard.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/desktop.ts +39 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/expo.ts +12 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/formats.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/index.android.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/index.ios.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/index.web.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.def +3 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.h +119 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/SparkClipboard.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-clipboard/windows/SparkClipboard.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/RNContextMenu.podspec +16 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/macos/RNContextMenu.h +9 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/macos/RNContextMenu.mm +160 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/src/NativeContextMenu.ts +8 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/src/index.ts +29 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.def +3 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.h +112 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/SparkContextMenu.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-context-menu/windows/SparkContextMenu.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/RNDesktopApp.podspec +15 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/macos/RNDesktopApp.h +4 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/macos/RNDesktopApp.mm +34 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/macos/SparkDesktop.h +23 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/macos/SparkDesktop.mm +135 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/macos/SparkWindow.mm +81 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/package.json +39 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/src/NativeDesktopApp.ts +8 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/src/api.ts +42 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-app/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/app.plugin.cjs +75 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/config.cjs +161 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/config.d.cts +13 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/entitlements.cjs +23 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/expo.cjs +26 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/fabric-lifecycle.cjs +125 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/helpers.cjs +20 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/identity.cjs +28 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/keyboard-events.cjs +44 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/package.json +19 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/schema.json +305 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/updates.cjs +24 -0
- package/vendor/node_modules/@legendapp/spark-desktop-config/windows.plugin.cjs +72 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/AppDelegate.mm +79 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/package.json +13 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/windows/SparkComponentGeometry.h +9 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/windows/application.inc +647 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/windows/notifications.inc +60 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/windows/runtime.inc +63 -0
- package/vendor/node_modules/@legendapp/spark-desktop-host/windows/runtimes.inc +162 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/RNDesktopLinks.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/common/AuthLoopback.h +121 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/macos/RNDesktopLinks.h +4 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/macos/RNDesktopLinks.mm +79 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/package.json +53 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/NativeDesktopLinks.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/api.ts +37 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/expo.ts +5 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.android.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.ios.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.web.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.def +3 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.h +128 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/SparkLinks.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-desktop-links/windows/SparkLinks.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/RNDesktopShortcuts.podspec +16 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/macos/RNDesktopShortcuts.h +4 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/macos/RNDesktopShortcuts.mm +56 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/package.json +43 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/NativeDesktopShortcuts.ts +8 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/accelerator.ts +22 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/api.ts +20 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-shortcuts/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/RNDesktopWindows.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/macos/RNDesktopWindows.h +4 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/macos/RNDesktopWindows.mm +210 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/package.json +44 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/src/NativeDesktopWindowManager.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/src/api.ts +79 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-desktop-windows/src/windows-options.ts +11 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/RNDesktopDrag.podspec +20 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/macos/RNDesktopDragView.h +4 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/macos/RNDesktopDragView.mm +94 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/package.json +44 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/src/DesktopDragViewNativeComponent.ts +16 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/src/contracts.ts +28 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/src/index.tsx +17 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/ReactPackageProvider.cpp +21 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.def +3 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.h +209 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/SparkDragDrop.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-drag-drop/windows/SparkDragDrop.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/RNFileDialog.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/ios/RNFileDialog.h +9 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/ios/RNFileDialog.mm +259 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/package.json +43 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/src/NativeFileDialog.ts +13 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/src/index.ts +89 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/src/index.windows.ts +15 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/src/options.ts +16 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.def +3 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.h +128 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/SparkFileDialog.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-file-dialog/windows/SparkFileDialog.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-file-system/RNDesktopFileSystem.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-file-system/macos/RNDesktopFileSystem.h +4 -0
- package/vendor/node_modules/@legendapp/spark-file-system/macos/RNDesktopFileSystem.mm +211 -0
- package/vendor/node_modules/@legendapp/spark-file-system/package.json +47 -0
- package/vendor/node_modules/@legendapp/spark-file-system/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-file-system/src/NativeDesktopFileSystem.ts +8 -0
- package/vendor/node_modules/@legendapp/spark-file-system/src/handles.ts +45 -0
- package/vendor/node_modules/@legendapp/spark-file-system/src/index.ts +61 -0
- package/vendor/node_modules/@legendapp/spark-file-system/src/path.ts +9 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.def +3 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.h +295 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.vcxproj +144 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/SparkFileSystem.vcxproj.filters +45 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/Trash.h +52 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-file-system/windows/SparkFileSystem.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/RNDesktopGlobalShortcuts.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/macos/RNDesktopGlobalShortcuts.h +3 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/macos/RNDesktopGlobalShortcuts.mm +65 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/src/NativeDesktopGlobalShortcuts.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/src/accelerator.ts +22 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/src/index.ts +16 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.def +3 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.h +80 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/SparkGlobalShortcuts.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-global-shortcuts/windows/SparkGlobalShortcuts.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/RNDesktopMessageDialog.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/macos/RNDesktopMessageDialog.h +3 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/macos/RNDesktopMessageDialog.mm +36 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/src/NativeDesktopMessageDialog.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/src/index.ts +13 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.def +3 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.h +145 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/SparkMessageDialog.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-message-dialog/windows/SparkMessageDialog.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/RNNativeMenu.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/ios/RNNativeMenu.h +10 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/ios/RNNativeMenu.mm +632 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/package.json +41 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/src/NativeMenu.ts +13 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/src/api.ts +128 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/src/index.windows.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-native-menu/src/windows-menus.ts +43 -0
- package/vendor/node_modules/@legendapp/spark-notifications/RNDesktopNotifications.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-notifications/macos/RNDesktopNotifications.h +4 -0
- package/vendor/node_modules/@legendapp/spark-notifications/macos/RNDesktopNotifications.mm +111 -0
- package/vendor/node_modules/@legendapp/spark-notifications/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-notifications/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-notifications/src/NativeDesktopNotifications.ts +4 -0
- package/vendor/node_modules/@legendapp/spark-notifications/src/index.ts +53 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.def +3 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.h +132 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/SparkNotifications.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-notifications/windows/SparkNotifications.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-processes/RNDesktopProcesses.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-processes/macos/RNDesktopProcesses.h +3 -0
- package/vendor/node_modules/@legendapp/spark-processes/macos/RNDesktopProcesses.mm +153 -0
- package/vendor/node_modules/@legendapp/spark-processes/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-processes/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-processes/src/NativeDesktopProcesses.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-processes/src/index.ts +39 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.def +3 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.h +171 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/SparkProcesses.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-processes/windows/SparkProcesses.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/RNDesktopSecureStorage.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/macos/RNDesktopSecureStorage.h +4 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/macos/RNDesktopSecureStorage.mm +53 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/package.json +52 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/NativeDesktopSecureStorage.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/desktop.ts +24 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/expo.ts +14 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.android.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.ios.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.web.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/index.windows.ts +2 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/options.ts +6 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/src/unavailable.ts +5 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.def +3 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.h +48 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/SparkSecureStorage.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-secure-storage/windows/SparkSecureStorage.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-settings/package.json +13 -0
- package/vendor/node_modules/@legendapp/spark-settings/src/filename.ts +1 -0
- package/vendor/node_modules/@legendapp/spark-settings/src/filename.windows.ts +9 -0
- package/vendor/node_modules/@legendapp/spark-settings/src/index.ts +19 -0
- package/vendor/node_modules/@legendapp/spark-settings/src/store.ts +37 -0
- package/vendor/node_modules/@legendapp/spark-sqlite/package.json +16 -0
- package/vendor/node_modules/@legendapp/spark-sqlite/src/index.ts +7 -0
- package/vendor/node_modules/@legendapp/spark-system/RNDesktopSystem.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-system/macos/RNDesktopSystem.h +3 -0
- package/vendor/node_modules/@legendapp/spark-system/macos/RNDesktopSystem.mm +108 -0
- package/vendor/node_modules/@legendapp/spark-system/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-system/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-system/src/NativeDesktopSystem.ts +3 -0
- package/vendor/node_modules/@legendapp/spark-system/src/index.ts +35 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.def +3 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.h +154 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/SparkSystem.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-system/windows/SparkSystem.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-tray/RNDesktopTray.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-tray/macos/RNDesktopTray.h +4 -0
- package/vendor/node_modules/@legendapp/spark-tray/macos/RNDesktopTray.mm +63 -0
- package/vendor/node_modules/@legendapp/spark-tray/package.json +46 -0
- package/vendor/node_modules/@legendapp/spark-tray/react-native.config.js +6 -0
- package/vendor/node_modules/@legendapp/spark-tray/src/NativeDesktopTray.ts +4 -0
- package/vendor/node_modules/@legendapp/spark-tray/src/index.ts +46 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/ReactPackageProvider.cpp +20 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.def +3 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.h +133 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.vcxproj +143 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/SparkTray.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-tray/windows/SparkTray.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-ui/RNSparkUI.podspec +17 -0
- package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkButton.h +4 -0
- package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkButton.mm +51 -0
- package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkSelect.h +4 -0
- package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkSelect.mm +53 -0
- package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkTextInput.h +4 -0
- package/vendor/node_modules/@legendapp/spark-ui/macos/RNSparkTextInput.mm +45 -0
- package/vendor/node_modules/@legendapp/spark-ui/package.json +61 -0
- package/vendor/node_modules/@legendapp/spark-ui/react-native.config.js +5 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/SparkButtonNativeComponent.ts +12 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/SparkSelectNativeComponent.ts +10 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/SparkTextInputNativeComponent.ts +9 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/index.android.tsx +25 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/index.ios.tsx +30 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/index.tsx +27 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/index.web.tsx +23 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/index.windows.tsx +42 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/select.ts +7 -0
- package/vendor/node_modules/@legendapp/spark-ui/src/types.ts +28 -0
- package/vendor/node_modules/@legendapp/spark-ui/uniwind.ts +8 -0
- package/vendor/node_modules/@legendapp/spark-ui/uniwind.web.ts +17 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/ExperimentalFeatures.props +33 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/LICENSE +25 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/ReactPackageProvider.cpp +21 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/ReactPackageProvider.h +24 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/ReactPackageProvider.idl +9 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkAppearance.h +61 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.cpp +2 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.def +3 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.h +181 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.rc +0 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.vcxproj +144 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/SparkUI.vcxproj.filters +44 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/pch.cpp +1 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/pch.h +30 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/resource.h +5 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI/targetver.h +8 -0
- package/vendor/node_modules/@legendapp/spark-ui/windows/SparkUI.sln +43 -0
- package/vendor/node_modules/@legendapp/spark-updates/RNDesktopUpdates.podspec +18 -0
- package/vendor/node_modules/@legendapp/spark-updates/Sparkle.podspec.json +39 -0
- package/vendor/node_modules/@legendapp/spark-updates/macos/RNDesktopUpdates.h +4 -0
- package/vendor/node_modules/@legendapp/spark-updates/macos/RNDesktopUpdates.mm +72 -0
- package/vendor/node_modules/@legendapp/spark-updates/package.json +44 -0
- package/vendor/node_modules/@legendapp/spark-updates/src/NativeDesktopUpdates.ts +4 -0
- package/vendor/node_modules/@legendapp/spark-updates/src/index.ts +23 -0
- package/vendor/node_modules/@legendapp/spark-webview/package.json +15 -0
- package/vendor/node_modules/@legendapp/spark-webview/src/index.ts +2 -0
- package/vendor/node_modules/@legendapp/spark-window-options/index.cjs +25 -0
- package/vendor/node_modules/@legendapp/spark-window-options/index.d.ts +12 -0
- package/vendor/node_modules/@legendapp/spark-window-options/package.json +12 -0
- package/webview.ts +1 -0
- package/windows.ts +1 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Inbox Win32 toast activation avoids a separate Windows App SDK singleton package.
|
|
2
|
+
#include <notificationactivationcallback.h>
|
|
3
|
+
#include <atomic>
|
|
4
|
+
#include <mutex>
|
|
5
|
+
#include <deque>
|
|
6
|
+
namespace SparkWin {
|
|
7
|
+
static std::mutex notificationMutex;
|
|
8
|
+
static std::deque<std::string> notificationResponses;
|
|
9
|
+
static std::deque<std::string> notificationEvents;
|
|
10
|
+
static std::atomic<HWND> notificationWindow{nullptr};
|
|
11
|
+
static void SetNotificationWindow(HWND hwnd) { notificationWindow = hwnd; if (hwnd) PostMessageW(hwnd, WM_APP + 19, 0, 0); }
|
|
12
|
+
static std::wstring ToastClassId() {
|
|
13
|
+
auto key = ProjectKey(); return L"{" + key.substr(0, 8) + L"-" + key.substr(8, 4) + L"-" + key.substr(12, 4) + L"-" + key.substr(16, 4) + L"-" + key.substr(20, 12) + L"}";
|
|
14
|
+
}
|
|
15
|
+
static void QueueNotificationResponse(std::string const &encoded) {
|
|
16
|
+
auto args = Json::JsonObject::Parse(to_hstring(encoded));
|
|
17
|
+
if (args.GetNamedString(L"project") != SparkWindowsEnv(L"SPARK_PROJECT_ID")) return;
|
|
18
|
+
auto data = args.GetNamedObject(L"data", Json::JsonObject());
|
|
19
|
+
for (auto const &entry : data) if (entry.Value().ValueType() != Json::JsonValueType::String) return;
|
|
20
|
+
GUID identity{}; winrt::check_hresult(CoCreateGuid(&identity));
|
|
21
|
+
Json::JsonObject response;
|
|
22
|
+
response.SetNamedValue(L"type", Json::JsonValue::CreateStringValue(L"notificationResponse"));
|
|
23
|
+
response.SetNamedValue(L"id", Json::JsonValue::CreateStringValue(winrt::to_hstring(winrt::guid(identity))));
|
|
24
|
+
response.SetNamedValue(L"notificationId", Json::JsonValue::CreateStringValue(args.GetNamedString(L"notificationId")));
|
|
25
|
+
response.SetNamedValue(L"action", Json::JsonValue::CreateStringValue(args.GetNamedString(L"action", L"open") == L"dismiss" ? L"dismiss" : L"open"));
|
|
26
|
+
response.SetNamedValue(L"data", data); auto json = to_string(response.Stringify());
|
|
27
|
+
{ std::lock_guard lock(notificationMutex); notificationResponses.push_back(json); notificationEvents.push_back(json); if (notificationResponses.size() > 100) notificationResponses.pop_front(); if (notificationEvents.size() > 100) notificationEvents.pop_front(); }
|
|
28
|
+
if (auto hwnd = notificationWindow.load()) PostMessageW(hwnd, WM_APP + 19, 0, 0);
|
|
29
|
+
}
|
|
30
|
+
static std::string NotificationResponses() {
|
|
31
|
+
std::lock_guard lock(notificationMutex); Json::JsonArray responses;
|
|
32
|
+
for (auto const &value : notificationResponses) responses.Append(Json::JsonObject::Parse(to_hstring(value))); return to_string(responses.Stringify());
|
|
33
|
+
}
|
|
34
|
+
static void EmitNotificationEvents() {
|
|
35
|
+
if (!context) return;
|
|
36
|
+
std::deque<std::string> events; { std::lock_guard lock(notificationMutex); events.swap(notificationEvents); }
|
|
37
|
+
for (auto const &encoded : events) {
|
|
38
|
+
auto event = Json::JsonObject::Parse(to_hstring(encoded));
|
|
39
|
+
if (event.GetNamedString(L"action") == L"open") { auto hwnd = notificationWindow.load(); if (hwnd) { ShowWindow(hwnd, IsIconic(hwnd) ? SW_RESTORE : SW_SHOW); SetForegroundWindow(hwnd); } }
|
|
40
|
+
auto value = Value(event); context.EmitJSEvent(L"RCTDeviceEventEmitter", L"desktop", std::move(value));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
struct ToastCallback : winrt::implements<ToastCallback, INotificationActivationCallback> {
|
|
44
|
+
HRESULT __stdcall Activate(LPCWSTR appId, LPCWSTR arguments, const NOTIFICATION_USER_INPUT_DATA *, ULONG) noexcept override {
|
|
45
|
+
try { if (appId && arguments && std::wstring(appId) == L"Spark." + ProjectKey()) QueueNotificationResponse(to_string(arguments)); return S_OK; } catch (...) { return winrt::to_hresult(); }
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
struct ToastFactory : winrt::implements<ToastFactory, IClassFactory> {
|
|
49
|
+
HRESULT __stdcall CreateInstance(IUnknown *outer, REFIID iid, void **object) noexcept override {
|
|
50
|
+
if (!object) return E_POINTER; *object = nullptr; if (outer) return CLASS_E_NOAGGREGATION;
|
|
51
|
+
try { auto callback = winrt::make_self<ToastCallback>(); return callback->QueryInterface(iid, object); } catch (...) { return winrt::to_hresult(); }
|
|
52
|
+
}
|
|
53
|
+
HRESULT __stdcall LockServer(BOOL) noexcept override { return S_OK; }
|
|
54
|
+
};
|
|
55
|
+
static DWORD toastRegistration = 0;
|
|
56
|
+
static void InitializeToastActivation() {
|
|
57
|
+
auto factory = winrt::make_self<ToastFactory>();
|
|
58
|
+
winrt::check_hresult(CoRegisterClassObject(winrt::guid(ToastClassId()), factory.get(), CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &toastRegistration));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Spark development runtime, compiled into the Expo Desktop Win32 host.
|
|
2
|
+
#include <string>
|
|
3
|
+
#include <shellapi.h>
|
|
4
|
+
#include <winrt/Windows.Foundation.h>
|
|
5
|
+
#include <cstdlib>
|
|
6
|
+
#include <cstdint>
|
|
7
|
+
#include <cwchar>
|
|
8
|
+
#include <fstream>
|
|
9
|
+
#include <filesystem>
|
|
10
|
+
#include <winrt/Windows.Data.Json.h>
|
|
11
|
+
|
|
12
|
+
static std::wstring SparkWindowsEnv(const wchar_t *name) {
|
|
13
|
+
const DWORD size = GetEnvironmentVariableW(name, nullptr, 0);
|
|
14
|
+
if (!size) return {};
|
|
15
|
+
std::wstring value(size, L'\0');
|
|
16
|
+
const DWORD written = GetEnvironmentVariableW(name, value.data(), size);
|
|
17
|
+
if (!written || written >= size) return {};
|
|
18
|
+
value.resize(written);
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
static void SparkInitializeEnvironment() {
|
|
22
|
+
const auto defaults = winrt::Windows::Data::Json::JsonObject::Parse(LR"spark(__SPARK_PROJECT_CONFIG__)spark");
|
|
23
|
+
for (auto const &item : defaults) if (SparkWindowsEnv(item.Key().c_str()).empty()) SetEnvironmentVariableW(item.Key().c_str(), item.Value().GetString().c_str());
|
|
24
|
+
// Shell task activations carry their project context even in the shared prebuilt executable.
|
|
25
|
+
int count = 0; auto argv = CommandLineToArgvW(GetCommandLineW(), &count);
|
|
26
|
+
if (argv) {
|
|
27
|
+
try {
|
|
28
|
+
for (int i = 1; i < count; ++i) {
|
|
29
|
+
std::wstring argument(argv[i]); const std::wstring prefix = L"--spark-context=";
|
|
30
|
+
if (argument.rfind(prefix, 0) != 0) continue;
|
|
31
|
+
auto context = winrt::Windows::Data::Json::JsonObject::Parse(winrt::Windows::Foundation::Uri::UnescapeComponent(argument.substr(prefix.size())));
|
|
32
|
+
for (auto key : {L"SPARK_PROJECT_ID", L"SPARK_PROJECT_NAME", L"SPARK_PROJECT_VERSION", L"SPARK_WINDOW_CONFIG", L"SPARK_SESSION_FILE"})
|
|
33
|
+
if (context.HasKey(key)) SetEnvironmentVariableW(key, context.GetNamedString(key).c_str());
|
|
34
|
+
}
|
|
35
|
+
} catch (...) { LocalFree(argv); throw; }
|
|
36
|
+
LocalFree(argv);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
static uint16_t SparkMetroPort() {
|
|
40
|
+
auto value = SparkWindowsEnv(L"SPARK_METRO_PORT");
|
|
41
|
+
if (value.empty()) {
|
|
42
|
+
std::ifstream file(std::filesystem::path(SparkWindowsEnv(L"SPARK_SESSION_FILE")), std::ios::binary);
|
|
43
|
+
if (file) try {
|
|
44
|
+
auto state = winrt::Windows::Data::Json::JsonObject::Parse(winrt::to_hstring(std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>())));
|
|
45
|
+
value = std::to_wstring(static_cast<int>(state.GetNamedNumber(L"port", 8081)));
|
|
46
|
+
} catch (...) {}
|
|
47
|
+
}
|
|
48
|
+
wchar_t *end = nullptr;
|
|
49
|
+
const auto port = wcstoul(value.c_str(), &end, 10);
|
|
50
|
+
return !value.empty() && end && *end == 0 && port > 0 && port <= 65535
|
|
51
|
+
? static_cast<uint16_t>(port) : 8081;
|
|
52
|
+
}
|
|
53
|
+
REACT_MODULE(NativeSparkRuntime)
|
|
54
|
+
struct NativeSparkRuntime {
|
|
55
|
+
REACT_SYNC_METHOD(describe)
|
|
56
|
+
std::string describe() noexcept {
|
|
57
|
+
return R"spark(__SPARK_METADATA__)spark";
|
|
58
|
+
}
|
|
59
|
+
REACT_SYNC_METHOD(server)
|
|
60
|
+
std::string server() noexcept { return "http://127.0.0.1:" + std::to_string(SparkMetroPort()); }
|
|
61
|
+
REACT_SYNC_METHOD(session)
|
|
62
|
+
std::string session() noexcept { return winrt::to_string(SparkWindowsEnv(L"SPARK_SESSION_TOKEN")); }
|
|
63
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Margelo Runtimes backend. Every worker is a real RNW host with its own Hermes heap.
|
|
2
|
+
#include <JSI/JsiApiContext.h>
|
|
3
|
+
#include <functional>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <vector>
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <winrt/Microsoft.ReactNative.Composition.h>
|
|
8
|
+
namespace SparkWin {
|
|
9
|
+
namespace Composition = winrt::Microsoft::ReactNative::Composition;
|
|
10
|
+
static React::ReactPropertyId<bool> secondaryProperty{L"Spark", L"SecondaryRuntime"};
|
|
11
|
+
struct Worker {
|
|
12
|
+
std::string name, kind;
|
|
13
|
+
React::ReactNativeHost host{nullptr}; React::ReactContext context;
|
|
14
|
+
bool ready = false, stopped = false;
|
|
15
|
+
std::vector<std::function<void(std::string const &)>> pending;
|
|
16
|
+
std::vector<std::function<void()>> detach;
|
|
17
|
+
};
|
|
18
|
+
static std::map<std::string, std::shared_ptr<Worker>> workers;
|
|
19
|
+
struct RuntimeCall { std::string runtime; React::ReactPromise<std::string> promise; };
|
|
20
|
+
static std::map<std::string, RuntimeCall> runtimeCalls;
|
|
21
|
+
static uint64_t runtimeCallSequence = 0;
|
|
22
|
+
static std::shared_ptr<bool> runtimeOwner;
|
|
23
|
+
static bool IsSecondary(React::ReactContext const &value) { return value.Properties().Get(secondaryProperty).value_or(false); }
|
|
24
|
+
static void StopWorker(std::string const &name, std::string const &reason) {
|
|
25
|
+
auto found = workers.find(name); if (found == workers.end()) return; auto worker = found->second; workers.erase(found); worker->stopped = true;
|
|
26
|
+
auto pending = std::move(worker->pending); for (auto &callback : pending) callback(reason);
|
|
27
|
+
for (auto &detach : worker->detach) detach(); worker->detach.clear();
|
|
28
|
+
for (auto it = runtimeCalls.begin(); it != runtimeCalls.end();) { if (it->second.runtime == name) { it->second.promise.Reject(React::ReactError{"E_RUNTIME_DESTROYED", reason}); it = runtimeCalls.erase(it); } else ++it; }
|
|
29
|
+
auto unload = worker->host.UnloadInstance(); unload.Completed([worker](auto const &, auto const &) {});
|
|
30
|
+
}
|
|
31
|
+
static void StopWorkers() { while (!workers.empty()) StopWorker(workers.begin()->first, "Runtime was destroyed"); }
|
|
32
|
+
static winrt::fire_and_forget LoadWorker(std::shared_ptr<Worker> worker) {
|
|
33
|
+
try { co_await worker->host.LoadInstance(); }
|
|
34
|
+
catch (...) { auto error = winrt::to_string(winrt::to_message()); React::ReactDispatcher(host.InstanceSettings().UIDispatcher()).Post([worker, error]() { if (!worker->stopped) StopWorker(worker->name, error); }); }
|
|
35
|
+
}
|
|
36
|
+
static winrt::fire_and_forget WorkerDeadline(std::weak_ptr<Worker> weak, React::ReactDispatcher dispatcher) {
|
|
37
|
+
co_await winrt::resume_after(std::chrono::seconds(120));
|
|
38
|
+
dispatcher.Post([weak]() { if (auto worker = weak.lock(); worker && !worker->stopped && !worker->ready) StopWorker(worker->name, "Worker bundle did not become ready within 120 seconds"); });
|
|
39
|
+
}
|
|
40
|
+
static std::shared_ptr<Worker> GetWorker(std::string const &name, std::string kind = "threaded-runtime") {
|
|
41
|
+
if (name.empty() || name == "main" || name.size() > 100) throw winrt::hresult_invalid_argument(L"Expected a secondary runtime name of 1–100 characters");
|
|
42
|
+
if (auto found = workers.find(name); found != workers.end()) { if (kind != found->second->kind && kind != "threaded-runtime") throw winrt::hresult_invalid_argument(L"Runtime kind cannot change while running"); return found->second; }
|
|
43
|
+
auto worker = std::make_shared<Worker>(); worker->name = name; worker->kind = kind; worker->host = React::ReactNativeHost();
|
|
44
|
+
auto settings = worker->host.InstanceSettings(), main = host.InstanceSettings();
|
|
45
|
+
settings.UIDispatcher(main.UIDispatcher()); settings.JSIEngineOverride(React::JSIEngine::Hermes);
|
|
46
|
+
settings.SourceBundleHost(main.SourceBundleHost()); settings.SourceBundlePort(main.SourceBundlePort());
|
|
47
|
+
settings.UseDeveloperSupport(main.UseDeveloperSupport()); settings.UseFastRefresh(true); settings.UseDirectDebugger(false);
|
|
48
|
+
settings.DebugBundlePath(L".threaded-runtime/entry"); settings.JavaScriptBundleFile(L"index.windows");
|
|
49
|
+
React::ReactPropertyBag(settings.Properties()).Set(secondaryProperty, true);
|
|
50
|
+
for (auto const &provider : main.PackageProviders()) settings.PackageProviders().Append(provider);
|
|
51
|
+
auto weak = std::weak_ptr(worker); auto dispatcher = React::ReactDispatcher(main.UIDispatcher());
|
|
52
|
+
settings.InstanceCreated([weak](auto const &, React::InstanceCreatedEventArgs const &args) {
|
|
53
|
+
if (auto worker = weak.lock()) {
|
|
54
|
+
React::ReactContext context(args.Context()); auto handle = context.Handle().JSRuntime();
|
|
55
|
+
if (!handle) throw winrt::hresult_error(E_FAIL, L"Worker has no Hermes JSI runtime");
|
|
56
|
+
auto &runtime = React::GetOrCreateContextRuntime(context, handle); facebook::jsi::Object env(runtime);
|
|
57
|
+
env.setProperty(runtime, "runtimeName", facebook::jsi::String::createFromUtf8(runtime, worker->name)); env.setProperty(runtime, "kind", facebook::jsi::String::createFromUtf8(runtime, worker->kind)); runtime.global().setProperty(runtime, "__THREADED_RUNTIME_ENV__", std::move(env));
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
settings.InstanceLoaded([weak, dispatcher](auto const &, React::InstanceLoadedEventArgs const &args) {
|
|
61
|
+
auto context = React::ReactContext(args.Context()); auto failed = args.Failed();
|
|
62
|
+
dispatcher.Post([weak, context, failed]() {
|
|
63
|
+
auto worker = weak.lock(); if (!worker || worker->stopped) return;
|
|
64
|
+
if (failed) { StopWorker(worker->name, "Worker bundle failed to load; inspect Metro and native logs"); return; }
|
|
65
|
+
worker->context = context; worker->ready = true; auto pending = std::move(worker->pending); for (auto &callback : pending) callback("");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
workers.emplace(name, worker); LoadWorker(worker); WorkerDeadline(weak, dispatcher); return worker;
|
|
69
|
+
}
|
|
70
|
+
static void WhenReady(std::shared_ptr<Worker> const &worker, std::function<void(std::string const &)> callback) {
|
|
71
|
+
if (worker->ready) callback(""); else { if (worker->pending.size() >= 1000) throw winrt::hresult_error(E_FAIL, L"Too many pending runtime operations"); worker->pending.push_back(std::move(callback)); }
|
|
72
|
+
}
|
|
73
|
+
static winrt::fire_and_forget CallDeadline(std::string id, React::ReactDispatcher dispatcher) {
|
|
74
|
+
co_await winrt::resume_after(std::chrono::seconds(120)); dispatcher.Post([id]() { auto found = runtimeCalls.find(id); if (found != runtimeCalls.end()) { found->second.promise.Reject(React::ReactError{"E_RUNTIME_TIMEOUT", "Runtime call exceeded 120 seconds"}); runtimeCalls.erase(found); } });
|
|
75
|
+
}
|
|
76
|
+
struct RuntimeProps : winrt::implements<RuntimeProps, React::IComponentProps> {
|
|
77
|
+
std::string name = "background-list", app = "ThreadedRuntimeHost", component, key, props = "{}"; React::ViewProps view{nullptr};
|
|
78
|
+
void SetProp(uint32_t, winrt::hstring const &key, React::IJSValueReader const &reader) noexcept { if (key == L"runtimeName") React::ReadValue(reader, name); else if (key == L"appName") React::ReadValue(reader, app); else if (key == L"initialPropsJson") React::ReadValue(reader, props); else if (key == L"componentName") React::ReadValue(reader, component); else if (key == L"surfaceKey") React::ReadValue(reader, this->key); }
|
|
79
|
+
};
|
|
80
|
+
struct RuntimeSurface : winrt::implements<RuntimeSurface, winrt::Windows::Foundation::IInspectable> {
|
|
81
|
+
winrt::weak_ref<Composition::ContentIslandComponentView> view; React::ReactNativeIsland island{nullptr};
|
|
82
|
+
React::EventEmitter emitter{nullptr}; std::string failure;
|
|
83
|
+
void Fail(std::string const &message) { failure = message; if (emitter) emitter.DispatchEvent(L"runtimeError", [message](React::IJSValueWriter const &writer) { writer.WriteObjectBegin(); writer.WritePropertyName(L"message"); writer.WriteString(winrt::to_hstring(message)); writer.WriteObjectEnd(); }); }
|
|
84
|
+
std::string name, app, component, key, props; uint64_t generation = 0; bool mounted = false;
|
|
85
|
+
void Close() noexcept { ++generation; auto previous = island; island = nullptr; if (previous) { try { previous.ReactViewHost(nullptr); previous.Island().Close(); } catch (...) { /* The containing island may already be closing. */ } } }
|
|
86
|
+
Json::JsonObject InitialProps() {
|
|
87
|
+
Json::JsonObject::Parse(winrt::to_hstring(props)); // Validate before entering an RNW writer callback.
|
|
88
|
+
Json::JsonObject value;
|
|
89
|
+
value.SetNamedValue(L"componentName", Json::JsonValue::CreateStringValue(winrt::to_hstring(component)));
|
|
90
|
+
value.SetNamedValue(L"initialPropsJson", Json::JsonValue::CreateStringValue(winrt::to_hstring(props)));
|
|
91
|
+
value.SetNamedValue(L"runtimeName", Json::JsonValue::CreateStringValue(winrt::to_hstring(name)));
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
void Render() { try {
|
|
95
|
+
if (!mounted || name.empty() || app.empty()) return; Close();
|
|
96
|
+
auto worker = GetWorker(name); auto weak = get_weak(); const auto expected = generation;
|
|
97
|
+
WhenReady(worker, [weak, expected, worker](std::string const &error) {
|
|
98
|
+
auto self = weak.get(); if (!self || !self->mounted || self->generation != expected) return;
|
|
99
|
+
if (!error.empty()) { self->Fail(error); return; }
|
|
100
|
+
try {
|
|
101
|
+
auto view = self->view.get(); if (!view) return;
|
|
102
|
+
self->island = React::ReactNativeIsland(compositor); React::ReactViewOptions options; options.ComponentName(winrt::to_hstring(self->app));
|
|
103
|
+
auto props = self->InitialProps(); options.InitialProps([props](React::IJSValueWriter const &writer) { WriteJson(writer, props); });
|
|
104
|
+
self->island.ReactViewHost(React::ReactCoreInjection::MakeViewHost(worker->host, options)); view.Connect(self->island.Island());
|
|
105
|
+
worker->detach.push_back([weak, expected]() { if (auto self = weak.get(); self && self->generation == expected) self->Close(); });
|
|
106
|
+
} catch (...) { self->Fail(winrt::to_string(winrt::to_message())); }
|
|
107
|
+
});
|
|
108
|
+
} catch (...) { Fail(winrt::to_string(winrt::to_message())); } }
|
|
109
|
+
};
|
|
110
|
+
static void RegisterRuntimeSurface(React::IReactPackageBuilder const &package) {
|
|
111
|
+
package.as<React::IReactPackageBuilderFabric>().AddViewComponent(L"ThreadedRuntimeSurface", [](React::IReactViewComponentBuilder const &builder) {
|
|
112
|
+
builder.SetCreateProps([](React::ViewProps const &view, React::IComponentProps const &previous) { auto props = winrt::make_self<RuntimeProps>(); if (previous) { auto old = winrt::get_self<RuntimeProps>(previous); props->name = old->name; props->app = old->app; props->component = old->component; props->key = old->key; props->props = old->props; } props->view = view; return props.as<React::IComponentProps>(); });
|
|
113
|
+
builder.as<Composition::IReactCompositionViewComponentBuilder>().SetContentIslandComponentViewInitializer([](Composition::ContentIslandComponentView const &view) {
|
|
114
|
+
auto state = winrt::make_self<RuntimeSurface>(); state->view = view; view.UserData(state.as<winrt::Windows::Foundation::IInspectable>()); auto weak = state->get_weak();
|
|
115
|
+
view.Mounted([weak](auto const &, auto const &) { if (auto self = weak.get()) { self->mounted = true; self->Render(); } });
|
|
116
|
+
view.Unmounted([weak](auto const &, auto const &) { if (auto self = weak.get()) { self->mounted = false; self->Close(); } });
|
|
117
|
+
view.Destroying([weak](auto const &, auto const &) { if (auto self = weak.get()) { self->mounted = false; self->Close(); } });
|
|
118
|
+
});
|
|
119
|
+
builder.SetUpdateEventEmitterHandler([](React::ComponentView const &view, React::EventEmitter const &emitter) { auto state = winrt::get_self<RuntimeSurface>(view.UserData()); state->emitter = emitter; if (!state->failure.empty()) state->Fail(state->failure); });
|
|
120
|
+
builder.SetUpdatePropsHandler([](React::ComponentView const &view, React::IComponentProps const &props, React::IComponentProps const &) {
|
|
121
|
+
auto self = winrt::get_self<RuntimeSurface>(view.UserData()); auto value = winrt::get_self<RuntimeProps>(props);
|
|
122
|
+
bool recreate = self->name != value->name || self->app != value->app || self->key != value->key; self->name = value->name; self->app = value->app; self->component = value->component; self->key = value->key; self->props = value->props;
|
|
123
|
+
if (recreate || !self->island) self->Render(); else { try { auto props = self->InitialProps(); self->island.SetProperties([props](React::IJSValueWriter const &writer) { WriteJson(writer, props); }); } catch (...) { self->Fail(winrt::to_string(winrt::to_message())); } }
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
REACT_MODULE(SparkThreadedRuntime, L"ThreadedRuntime")
|
|
129
|
+
struct SparkThreadedRuntime {
|
|
130
|
+
using Promise = winrt::Microsoft::ReactNative::ReactPromise<void>;
|
|
131
|
+
winrt::Microsoft::ReactNative::ReactContext context; std::shared_ptr<bool> owner;
|
|
132
|
+
REACT_INIT(Initialize) void Initialize(winrt::Microsoft::ReactNative::ReactContext const &value) noexcept { context = value; if (!SparkWin::IsSecondary(context)) { owner = std::make_shared<bool>(true); context.UIDispatcher().Post([token = owner]() { SparkWin::StopWorkers(); SparkWin::runtimeOwner = token; }); } }
|
|
133
|
+
~SparkThreadedRuntime() { if (owner) context.UIDispatcher().Post([token = owner]() { if (SparkWin::runtimeOwner == token) { SparkWin::StopWorkers(); SparkWin::runtimeOwner.reset(); } }); }
|
|
134
|
+
template<typename F> void UI(F action, Promise promise) { context.UIDispatcher().Post([action, promise]() { try { action(); promise.Resolve(); } catch (winrt::hresult_error const &error) { promise.Reject(winrt::Microsoft::ReactNative::ReactError{"E_RUNTIME", winrt::to_string(error.message())}); } catch (std::exception const &error) { promise.Reject(error.what()); } }); }
|
|
135
|
+
REACT_METHOD(prewarmRuntime) void prewarmRuntime(std::string name, Promise promise) noexcept { prewarmRuntimeWithOptions(name, "threaded-runtime", false, promise); }
|
|
136
|
+
REACT_METHOD(prewarmRuntimeWithOptions) void prewarmRuntimeWithOptions(std::string name, std::string kind, bool useMainNativeModules, Promise promise) noexcept {
|
|
137
|
+
if (useMainNativeModules) { promise.Reject(winrt::Microsoft::ReactNative::ReactError{"E_RUNTIME_OPTIONS", "Windows workers own independent native module instances; useMainNativeModules is not supported"}); return; }
|
|
138
|
+
context.UIDispatcher().Post([name, kind, promise]() { try { auto worker = SparkWin::GetWorker(name, kind); SparkWin::WhenReady(worker, [promise](std::string const &error) { if (error.empty()) promise.Resolve(); else promise.Reject(error.c_str()); }); } catch (winrt::hresult_error const &error) { promise.Reject(winrt::to_string(error.message()).c_str()); } });
|
|
139
|
+
}
|
|
140
|
+
REACT_METHOD(notifyRuntimeReady) void notifyRuntimeReady(std::string, Promise promise) noexcept { promise.Resolve(); /* InstanceLoaded gates calls after the complete worker bundle. */ }
|
|
141
|
+
REACT_METHOD(dispatchHeadlessTask) void dispatchHeadlessTask(std::string name, std::string task, std::string payload, Promise promise) noexcept {
|
|
142
|
+
context.UIDispatcher().Post([name, task, payload, promise]() { try { auto worker = SparkWin::GetWorker(name); SparkWin::WhenReady(worker, [worker, task, payload, promise](std::string const &error) { if (!error.empty()) { promise.Reject(error.c_str()); return; } worker->context.CallJSFunction(L"ThreadedRuntimeHeadlessTaskRunner", L"run", task, payload, worker->name); promise.Resolve(); }); } catch (winrt::hresult_error const &error) { promise.Reject(winrt::to_string(error.message()).c_str()); } });
|
|
143
|
+
}
|
|
144
|
+
REACT_METHOD(callRuntimeFunction) void callRuntimeFunction(std::string name, std::string function, std::string args, winrt::Microsoft::ReactNative::ReactPromise<std::string> promise) noexcept {
|
|
145
|
+
auto dispatcher = context.UIDispatcher(); dispatcher.Post([name, function, args, promise, dispatcher]() {
|
|
146
|
+
using namespace SparkWin;
|
|
147
|
+
try {
|
|
148
|
+
if (runtimeCalls.size() >= 1000) throw winrt::hresult_error(E_FAIL, L"Too many runtime calls");
|
|
149
|
+
auto worker = GetWorker(name); auto id = std::to_string(++runtimeCallSequence);
|
|
150
|
+
if (!worker->ready && worker->pending.size() >= 1000) throw winrt::hresult_error(E_FAIL, L"Too many pending runtime operations");
|
|
151
|
+
runtimeCalls.emplace(id, RuntimeCall{name, promise}); CallDeadline(id, dispatcher);
|
|
152
|
+
WhenReady(worker, [worker, id, function, args](std::string const &error) { auto found = runtimeCalls.find(id); if (found == runtimeCalls.end()) return; if (!error.empty()) { found->second.promise.Reject(error.c_str()); runtimeCalls.erase(found); return; } worker->context.CallJSFunction(L"ThreadedRuntimeFunctionRunner", L"run", function, args, id, worker->name); });
|
|
153
|
+
} catch (winrt::hresult_error const &error) { promise.Reject(winrt::to_string(error.message()).c_str()); }
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
REACT_METHOD(completeRuntimeFunctionCall) void completeRuntimeFunctionCall(std::string id, std::optional<std::string> result, std::optional<std::string> error, Promise promise) noexcept {
|
|
157
|
+
UI([id, result, error]() { auto found = SparkWin::runtimeCalls.find(id); if (found == SparkWin::runtimeCalls.end()) return; if (error) found->second.promise.Reject(error->c_str()); else found->second.promise.Resolve(result.value_or("null")); SparkWin::runtimeCalls.erase(found); }, promise);
|
|
158
|
+
}
|
|
159
|
+
REACT_METHOD(destroyRuntime) void destroyRuntime(std::string name, Promise promise) noexcept { UI([name]() { SparkWin::StopWorker(name, "Runtime was destroyed"); }, promise); }
|
|
160
|
+
REACT_METHOD(destroyAllRuntimes) void destroyAllRuntimes(Promise promise) noexcept { UI([]() { SparkWin::StopWorkers(); }, promise); }
|
|
161
|
+
REACT_METHOD(getRuntimeNames) void getRuntimeNames(winrt::Microsoft::ReactNative::ReactPromise<std::vector<std::string>> promise) noexcept { context.UIDispatcher().Post([promise]() { std::vector<std::string> names; for (auto const &[name, worker] : SparkWin::workers) names.push_back(name); promise.Resolve(names); }); }
|
|
162
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
3
|
+
Pod::Spec.new do |s|
|
|
4
|
+
s.name = "RNDesktopLinks"
|
|
5
|
+
s.version = package["version"]
|
|
6
|
+
s.summary = "Desktop desktop-links"
|
|
7
|
+
s.license = { :type => "MIT" }
|
|
8
|
+
s.author = "Legend"
|
|
9
|
+
s.homepage = "https://legendapp.com"
|
|
10
|
+
s.source = { :path => "." }
|
|
11
|
+
s.platforms = { :osx => "14.0" }
|
|
12
|
+
s.source_files = "macos/**/*.{h,m,mm}", "common/**/*.h"
|
|
13
|
+
s.frameworks = "Security"
|
|
14
|
+
s.dependency "React-Core"
|
|
15
|
+
s.dependency "ReactCodegen"
|
|
16
|
+
s.dependency "RNDesktopApp"
|
|
17
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
// Minimal, bounded loopback HTTP receiver. No Node runtime and no general server API.
|
|
3
|
+
#ifdef _WIN32
|
|
4
|
+
#include <winsock2.h>
|
|
5
|
+
#include <ws2tcpip.h>
|
|
6
|
+
#pragma comment(lib, "Ws2_32.lib")
|
|
7
|
+
#else
|
|
8
|
+
#include <sys/socket.h>
|
|
9
|
+
#include <netinet/in.h>
|
|
10
|
+
#include <arpa/inet.h>
|
|
11
|
+
#include <unistd.h>
|
|
12
|
+
#endif
|
|
13
|
+
#include <atomic>
|
|
14
|
+
#include <chrono>
|
|
15
|
+
#include <mutex>
|
|
16
|
+
#include <string>
|
|
17
|
+
#include <vector>
|
|
18
|
+
#include <thread>
|
|
19
|
+
#include <stdexcept>
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cctype>
|
|
22
|
+
namespace spark {
|
|
23
|
+
#ifdef _WIN32
|
|
24
|
+
using AuthSocket = SOCKET;
|
|
25
|
+
static constexpr AuthSocket InvalidSocket = INVALID_SOCKET;
|
|
26
|
+
inline void CloseSocket(AuthSocket fd) { closesocket(fd); }
|
|
27
|
+
#else
|
|
28
|
+
using AuthSocket = int;
|
|
29
|
+
static constexpr AuthSocket InvalidSocket = -1;
|
|
30
|
+
inline void CloseSocket(AuthSocket fd) { close(fd); }
|
|
31
|
+
#endif
|
|
32
|
+
class AuthLoopback {
|
|
33
|
+
AuthSocket listener = InvalidSocket;
|
|
34
|
+
std::atomic<bool> stopped{false};
|
|
35
|
+
std::thread worker;
|
|
36
|
+
std::mutex mutex;
|
|
37
|
+
std::vector<std::string> results;
|
|
38
|
+
std::string route, origin;
|
|
39
|
+
bool initialized = false;
|
|
40
|
+
void Receive() {
|
|
41
|
+
const auto expires = std::chrono::steady_clock::now() + std::chrono::minutes(10);
|
|
42
|
+
while (!stopped && std::chrono::steady_clock::now() < expires) {
|
|
43
|
+
fd_set sockets; FD_ZERO(&sockets); FD_SET(listener, &sockets); timeval wait{0, 100000};
|
|
44
|
+
if (select(static_cast<int>(listener + 1), &sockets, nullptr, nullptr, &wait) <= 0) continue;
|
|
45
|
+
AuthSocket client = accept(listener, nullptr, nullptr); if (client == InvalidSocket) continue;
|
|
46
|
+
#ifdef _WIN32
|
|
47
|
+
DWORD timeout = 200; setsockopt(client, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char *>(&timeout), sizeof(timeout)); setsockopt(client, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast<char *>(&timeout), sizeof(timeout));
|
|
48
|
+
#else
|
|
49
|
+
timeval timeout{0, 200000}; setsockopt(client, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); setsockopt(client, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
|
|
50
|
+
int noPipe = 1; setsockopt(client, SOL_SOCKET, SO_NOSIGPIPE, &noPipe, sizeof(noPipe));
|
|
51
|
+
#endif
|
|
52
|
+
std::string request; char buffer[1024];
|
|
53
|
+
auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(2);
|
|
54
|
+
while (!stopped && request.size() < 8192 && request.find("\r\n\r\n") == std::string::npos && std::chrono::steady_clock::now() < deadline) {
|
|
55
|
+
int count = recv(client, buffer, sizeof(buffer), 0); if (count <= 0) break; request.append(buffer, count);
|
|
56
|
+
}
|
|
57
|
+
bool valid = false;
|
|
58
|
+
std::string target;
|
|
59
|
+
auto first = request.find("\r\n");
|
|
60
|
+
if (!stopped && request.size() <= 8192 && request.find("\r\n\r\n") != std::string::npos && request.starts_with("GET ") && first != std::string::npos) {
|
|
61
|
+
auto end = request.find(' ', 4);
|
|
62
|
+
if (end != std::string::npos && end < first) {
|
|
63
|
+
target = request.substr(4, end - 4);
|
|
64
|
+
const auto query = target.find('?');
|
|
65
|
+
std::string headers = request.substr(first + 2);
|
|
66
|
+
std::transform(headers.begin(), headers.end(), headers.begin(), [](unsigned char c) { return static_cast<char>(std::tolower(c)); });
|
|
67
|
+
const auto host = std::string("host: ") + origin.substr(7) + "\r\n";
|
|
68
|
+
valid = target.substr(0, query) == route && target.find('#') == std::string::npos &&
|
|
69
|
+
(headers.starts_with(host) || headers.find("\r\n" + host) != std::string::npos) &&
|
|
70
|
+
std::all_of(target.begin(), target.end(), [](unsigned char c) { return c > 32 && c < 127; }) &&
|
|
71
|
+
(request.substr(end, first - end) == " HTTP/1.1" || request.substr(end, first - end) == " HTTP/1.0");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (valid) { std::lock_guard lock(mutex); if (results.size() < 16) results.push_back(origin + target); }
|
|
75
|
+
const std::string body = valid ? "Callback received. You may return to the application." : "Invalid callback request.";
|
|
76
|
+
const std::string response = std::string("HTTP/1.1 ") + (valid ? "200 OK" : "400 Bad Request") + "\r\nContent-Type: text/plain; charset=utf-8\r\nCache-Control: no-store\r\nConnection: close\r\nContent-Length: " + std::to_string(body.size()) + "\r\n\r\n" + body;
|
|
77
|
+
send(client, response.data(), static_cast<int>(response.size()), 0); CloseSocket(client);
|
|
78
|
+
}
|
|
79
|
+
CloseSocket(listener); listener = InvalidSocket;
|
|
80
|
+
}
|
|
81
|
+
public:
|
|
82
|
+
AuthLoopback(unsigned short port, std::string path) : route(std::move(path)) {
|
|
83
|
+
if (route.empty() || route[0] != '/' || route.find_first_not_of("/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_") != std::string::npos) throw std::invalid_argument("Invalid callback path");
|
|
84
|
+
#ifdef _WIN32
|
|
85
|
+
WSADATA data{}; if (WSAStartup(MAKEWORD(2, 2), &data)) throw std::runtime_error("Could not initialize loopback socket"); initialized = true;
|
|
86
|
+
#endif
|
|
87
|
+
try {
|
|
88
|
+
listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listener == InvalidSocket) throw std::runtime_error("Could not create loopback socket");
|
|
89
|
+
#ifdef _WIN32
|
|
90
|
+
BOOL exclusive = TRUE; setsockopt(listener, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, reinterpret_cast<char *>(&exclusive), sizeof(exclusive));
|
|
91
|
+
#endif
|
|
92
|
+
#ifndef _WIN32
|
|
93
|
+
if (listener >= FD_SETSIZE) throw std::runtime_error("Loopback descriptor exceeds select capacity");
|
|
94
|
+
#endif
|
|
95
|
+
sockaddr_in address{}; address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_LOOPBACK); address.sin_port = htons(port);
|
|
96
|
+
if (bind(listener, reinterpret_cast<sockaddr *>(&address), sizeof(address)) != 0 || listen(listener, 8) != 0) throw std::runtime_error("Could not bind loopback callback port");
|
|
97
|
+
#ifdef _WIN32
|
|
98
|
+
int size = sizeof(address);
|
|
99
|
+
#else
|
|
100
|
+
socklen_t size = sizeof(address);
|
|
101
|
+
#endif
|
|
102
|
+
if (getsockname(listener, reinterpret_cast<sockaddr *>(&address), &size) != 0) throw std::runtime_error("Could not read loopback port");
|
|
103
|
+
origin = "http://127.0.0.1:" + std::to_string(ntohs(address.sin_port));
|
|
104
|
+
worker = std::thread([this] { Receive(); });
|
|
105
|
+
} catch (...) { if (listener != InvalidSocket) CloseSocket(listener);
|
|
106
|
+
#ifdef _WIN32
|
|
107
|
+
if (initialized) WSACleanup();
|
|
108
|
+
#endif
|
|
109
|
+
throw;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
~AuthLoopback() { stopped = true; if (worker.joinable()) worker.join();
|
|
113
|
+
#ifdef _WIN32
|
|
114
|
+
if (initialized) WSACleanup();
|
|
115
|
+
#endif
|
|
116
|
+
}
|
|
117
|
+
std::string RedirectURI() const { return origin + route; }
|
|
118
|
+
std::vector<std::string> Drain() { std::lock_guard lock(mutex); auto values = std::move(results); results.clear(); return values; }
|
|
119
|
+
AuthLoopback(AuthLoopback const &) = delete;
|
|
120
|
+
};
|
|
121
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#import "RNDesktopLinks.h"
|
|
2
|
+
#import <RNDesktopApp/SparkDesktop.h>
|
|
3
|
+
#import <Security/Security.h>
|
|
4
|
+
#import <CommonCrypto/CommonDigest.h>
|
|
5
|
+
#include "../common/AuthLoopback.h"
|
|
6
|
+
#include <map>
|
|
7
|
+
#include <memory>
|
|
8
|
+
@implementation RNDesktopLinks {
|
|
9
|
+
std::map<std::string, std::unique_ptr<spark::AuthLoopback>> _authSessions;
|
|
10
|
+
}
|
|
11
|
+
RCT_EXPORT_MODULE(NativeDesktopLinks)
|
|
12
|
+
- (void)call:(NSString *)method args:(NSString *)json resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
|
|
13
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
14
|
+
NSDictionary *args = SparkArgs(json);
|
|
15
|
+
if ([method hasPrefix:@"auth"] || [method hasPrefix:@"crypto"]) {
|
|
16
|
+
try {
|
|
17
|
+
NSString *identifier = args[@"id"] ?: @"";
|
|
18
|
+
std::string key(identifier.UTF8String);
|
|
19
|
+
if ([method isEqual:@"cryptoRandom"]) {
|
|
20
|
+
NSInteger count = [args[@"count"] integerValue]; if (count < 1 || count > 1024) throw std::invalid_argument("Random byte count must be 1–1024");
|
|
21
|
+
NSMutableData *bytes = [NSMutableData dataWithLength:count];
|
|
22
|
+
if (SecRandomCopyBytes(kSecRandomDefault, count, bytes.mutableBytes) != errSecSuccess) throw std::runtime_error("Secure random generation failed");
|
|
23
|
+
resolve(SparkJSON([bytes base64EncodedStringWithOptions:0]));
|
|
24
|
+
} else if ([method isEqual:@"cryptoDigest"]) {
|
|
25
|
+
NSData *data = [args[@"value"] dataUsingEncoding:NSUTF8StringEncoding];
|
|
26
|
+
if (!data || data.length > 1048576) throw std::invalid_argument("Digest input exceeds 1 MiB");
|
|
27
|
+
unsigned char digest[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
|
|
28
|
+
NSMutableString *hex = [NSMutableString new]; for (unsigned char byte : digest) [hex appendFormat:@"%02x", byte]; resolve(SparkJSON(hex));
|
|
29
|
+
} else if ([method isEqual:@"authPrepare"]) {
|
|
30
|
+
if (key.empty() || _authSessions.count(key) || _authSessions.size() >= 4) throw std::invalid_argument("Invalid or busy auth session");
|
|
31
|
+
NSInteger port = [args[@"port"] integerValue]; if (port < 0 || port > 65535) throw std::invalid_argument("Invalid callback port");
|
|
32
|
+
auto receiver = std::make_unique<spark::AuthLoopback>((unsigned short)port, std::string([args[@"path"] UTF8String]));
|
|
33
|
+
NSString *uri = [NSString stringWithUTF8String:receiver->RedirectURI().c_str()]; _authSessions.emplace(key, std::move(receiver)); resolve(SparkJSON(uri));
|
|
34
|
+
} else if ([method isEqual:@"authClose"]) { _authSessions.erase(key); resolve(@"null"); }
|
|
35
|
+
else if ([method isEqual:@"authPoll"]) {
|
|
36
|
+
auto found = _authSessions.find(key); if (found == _authSessions.end()) throw std::invalid_argument("Auth session is closed");
|
|
37
|
+
NSMutableArray *urls = [NSMutableArray new]; for (auto const &value : found->second->Drain()) [urls addObject:[NSString stringWithUTF8String:value.c_str()]];
|
|
38
|
+
resolve(SparkJSON(urls));
|
|
39
|
+
} else throw std::invalid_argument("Unknown auth operation");
|
|
40
|
+
} catch (std::exception const &error) { reject(@"E_AUTH", [NSString stringWithUTF8String:error.what()], nil); }
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if ([method isEqual:@"recent"]) {
|
|
44
|
+
NSArray *result = [NSUserDefaults.standardUserDefaults arrayForKey:[SparkNamespace() stringByAppendingString:@".recentDocuments"]] ?: @[];
|
|
45
|
+
resolve(SparkJSON(result)); return;
|
|
46
|
+
}
|
|
47
|
+
if ([method isEqual:@"clearRecent"]) {
|
|
48
|
+
[NSUserDefaults.standardUserDefaults removeObjectForKey:[SparkNamespace() stringByAppendingString:@".recentDocuments"]];
|
|
49
|
+
if (![SparkContext()[@"runtime"][@"mode"] isEqual:@"go"]) [NSDocumentController.sharedDocumentController clearRecentDocuments:nil];
|
|
50
|
+
resolve(@"null"); return;
|
|
51
|
+
}
|
|
52
|
+
NSURL *url = [NSURL URLWithString:args[@"url"] ?: @""];
|
|
53
|
+
if (!url.scheme.length) { SparkInvalid(reject, @"URL must have a scheme"); return; }
|
|
54
|
+
if ([method isEqual:@"canOpen"]) resolve(SparkJSON(@([NSWorkspace.sharedWorkspace URLForApplicationToOpenURL:url] != nil)));
|
|
55
|
+
else if ([method isEqual:@"open"]) {
|
|
56
|
+
// Opening a URL can deliver an Apple event back to this app. Keep its
|
|
57
|
+
// main run loop free while LaunchServices resolves and opens the target.
|
|
58
|
+
[NSWorkspace.sharedWorkspace openURL:url configuration:NSWorkspaceOpenConfiguration.configuration
|
|
59
|
+
completionHandler:^(NSRunningApplication *application, NSError *error) {
|
|
60
|
+
if (error) reject(@"E_OPEN_URL", error.localizedDescription, error);
|
|
61
|
+
else resolve(@"null");
|
|
62
|
+
}];
|
|
63
|
+
} else if ([method isEqual:@"noteRecent"]) {
|
|
64
|
+
if (!url.isFileURL) { SparkInvalid(reject, @"Recent documents must be file URLs"); return; }
|
|
65
|
+
NSString *key = [SparkNamespace() stringByAppendingString:@".recentDocuments"];
|
|
66
|
+
NSMutableArray *recent = [[NSUserDefaults.standardUserDefaults arrayForKey:key] mutableCopy] ?: [NSMutableArray new];
|
|
67
|
+
[recent removeObject:url.absoluteString]; [recent insertObject:url.absoluteString atIndex:0];
|
|
68
|
+
if (recent.count > 20) [recent removeLastObject];
|
|
69
|
+
[NSUserDefaults.standardUserDefaults setObject:recent forKey:key];
|
|
70
|
+
if (![SparkContext()[@"runtime"][@"mode"] isEqual:@"go"]) [NSDocumentController.sharedDocumentController noteNewRecentDocumentURL:url];
|
|
71
|
+
resolve(@"null");
|
|
72
|
+
} else SparkInvalid(reject, @"Unknown links operation");
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
- (void)invalidate { dispatch_async(dispatch_get_main_queue(), ^{ self->_authSessions.clear(); }); }
|
|
76
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
|
|
77
|
+
return std::make_shared<facebook::react::NativeDesktopLinksSpecJSI>(params);
|
|
78
|
+
}
|
|
79
|
+
@end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@legendapp/spark-desktop-links",
|
|
3
|
+
"version": "0.0.1-next.2",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"main": "src/index",
|
|
6
|
+
"react-native": "src/index",
|
|
7
|
+
"files": [
|
|
8
|
+
"src",
|
|
9
|
+
"macos",
|
|
10
|
+
"*.podspec",
|
|
11
|
+
"react-native.config.js",
|
|
12
|
+
"windows",
|
|
13
|
+
"common"
|
|
14
|
+
],
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"react": "19.1.4",
|
|
17
|
+
"react-native": "0.81.6",
|
|
18
|
+
"expo-linking": "~8.0.12"
|
|
19
|
+
},
|
|
20
|
+
"codegenConfig": {
|
|
21
|
+
"name": "RNDesktopLinksSpec",
|
|
22
|
+
"type": "modules",
|
|
23
|
+
"jsSrcsDir": "src",
|
|
24
|
+
"ios": {
|
|
25
|
+
"modulesProvider": {
|
|
26
|
+
"NativeDesktopLinks": "RNDesktopLinks"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"spark": {
|
|
31
|
+
"sdk": true,
|
|
32
|
+
"nativeModules": [
|
|
33
|
+
"NativeDesktopLinks"
|
|
34
|
+
],
|
|
35
|
+
"pod": "RNDesktopLinks",
|
|
36
|
+
"platforms": [
|
|
37
|
+
"macos",
|
|
38
|
+
"windows"
|
|
39
|
+
],
|
|
40
|
+
"requires": [
|
|
41
|
+
"@legendapp/spark-desktop-app"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@legendapp/spark-desktop-app": "0.0.1-next.2"
|
|
46
|
+
},
|
|
47
|
+
"peerDependenciesMeta": {
|
|
48
|
+
"expo-linking": {
|
|
49
|
+
"optional": true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"private": true
|
|
53
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Expo Desktop currently invokes the Apple autolinker with --platform ios.
|
|
2
|
+
// Its generated Podfile identifies macOS explicitly; ordinary iOS apps use Expo backends.
|
|
3
|
+
module.exports = { dependency: { platforms: {
|
|
4
|
+
ios: process.env.SPARK_DESKTOP_AUTOLINK === "macos" ? {} : null,
|
|
5
|
+
android: null,
|
|
6
|
+
} } };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TurboModule } from "react-native";
|
|
2
|
+
import { TurboModuleRegistry } from "react-native";
|
|
3
|
+
export interface Spec extends TurboModule {
|
|
4
|
+
call(method: string, args: string): Promise<string>;
|
|
5
|
+
}
|
|
6
|
+
export default TurboModuleRegistry.getEnforcing<Spec>("NativeDesktopLinks");
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Native from "./NativeDesktopLinks";
|
|
2
|
+
import { callApp, onDesktopEvent, type DesktopEvent } from "@legendapp/spark-desktop-app";
|
|
3
|
+
export type OpenEvent = { type: "openFile" | "openURL"; id: string; url: string };
|
|
4
|
+
function url(value: string) { if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value)) throw new Error("URL must include a scheme"); return value; }
|
|
5
|
+
async function call<T = void>(method: string, args: object = {}): Promise<T> { return JSON.parse(await Native.call(method, JSON.stringify(args))) as T; }
|
|
6
|
+
export async function openURL(value: string): Promise<true> {
|
|
7
|
+
await call("open", { url: url(value) }); return true;
|
|
8
|
+
}
|
|
9
|
+
export async function canOpenURL(value: string): Promise<boolean> { return call("canOpen", { url: url(value) }); }
|
|
10
|
+
export const noteRecentDocument = (value: string) => call("noteRecent", { url: url(value) });
|
|
11
|
+
export const clearRecentDocuments = () => call("clearRecent");
|
|
12
|
+
export const getRecentDocuments = () => call<string[]>("recent");
|
|
13
|
+
/** Subscribe before fetching queued launches; event ids deduplicate the overlap. */
|
|
14
|
+
export async function onOpen(listener: (event: OpenEvent) => void) {
|
|
15
|
+
const seen = new Set<string>(); let removed = false;
|
|
16
|
+
function deliver(event: DesktopEvent) {
|
|
17
|
+
if (removed || (event.type !== "openFile" && event.type !== "openURL") || !event.id || seen.has(event.id)) return;
|
|
18
|
+
seen.add(event.id);
|
|
19
|
+
if (seen.size > 200) seen.delete(seen.values().next().value!);
|
|
20
|
+
listener(event as OpenEvent);
|
|
21
|
+
}
|
|
22
|
+
const subscription = onDesktopEvent(deliver);
|
|
23
|
+
try { for (const event of await callApp<DesktopEvent[]>("pendingURLs")) deliver(event); }
|
|
24
|
+
catch (error) { subscription.remove(); throw error; }
|
|
25
|
+
return { remove() { removed = true; subscription.remove(); } };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type URLListener = (event: { url: string }) => void;
|
|
29
|
+
/** URL that launched this native process, or null; stable across later opens and JS reloads. */
|
|
30
|
+
export const getInitialURL = (): Promise<string | null> => callApp("initialURL");
|
|
31
|
+
/** Live URL events only. Use onOpen for queued desktop URLs and file-open events. */
|
|
32
|
+
export function addEventListener(type: "url", listener: URLListener): { remove(): void } {
|
|
33
|
+
if (type !== "url" || typeof listener !== "function") throw new TypeError("Expected a url event listener");
|
|
34
|
+
return onDesktopEvent(event => {
|
|
35
|
+
if (event.type === "openURL" && event.initial !== true && typeof event.url === "string") listener({ url: event.url });
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { openURL, canOpenURL, getInitialURL, addEventListener } from "expo-linking";
|
|
2
|
+
export type { OpenEvent, URLListener } from "./index";
|
|
3
|
+
/** Legacy desktop facilities have no shared equivalent. */
|
|
4
|
+
const unavailable = async (..._args: unknown[]): Promise<never> => { throw Object.assign(new Error("Desktop document events/history are unavailable on this platform; use URL events instead"), { code: "E_UNAVAILABLE" }); };
|
|
5
|
+
export const onOpen = unavailable, noteRecentDocument = unavailable, clearRecentDocuments = unavailable, getRecentDocuments = unavailable;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./expo";
|