Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(websockets): visionOS and catalyst support #18

Merged
merged 4 commits into from
Jul 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions .github/workflows/lint-and-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ env:

on:
push:
branches: [ "master" ]
branches: ['master']
pull_request:
branches: [ "master" ]
branches: ['master']

jobs:
lint:
Expand Down Expand Up @@ -47,6 +47,16 @@ jobs:
- uses: nrwl/nx-set-shas@v2
with:
main-branch-name: 'master'
- name: Xcode Select Version
# see available xcode versions in https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md#xcode
uses: mobiledevops/xcode-select-version-action@v1
with:
xcode-select-version: 15.4
- name: Install visionOS platform
run: |
defaults write com.apple.dt.Xcode AllowUnsupportedVisionOSHost -bool YES
defaults write com.apple.CoreSimulator AllowUnsupportedVisionOSHost -bool YES
xcodebuild -downloadPlatform visionOS
- name: yarn install
run: yarn --immutable
- name: Build.all affected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -366,9 +366,12 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.valor-software.NativeScriptWebSockets";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = "";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
SUPPORTS_MACCATALYST = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = "1,2,7";
};
name = Debug;
};
Expand All @@ -392,9 +395,12 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.valor-software.NativeScriptWebSockets";
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = "";
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator";
SUPPORTS_MACCATALYST = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = "1,2,7";
};
name = Release;
};
Expand Down
52 changes: 49 additions & 3 deletions packages/nativescript-websockets/native-src/ios/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,62 @@ xcodebuild \
SKIP_INSTALL=NO \
-quiet

echo "Build for Mac Catalyst"
xcodebuild \
-project $PACKAGENAME.xcodeproj \
-scheme $PACKAGENAME \
-configuration Release \
-destination "platform=macOS,variant=Mac Catalyst" \
clean build \
BUILD_DIR=$OUTPUTPATH \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
-quiet

echo "Build for visionos device"
xcodebuild \
-project $PACKAGENAME.xcodeproj \
-scheme $PACKAGENAME \
-configuration Release \
-destination "generic/platform=visionOS" \
clean build \
BUILD_DIR=$OUTPUTPATH \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
-quiet

echo "Build for visionos simulator"
xcodebuild \
-project $PACKAGENAME.xcodeproj \
-scheme $PACKAGENAME \
-sdk xrsimulator \
-configuration Release \
clean build \
BUILD_DIR=$OUTPUTPATH \
-destination "generic/platform=xrsimulator" \
EXCLUDED_ARCHS="i386 x86_64" \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
SKIP_INSTALL=NO \
-quiet

echo "Creating XCFramework"
xcodebuild \
-create-xcframework \
-framework $OUTPUTPATH/Release-iphoneos/$PACKAGENAME.framework \
-debug-symbols $OUTPUTPATH/Release-iphoneos/$PACKAGENAME.framework.dSYM \
-framework $OUTPUTPATH/Release-iphonesimulator/$PACKAGENAME.framework \
-debug-symbols $OUTPUTPATH/Release-iphonesimulator/$PACKAGENAME.framework.dSYM \
-framework $OUTPUTPATH/Release-maccatalyst/$PACKAGENAME.framework \
-debug-symbols $OUTPUTPATH/Release-maccatalyst/$PACKAGENAME.framework.dSYM \
-framework $OUTPUTPATH/Release-xros/$PACKAGENAME.framework \
-debug-symbols $OUTPUTPATH/Release-xros/$PACKAGENAME.framework.dSYM \
-framework $OUTPUTPATH/Release-xrsimulator/$PACKAGENAME.framework \
-debug-symbols $OUTPUTPATH/Release-xrsimulator/$PACKAGENAME.framework.dSYM \
-output $OUTPUTPATH/$PACKAGENAME.xcframework


mkdir -p $COPYPATH
rm -rf $COPYPATH/$PACKAGENAME.xcframework
cp -R $OUTPUTPATH/$PACKAGENAME.xcframework $COPYPATH/
rm -rf $COPYPATH/$PACKAGENAME.xcframework
cp -R $OUTPUTPATH/$PACKAGENAME.xcframework $COPYPATH/
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,24 @@
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>NativeScriptWebSockets.framework/Versions/A/NativeScriptWebSockets</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>ios-arm64-maccatalyst</string>
<key>LibraryPath</key>
<string>NativeScriptWebSockets.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>maccatalyst</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>NativeScriptWebSockets.framework/NativeScriptWebSockets</string>
Expand All @@ -39,6 +57,40 @@
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>NativeScriptWebSockets.framework/NativeScriptWebSockets</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>xros-arm64</string>
<key>LibraryPath</key>
<string>NativeScriptWebSockets.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>xros</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>NativeScriptWebSockets.framework/NativeScriptWebSockets</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>xros-arm64-simulator</string>
<key>LibraryPath</key>
<string>NativeScriptWebSockets.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>xros</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// NativeScriptWebSockets.h
// NativeScriptWebSockets
//
// Created by Eduardo Speroni on 2/25/22.
//

#import <Foundation/Foundation.h>

//! Project version number for NativeScriptWebSockets.
FOUNDATION_EXPORT double NativeScriptWebSocketsVersionNumber;

//! Project version string for NativeScriptWebSockets.
FOUNDATION_EXPORT const unsigned char NativeScriptWebSocketsVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <NativeScriptWebSockets/PublicHeader.h>

#import "RCTSRWebSocket.h"
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
//
// Copyright 2012 Square Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#import <Foundation/Foundation.h>
#import <Security/SecCertificate.h>

typedef NS_ENUM(unsigned int, RCTSRReadyState) {
RCTSR_CONNECTING = 0,
RCTSR_OPEN = 1,
RCTSR_CLOSING = 2,
RCTSR_CLOSED = 3,
};

typedef NS_ENUM(NSInteger, RCTSRStatusCode) {
RCTSRStatusCodeNormal = 1000,
RCTSRStatusCodeGoingAway = 1001,
RCTSRStatusCodeProtocolError = 1002,
RCTSRStatusCodeUnhandledType = 1003,
// 1004 reserved.
RCTSRStatusNoStatusReceived = 1005,
// 1004-1006 reserved.
RCTSRStatusCodeInvalidUTF8 = 1007,
RCTSRStatusCodePolicyViolated = 1008,
RCTSRStatusCodeMessageTooBig = 1009,
};

@class RCTSRWebSocket;

extern NSString *const RCTSRWebSocketErrorDomain;
extern NSString *const RCTSRHTTPResponseErrorKey;

#pragma mark - RCTSRWebSocketDelegate

@protocol RCTSRWebSocketDelegate;

#pragma mark - RCTSRWebSocket

@interface RCTSRWebSocket : NSObject <NSStreamDelegate>

@property (nonatomic, weak) id<RCTSRWebSocketDelegate> delegate;

@property (nonatomic, readonly) RCTSRReadyState readyState;
@property (nonatomic, readonly, strong) NSURL *url;

// This returns the negotiated protocol.
// It will be nil until after the handshake completes.
@property (nonatomic, readonly, copy) NSString *protocol;

// Protocols should be an array of strings that turn into Sec-WebSocket-Protocol.
- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithURLRequest:(NSURLRequest *)request;

// Some helper constructors.
- (instancetype)initWithURL:(NSURL *)url protocols:(NSArray<NSString *> *)protocols;
- (instancetype)initWithURL:(NSURL *)url;

// Delegate queue will be dispatch_main_queue by default.
// You cannot set both OperationQueue and dispatch_queue.
- (void)setDelegateOperationQueue:(NSOperationQueue *)queue;
- (void)setDelegateDispatchQueue:(dispatch_queue_t)queue;

// By default, it will schedule itself on +[NSRunLoop RCTSR_networkRunLoop] using defaultModes.
- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;

// RCTSRWebSockets are intended for one-time-use only. Open should be called once and only once.
- (void)open;

- (void)close;
- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason;

// Send a UTF8 String or Data.
- (void)send:(id)data;

// Send Data (can be nil) in a ping message.
- (void)sendPing:(NSData *)data;

@end

#pragma mark - RCTSRWebSocketDelegate

@protocol RCTSRWebSocketDelegate <NSObject>

// message will either be an NSString if the server is using text
// or NSData if the server is using binary.
- (void)webSocket:(RCTSRWebSocket *)webSocket didReceiveMessage:(id)message;

@optional

- (void)webSocketDidOpen:(RCTSRWebSocket *)webSocket;
- (void)webSocket:(RCTSRWebSocket *)webSocket didFailWithError:(NSError *)error;
- (void)webSocket:(RCTSRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
- (void)webSocket:(RCTSRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;

@end

#pragma mark - NSURLRequest (CertificateAdditions)

@interface NSURLRequest (CertificateAdditions)

@property (nonatomic, readonly, copy) NSArray *RCTSR_SSLPinnedCertificates;

@end

#pragma mark - NSMutableURLRequest (CertificateAdditions)

@interface NSMutableURLRequest (CertificateAdditions)

@property (nonatomic, copy) NSArray *RCTSR_SSLPinnedCertificates;

@end

#pragma mark - NSRunLoop (RCTSRWebSocket)

@interface NSRunLoop (RCTSRWebSocket)

+ (NSRunLoop *)RCTSR_networkRunLoop;

@end
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
framework module NativeScriptWebSockets {
umbrella header "NativeScriptWebSockets.h"
export *

module * { export * }
}
Binary file not shown.
Loading
Loading