Skip to content

Commit

Permalink
feat(websockets): visionOS and catalyst support (#18)
Browse files Browse the repository at this point in the history
* feat(websockets): visionOS support

* ci: select xcode 15.4

* chore: add pre-built versions

* fix: visionos device and catalyst target
  • Loading branch information
edusperoni authored Jul 3, 2024
1 parent b8734fb commit 5894657
Show file tree
Hide file tree
Showing 38 changed files with 1,493 additions and 7 deletions.
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

0 comments on commit 5894657

Please sign in to comment.