├── .circleci └── config.yml ├── .gitignore ├── .swift-version ├── Cartfile ├── Cartfile.resolved ├── Carthage └── Cartfile.resolved ├── LICENSE ├── README.md ├── RxStarscream-macOS ├── Info.plist └── RxStarscream_macOS.h ├── RxStarscream-macOSTests ├── Info.plist └── RxStarscream_macOSTests.swift ├── RxStarscream.podspec ├── RxStarscream.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── RxStarscream-macOS.xcscheme │ └── RxStarscream.xcscheme ├── RxStarscream ├── Info.plist └── RxStarscream.h ├── RxStarscreamTests ├── Info.plist └── RxStarscreamTests.swift ├── SampleApp ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── RxStarscream1024.png │ │ ├── RxStarscreamIcon40.png │ │ ├── RxStarscreamIcon60.png │ │ ├── iPhone_App_iOS7-9_60pt@2x.png │ │ ├── iPhone_App_iOS7-9_60pt@3x.png │ │ ├── iPhone_Settings_iOS5-9_29pt@2x.png │ │ ├── iPhone_Settings_iOS5-9_29pt@3x.png │ │ ├── iPhone_Spotlight_iOS7-9_40pt@2x.png │ │ └── iPhone_Spotlight_iOS7-9_40pt@3x.png │ ├── Contents.json │ └── RxStarscreamIcon.imageset │ │ ├── Contents.json │ │ └── RxStarscreamIcon.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist └── ViewController.swift ├── Source └── RxStarscream.swift └── scripts ├── bootstrap-if-needed.sh └── bootstrap.sh /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | "RxStarscream Tests": 4 | working_directory: ~/RxSwiftCommunity/RxStarscream 5 | parallelism: 1 6 | shell: /bin/bash --login 7 | environment: 8 | XCODE_TEST_REPORTS: /tmp/xcode-test-results 9 | LANG: en_US.UTF-8 10 | macos: 11 | xcode: '10.2.0' 12 | steps: 13 | - checkout 14 | - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS $XCODE_TEST_REPORTS 15 | - restore_cache: 16 | keys: 17 | - v1-dep-{{ .Branch }}- 18 | - v1-dep-master- 19 | - v1-dep- 20 | - run: 21 | name: Bootstrap Carthage 22 | command: scripts/bootstrap.sh 23 | - save_cache: 24 | key: v1-dep-{{ .Branch }}-{{ epoch }} 25 | paths: 26 | - Carthage 27 | - run: 28 | name: iOS, Swift 5 29 | command: set -o pipefail && xcodebuild test SWIFT_VERSION=5.0 -scheme RxStarscream -project RxStarscream.xcodeproj -sdk iphonesimulator -destination "name=iPhone 8" | xcpretty -c -r html --output $XCODE_TEST_REPORTS/iOS_swift5.html 30 | - run: 31 | name: macOS, Swift 5 32 | command: set -o pipefail && xcodebuild test SWIFT_VERSION=5.0 -scheme RxStarscream-macOS -project RxStarscream.xcodeproj -sdk macosx | xcpretty -c -r html --output $XCODE_TEST_REPORTS/macOS_swift5.html 33 | - store_artifacts: 34 | path: $XCODE_TEST_REPORTS 35 | "RxStarscream Release": 36 | working_directory: ~/RxSwiftCommunity/RxStarscream 37 | parallelism: 1 38 | shell: /bin/bash --login 39 | environment: 40 | LANG: en_US.UTF-8 41 | macos: 42 | xcode: '10.2.0' 43 | steps: 44 | - checkout 45 | - run: 46 | name: Setup CocoaPods 47 | command: pod setup 48 | - run: 49 | name: Override Circle CI Config 50 | command: rm ~/.cocoapods/config.yaml # This hack is needed since CircleCI forces --verbose 51 | - run: 52 | name: Push Podspec to Trunk 53 | command: pod trunk push --skip-tests --allow-warnings --swift-version=5.0 54 | workflows: 55 | version: 2 56 | build: 57 | jobs: 58 | - "RxStarscream Tests": 59 | filters: 60 | tags: 61 | ignore: /[0-9]+(\.[0-9]+)*/ 62 | release: 63 | jobs: 64 | - "RxStarscream Release": 65 | filters: 66 | branches: 67 | ignore: /.*/ 68 | tags: 69 | only: /[0-9]+(\.[0-9]+)*/ 70 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.xccheckout 21 | # AppCode 22 | .idea/ 23 | # Framworks 24 | *.framework 25 | 26 | 27 | Carthage/Build 28 | Carthage/Checkouts 29 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 5.0 2 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" ~> 5 2 | github "daltoniam/Starscream" ~> 3.1 3 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" "5.0.1" 2 | github "daltoniam/Starscream" "3.1.0" 3 | -------------------------------------------------------------------------------- /Carthage/Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" "5.0.1" 2 | github "daltoniam/Starscream" "3.1.0" 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 RxSwift Community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | RxStarscream 6 | ========================================================================================================================= 7 | [![CircleCI](https://img.shields.io/circleci/project/github/RxSwiftCommunity/RxStarscream/master.svg)](https://circleci.com/gh/RxSwiftCommunity/RxStarscream/tree/master) 8 | ![pod](https://img.shields.io/cocoapods/v/RxStarscream.svg) 9 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 10 | 11 | A lightweight extension to [Starscream](https://github.com/daltoniam/Starscream) to track websocket events using RxSwift observables. 12 | 13 | ## Installation 14 | 15 | ### CocoaPods 16 | 17 | RxStarscream is available through [CocoaPods](http://cocoapods.org/). 18 | Add the following line to your `Podfile`: 19 | 20 | pod 'RxStarscream' 21 | 22 | Then run: 23 | 24 | pod install 25 | 26 | ### RxStarscream version vs Swift version. 27 | 28 | Below is a table that shows which version of RxStarscream you should use for 29 | your Swift version. 30 | 31 | | Swift | RxStarscream | RxSwift | 32 | | ------ | ------------- |---------------| 33 | | >= 4.2 | \>= 0.10 | \>= 4.3 | 34 | | < 4.2 | \>= 0.8 | \>= 4.0 | 35 | | 3.X | 0.7 | 3.0.0 - 3.6.1 | 36 | 37 | ### Carthage 38 | 39 | Add this to your Cartfile 40 | 41 | github "RxSwiftCommunity/RxStarscream" 42 | 43 | Then run: 44 | 45 | carthage update 46 | 47 | ## Usage examples 48 | 49 | After installing via CococPods or Carthage, you should import the framework. 50 | 51 | ```swift 52 | import RxStarscream 53 | ``` 54 | 55 | Once imported, you can open a connection to your WebSocket server. 56 | 57 | ```swift 58 | 59 | socket = WebSocket(url: URL(string: "ws://localhost:8080/")!) 60 | socket.connect() 61 | ``` 62 | Now you can subscribe e.g to all of the websocket events: 63 | 64 | ```swift 65 | socket.rx.response.subscribe(onNext: { (response: WebSocketEvent) in 66 | switch response { 67 | case .connected: 68 | print("Connected") 69 | case .disconnected(let error): 70 | print("Disconnected with optional error : \(error)") 71 | case .message(let msg): 72 | print("Message : \(msg)") 73 | case .data(_): 74 | print("Data") 75 | case .pong: 76 | print("Pong") 77 | } 78 | }).disposed(by: disposeBag) 79 | ``` 80 | 81 | 82 | Or just to a connect event: 83 | 84 | ```swift 85 | socket.rx.connected.subscribe(onNext: { (isConnected: Bool) in 86 | print("Is connected : \(isConnected)") 87 | }).disposed(by: disposeBag) 88 | ``` 89 | 90 | Or just to a message event: 91 | 92 | ```swift 93 | socket.rx.text.subscribe(onNext: { (message: String) in 94 | print("Message : \(message)") 95 | }).disposed(by: disposeBag) 96 | ``` 97 | 98 | 99 | ## Sample Project 100 | 101 | There's a sample project (you need to run `carthage update` for it to compile). 102 | 103 | The sample project uses echo server - https://www.websocket.org/echo.html 104 | 105 | Have fun! 106 | 107 | ## Thanks 108 | 109 | Everyone in the RxSwift Slack channel. 110 | 111 | ## Contributing 112 | 113 | Bug reports and pull requests are welcome. 114 | 115 | ## License 116 | 117 | RxStarscream is available under the MIT license. See the LICENSE file for more info. 118 | -------------------------------------------------------------------------------- /RxStarscream-macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2018年 Guy Kahlon. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /RxStarscream-macOS/RxStarscream_macOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxStarscream_macOS.h 3 | // RxStarscream-macOS 4 | // 5 | // Created by 森下 侑亮 on 2018/03/07. 6 | // Copyright © 2018年 Guy Kahlon. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for RxStarscream_macOS. 12 | FOUNDATION_EXPORT double RxStarscream_macOSVersionNumber; 13 | 14 | //! Project version string for RxStarscream_macOS. 15 | FOUNDATION_EXPORT const unsigned char RxStarscream_macOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /RxStarscream-macOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /RxStarscream-macOSTests/RxStarscream_macOSTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxStarscream_macOSTests.swift 3 | // RxStarscream-macOSTests 4 | // 5 | // Created by 森下 侑亮 on 2018/03/07. 6 | // Copyright © 2018年 Guy Kahlon. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import RxTest 12 | import Starscream 13 | import RxStarscream_macOS 14 | 15 | extension WebSocketEvent: Equatable { } 16 | 17 | public func ==(lhs: WebSocketEvent, rhs: WebSocketEvent) -> Bool { 18 | switch (lhs, rhs) { 19 | case (.connected, .connected): 20 | return true 21 | case (.disconnected(let lhsError), .disconnected(let rhsError)): 22 | return lhsError?.localizedDescription == rhsError?.localizedDescription 23 | case (.message(let lhsMsg), .message(let rhsMsg)): 24 | return lhsMsg == rhsMsg 25 | case (.data(let lhsData), .data(let rhsData)): 26 | return lhsData == rhsData 27 | case (.pong, .pong): 28 | return true 29 | default: 30 | return false 31 | } 32 | } 33 | 34 | class RxStarscreamTests: XCTestCase { 35 | 36 | private var connectedObserver: TestableObserver! 37 | private var pongObserver: TestableObserver! 38 | private var responseObserver: TestableObserver! 39 | private var socket: WebSocket! 40 | 41 | let disposeBag = DisposeBag() 42 | 43 | override func setUp() { 44 | super.setUp() 45 | 46 | socket = WebSocket(url: URL(string: "wss://echo.websocket.org")!) 47 | continueAfterFailure = false 48 | } 49 | 50 | func testConnection() { 51 | let scheduler = TestScheduler(initialClock: 0) 52 | connectedObserver = scheduler.createObserver(Bool.self) 53 | 54 | let connected = socket.rx.connected.share(replay: 1) 55 | connected.subscribe(onNext: { [unowned self] _ in 56 | self.socket.disconnect() 57 | }).disposed(by: disposeBag) 58 | 59 | socket.rx.connected 60 | .subscribe(connectedObserver) 61 | .disposed(by: disposeBag) 62 | 63 | XCTAssertTrue(socket.delegate != nil, "delegate should be set") 64 | 65 | socket.delegate!.websocketDidConnect(socket: socket) 66 | socket.delegate!.websocketDidDisconnect(socket: socket, error: nil) 67 | 68 | XCTAssertEqual(self.connectedObserver.events.count, 2) 69 | XCTAssertEqual(self.connectedObserver.events[0].value.element!, true) 70 | XCTAssertEqual(self.connectedObserver.events[1].value.element!, false) 71 | } 72 | 73 | func testPongMessage() { 74 | let scheduler = TestScheduler(initialClock: 0) 75 | pongObserver = scheduler.createObserver(WebSocketEvent.self) 76 | 77 | socket.rx.response 78 | .subscribe(pongObserver) 79 | .disposed(by: disposeBag) 80 | 81 | XCTAssertTrue(socket.pongDelegate != nil, "pongDelegate should be set") 82 | 83 | socket.pongDelegate!.websocketDidReceivePong(socket: socket, data: Data()) 84 | 85 | XCTAssertEqual(self.pongObserver.events.count, 1) 86 | XCTAssertEqual(self.pongObserver.events[0].value.element!, WebSocketEvent.pong) 87 | } 88 | 89 | func testMessageResponse() { 90 | let sentMessage = "Hello" 91 | 92 | let scheduler = TestScheduler(initialClock: 0) 93 | responseObserver = scheduler.createObserver(WebSocketEvent.self) 94 | 95 | socket.rx.response 96 | .subscribe(responseObserver) 97 | .disposed(by: disposeBag) 98 | 99 | XCTAssertTrue(socket.delegate != nil, "delegate should be set") 100 | 101 | socket.delegate!.websocketDidReceiveMessage(socket: socket, text: sentMessage) 102 | 103 | XCTAssertEqual(self.responseObserver.events.count, 1) 104 | XCTAssertEqual(WebSocketEvent.message(sentMessage), self.responseObserver.events[0].value.element!) 105 | } 106 | } 107 | 108 | -------------------------------------------------------------------------------- /RxStarscream.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = 'RxStarscream' 3 | spec.version = '0.10' 4 | spec.license = 'Apache License, Version 2.0' 5 | spec.homepage = 'https://github.com/RxSwiftCommunity/RxStarscream' 6 | spec.authors = { 'Guy Kahlon' => 'guykahlon@gmail.com' } 7 | spec.summary = 'A lightweight extension to subscribe Starscream websocket events with RxSwift.' 8 | spec.source = { :git => 'https://github.com/RxSwiftCommunity/RxStarscream.git', :tag => spec.version.to_s } 9 | spec.source_files = 'Source/*.swift' 10 | spec.requires_arc = true 11 | spec.ios.deployment_target = '8.0' 12 | spec.osx.deployment_target = '10.10' 13 | spec.dependency 'Starscream', '~> 3' 14 | spec.dependency 'RxSwift', '~> 5' 15 | spec.dependency 'RxCocoa', '~> 5' 16 | spec.license = { :type => 'Apache License, Version 2.0', :text => <<-LICENSE 17 | Licensed under the Apache License, Version 2.0 (the "License"); 18 | you may not use this file except in compliance with the License. 19 | You may obtain a copy of the License at 20 | 21 | http://www.apache.org/licenses/LICENSE-2.0 22 | 23 | Unless required by applicable law or agreed to in writing, software 24 | distributed under the License is distributed on an "AS IS" BASIS, 25 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 26 | See the License for the specific language governing permissions and 27 | limitations under the License. 28 | LICENSE 29 | } 30 | end 31 | -------------------------------------------------------------------------------- /RxStarscream.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0B4DAAC71E0497BC00ECDBF9 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B4DAAC61E0497BC00ECDBF9 /* RxCocoa.framework */; }; 11 | 0B4DAAC81E04980000ECDBF9 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B4DAAC61E0497BC00ECDBF9 /* RxCocoa.framework */; }; 12 | 0B4DAAC91E04980000ECDBF9 /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0B4DAAC61E0497BC00ECDBF9 /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 13 | 98655E3C204F892000524A64 /* RxStarscream_macOS.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98D95A3F204F7E9A00159C45 /* RxStarscream_macOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 98D95A48204F7E9B00159C45 /* RxStarscream_macOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A3F204F7E9A00159C45 /* RxStarscream_macOS.framework */; }; 15 | 98D95A56204F7EB400159C45 /* RxStarscream_macOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 98D95A41204F7E9A00159C45 /* RxStarscream_macOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 98D95A57204F7EC000159C45 /* RxStarscream.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46D00311CFF22760054DF1F /* RxStarscream.swift */; }; 17 | 98D95A59204F7EDF00159C45 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A58204F7EDE00159C45 /* RxSwift.framework */; }; 18 | 98D95A5D204F7EF800159C45 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A5C204F7EF800159C45 /* Starscream.framework */; }; 19 | 98D95A5F204F7FC300159C45 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A5A204F7EEE00159C45 /* RxCocoa.framework */; }; 20 | 98D95A61204F82BA00159C45 /* RxStarscream_macOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D95A4C204F7E9B00159C45 /* RxStarscream_macOSTests.swift */; }; 21 | 98D95A62204F839A00159C45 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A5A204F7EEE00159C45 /* RxCocoa.framework */; }; 22 | 98D95A63204F83A400159C45 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A58204F7EDE00159C45 /* RxSwift.framework */; }; 23 | 98D95A65204F83AE00159C45 /* RxTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A64204F83AE00159C45 /* RxTest.framework */; }; 24 | 98D95A67204F85D000159C45 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98D95A5C204F7EF800159C45 /* Starscream.framework */; }; 25 | BEF314431E86D13C00C15DD4 /* RxStarscreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEF314421E86D13C00C15DD4 /* RxStarscreamTests.swift */; }; 26 | BEF314451E86D13C00C15DD4 /* RxStarscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E46D00261CFF22200054DF1F /* RxStarscream.framework */; }; 27 | BEF314521E86DB5700C15DD4 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A21CFF275E00885498 /* RxSwift.framework */; }; 28 | BEF314541E86DB5700C15DD4 /* RxTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEF3144C1E86DAFA00C15DD4 /* RxTest.framework */; }; 29 | BEF314551E86DB5700C15DD4 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A31CFF275E00885498 /* Starscream.framework */; }; 30 | BEF314571E875D8500C15DD4 /* RxCocoa.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0B4DAAC61E0497BC00ECDBF9 /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 31 | BEF314581E875D8500C15DD4 /* RxSwift.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E42144A21CFF275E00885498 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 32 | BEF314591E875D8500C15DD4 /* Starscream.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E42144A31CFF275E00885498 /* Starscream.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 33 | BEF3145B1E875DAA00C15DD4 /* RxTest.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = BEF3144C1E86DAFA00C15DD4 /* RxTest.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 34 | DF3045271FF31E5E009A779B /* RxStarscream.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E46D00261CFF22200054DF1F /* RxStarscream.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 35 | E402203A1CFF3C6900C5A874 /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A21CFF275E00885498 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 36 | E402203C1CFF3C6900C5A874 /* Starscream.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A31CFF275E00885498 /* Starscream.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 37 | E42144A41CFF275E00885498 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A21CFF275E00885498 /* RxSwift.framework */; }; 38 | E42144A51CFF275E00885498 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A31CFF275E00885498 /* Starscream.framework */; }; 39 | E42144DD1CFF385E00885498 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E42144DC1CFF385E00885498 /* AppDelegate.swift */; }; 40 | E42144DF1CFF385E00885498 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E42144DE1CFF385E00885498 /* ViewController.swift */; }; 41 | E42144E21CFF385E00885498 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E42144E01CFF385E00885498 /* Main.storyboard */; }; 42 | E42144E41CFF385E00885498 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E42144E31CFF385E00885498 /* Assets.xcassets */; }; 43 | E42144E71CFF385E00885498 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E42144E51CFF385E00885498 /* LaunchScreen.storyboard */; }; 44 | E42144EC1CFF395500885498 /* RxStarscream.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46D00311CFF22760054DF1F /* RxStarscream.swift */; }; 45 | E42144ED1CFF3AC600885498 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A21CFF275E00885498 /* RxSwift.framework */; }; 46 | E42144EE1CFF3AC900885498 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E42144A31CFF275E00885498 /* Starscream.framework */; }; 47 | E46D002A1CFF22200054DF1F /* RxStarscream.h in Headers */ = {isa = PBXBuildFile; fileRef = E46D00291CFF22200054DF1F /* RxStarscream.h */; settings = {ATTRIBUTES = (Public, ); }; }; 48 | E46D00321CFF22760054DF1F /* RxStarscream.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46D00311CFF22760054DF1F /* RxStarscream.swift */; }; 49 | EE32F632227B251800F27FFA /* RxRelay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE32F631227B251800F27FFA /* RxRelay.framework */; }; 50 | EE32F633227B253200F27FFA /* RxRelay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE32F631227B251800F27FFA /* RxRelay.framework */; }; 51 | EE32F639227B257600F27FFA /* RxRelay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE32F638227B257600F27FFA /* RxRelay.framework */; }; 52 | EE32F63A227B258500F27FFA /* RxRelay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE32F638227B257600F27FFA /* RxRelay.framework */; }; 53 | EE32F640227B28A500F27FFA /* RxRelay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE32F631227B251800F27FFA /* RxRelay.framework */; }; 54 | EE32F641227B28E700F27FFA /* RxRelay.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EE32F631227B251800F27FFA /* RxRelay.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 55 | EE32F642227B292400F27FFA /* RxRelay.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = EE32F631227B251800F27FFA /* RxRelay.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 56 | EE32F643227B296300F27FFA /* RxCocoa.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98D95A5A204F7EEE00159C45 /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 57 | EE32F644227B296300F27FFA /* RxRelay.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EE32F638227B257600F27FFA /* RxRelay.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 58 | EE32F645227B296300F27FFA /* RxSwift.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98D95A58204F7EDE00159C45 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 59 | EE32F646227B296300F27FFA /* RxTest.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98D95A64204F83AE00159C45 /* RxTest.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 60 | EE32F647227B296300F27FFA /* Starscream.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98D95A5C204F7EF800159C45 /* Starscream.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 61 | /* End PBXBuildFile section */ 62 | 63 | /* Begin PBXContainerItemProxy section */ 64 | 98D95A49204F7E9B00159C45 /* PBXContainerItemProxy */ = { 65 | isa = PBXContainerItemProxy; 66 | containerPortal = E46D001D1CFF22200054DF1F /* Project object */; 67 | proxyType = 1; 68 | remoteGlobalIDString = 98D95A3E204F7E9A00159C45; 69 | remoteInfo = "RxStarscream-macOS"; 70 | }; 71 | BEF314461E86D13C00C15DD4 /* PBXContainerItemProxy */ = { 72 | isa = PBXContainerItemProxy; 73 | containerPortal = E46D001D1CFF22200054DF1F /* Project object */; 74 | proxyType = 1; 75 | remoteGlobalIDString = E46D00251CFF22200054DF1F; 76 | remoteInfo = RxStarscream; 77 | }; 78 | /* End PBXContainerItemProxy section */ 79 | 80 | /* Begin PBXCopyFilesBuildPhase section */ 81 | 98D95A68204F874100159C45 /* CopyFiles */ = { 82 | isa = PBXCopyFilesBuildPhase; 83 | buildActionMask = 2147483647; 84 | dstPath = ""; 85 | dstSubfolderSpec = 10; 86 | files = ( 87 | EE32F643227B296300F27FFA /* RxCocoa.framework in CopyFiles */, 88 | EE32F644227B296300F27FFA /* RxRelay.framework in CopyFiles */, 89 | 98655E3C204F892000524A64 /* RxStarscream_macOS.framework in CopyFiles */, 90 | EE32F645227B296300F27FFA /* RxSwift.framework in CopyFiles */, 91 | EE32F646227B296300F27FFA /* RxTest.framework in CopyFiles */, 92 | EE32F647227B296300F27FFA /* Starscream.framework in CopyFiles */, 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | BEF314561E875D5F00C15DD4 /* CopyFiles */ = { 97 | isa = PBXCopyFilesBuildPhase; 98 | buildActionMask = 2147483647; 99 | dstPath = ""; 100 | dstSubfolderSpec = 10; 101 | files = ( 102 | BEF314571E875D8500C15DD4 /* RxCocoa.framework in CopyFiles */, 103 | EE32F641227B28E700F27FFA /* RxRelay.framework in CopyFiles */, 104 | DF3045271FF31E5E009A779B /* RxStarscream.framework in CopyFiles */, 105 | BEF314581E875D8500C15DD4 /* RxSwift.framework in CopyFiles */, 106 | BEF3145B1E875DAA00C15DD4 /* RxTest.framework in CopyFiles */, 107 | BEF314591E875D8500C15DD4 /* Starscream.framework in CopyFiles */, 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | E402203D1CFF3C6900C5A874 /* Embed Frameworks */ = { 112 | isa = PBXCopyFilesBuildPhase; 113 | buildActionMask = 2147483647; 114 | dstPath = ""; 115 | dstSubfolderSpec = 10; 116 | files = ( 117 | 0B4DAAC91E04980000ECDBF9 /* RxCocoa.framework in Embed Frameworks */, 118 | EE32F642227B292400F27FFA /* RxRelay.framework in Embed Frameworks */, 119 | E402203A1CFF3C6900C5A874 /* RxSwift.framework in Embed Frameworks */, 120 | E402203C1CFF3C6900C5A874 /* Starscream.framework in Embed Frameworks */, 121 | ); 122 | name = "Embed Frameworks"; 123 | runOnlyForDeploymentPostprocessing = 0; 124 | }; 125 | /* End PBXCopyFilesBuildPhase section */ 126 | 127 | /* Begin PBXFileReference section */ 128 | 0B4DAAC61E0497BC00ECDBF9 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/iOS/RxCocoa.framework; sourceTree = ""; }; 129 | 98D95A3F204F7E9A00159C45 /* RxStarscream_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxStarscream_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | 98D95A41204F7E9A00159C45 /* RxStarscream_macOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxStarscream_macOS.h; sourceTree = ""; }; 131 | 98D95A42204F7E9B00159C45 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 132 | 98D95A47204F7E9B00159C45 /* RxStarscream-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "RxStarscream-macOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 133 | 98D95A4C204F7E9B00159C45 /* RxStarscream_macOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxStarscream_macOSTests.swift; sourceTree = ""; }; 134 | 98D95A4E204F7E9B00159C45 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 135 | 98D95A58204F7EDE00159C45 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/Mac/RxSwift.framework; sourceTree = ""; }; 136 | 98D95A5A204F7EEE00159C45 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/Mac/RxCocoa.framework; sourceTree = ""; }; 137 | 98D95A5C204F7EF800159C45 /* Starscream.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Starscream.framework; path = Carthage/Build/Mac/Starscream.framework; sourceTree = ""; }; 138 | 98D95A64204F83AE00159C45 /* RxTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxTest.framework; path = Carthage/Build/Mac/RxTest.framework; sourceTree = ""; }; 139 | BEF314401E86D13C00C15DD4 /* RxStarscreamTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxStarscreamTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 140 | BEF314421E86D13C00C15DD4 /* RxStarscreamTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxStarscreamTests.swift; sourceTree = ""; }; 141 | BEF314441E86D13C00C15DD4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 142 | BEF3144C1E86DAFA00C15DD4 /* RxTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxTest.framework; path = Carthage/Build/iOS/RxTest.framework; sourceTree = ""; }; 143 | BEF3144E1E86DB0700C15DD4 /* iOS */ = {isa = PBXFileReference; lastKnownFileType = folder; name = iOS; path = Carthage/Build/iOS; sourceTree = ""; }; 144 | E42144A21CFF275E00885498 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = ""; }; 145 | E42144A31CFF275E00885498 /* Starscream.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Starscream.framework; path = Carthage/Build/iOS/Starscream.framework; sourceTree = ""; }; 146 | E42144DA1CFF385E00885498 /* SampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 147 | E42144DC1CFF385E00885498 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 148 | E42144DE1CFF385E00885498 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 149 | E42144E11CFF385E00885498 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 150 | E42144E31CFF385E00885498 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 151 | E42144E61CFF385E00885498 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 152 | E42144E81CFF385E00885498 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 153 | E46D00261CFF22200054DF1F /* RxStarscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxStarscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 154 | E46D00291CFF22200054DF1F /* RxStarscream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxStarscream.h; sourceTree = ""; }; 155 | E46D002B1CFF22200054DF1F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 156 | E46D00311CFF22760054DF1F /* RxStarscream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RxStarscream.swift; path = Source/RxStarscream.swift; sourceTree = SOURCE_ROOT; }; 157 | EE32F631227B251800F27FFA /* RxRelay.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxRelay.framework; path = Carthage/Build/iOS/RxRelay.framework; sourceTree = ""; }; 158 | EE32F638227B257600F27FFA /* RxRelay.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxRelay.framework; path = Carthage/Build/Mac/RxRelay.framework; sourceTree = ""; }; 159 | /* End PBXFileReference section */ 160 | 161 | /* Begin PBXFrameworksBuildPhase section */ 162 | 98D95A3B204F7E9A00159C45 /* Frameworks */ = { 163 | isa = PBXFrameworksBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | 98D95A5F204F7FC300159C45 /* RxCocoa.framework in Frameworks */, 167 | EE32F639227B257600F27FFA /* RxRelay.framework in Frameworks */, 168 | 98D95A59204F7EDF00159C45 /* RxSwift.framework in Frameworks */, 169 | 98D95A5D204F7EF800159C45 /* Starscream.framework in Frameworks */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | 98D95A44204F7E9B00159C45 /* Frameworks */ = { 174 | isa = PBXFrameworksBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | 98D95A62204F839A00159C45 /* RxCocoa.framework in Frameworks */, 178 | EE32F63A227B258500F27FFA /* RxRelay.framework in Frameworks */, 179 | 98D95A48204F7E9B00159C45 /* RxStarscream_macOS.framework in Frameworks */, 180 | 98D95A63204F83A400159C45 /* RxSwift.framework in Frameworks */, 181 | 98D95A65204F83AE00159C45 /* RxTest.framework in Frameworks */, 182 | 98D95A67204F85D000159C45 /* Starscream.framework in Frameworks */, 183 | ); 184 | runOnlyForDeploymentPostprocessing = 0; 185 | }; 186 | BEF3143D1E86D13C00C15DD4 /* Frameworks */ = { 187 | isa = PBXFrameworksBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | EE32F640227B28A500F27FFA /* RxRelay.framework in Frameworks */, 191 | BEF314451E86D13C00C15DD4 /* RxStarscream.framework in Frameworks */, 192 | BEF314521E86DB5700C15DD4 /* RxSwift.framework in Frameworks */, 193 | BEF314541E86DB5700C15DD4 /* RxTest.framework in Frameworks */, 194 | BEF314551E86DB5700C15DD4 /* Starscream.framework in Frameworks */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | E42144D71CFF385E00885498 /* Frameworks */ = { 199 | isa = PBXFrameworksBuildPhase; 200 | buildActionMask = 2147483647; 201 | files = ( 202 | 0B4DAAC81E04980000ECDBF9 /* RxCocoa.framework in Frameworks */, 203 | EE32F633227B253200F27FFA /* RxRelay.framework in Frameworks */, 204 | E42144ED1CFF3AC600885498 /* RxSwift.framework in Frameworks */, 205 | E42144EE1CFF3AC900885498 /* Starscream.framework in Frameworks */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | E46D00221CFF22200054DF1F /* Frameworks */ = { 210 | isa = PBXFrameworksBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | 0B4DAAC71E0497BC00ECDBF9 /* RxCocoa.framework in Frameworks */, 214 | EE32F632227B251800F27FFA /* RxRelay.framework in Frameworks */, 215 | E42144A41CFF275E00885498 /* RxSwift.framework in Frameworks */, 216 | E42144A51CFF275E00885498 /* Starscream.framework in Frameworks */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | /* End PBXFrameworksBuildPhase section */ 221 | 222 | /* Begin PBXGroup section */ 223 | 98D95A40204F7E9A00159C45 /* RxStarscream-macOS */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | 98D95A42204F7E9B00159C45 /* Info.plist */, 227 | 98D95A41204F7E9A00159C45 /* RxStarscream_macOS.h */, 228 | ); 229 | path = "RxStarscream-macOS"; 230 | sourceTree = ""; 231 | }; 232 | 98D95A4B204F7E9B00159C45 /* RxStarscream-macOSTests */ = { 233 | isa = PBXGroup; 234 | children = ( 235 | 98D95A4E204F7E9B00159C45 /* Info.plist */, 236 | 98D95A4C204F7E9B00159C45 /* RxStarscream_macOSTests.swift */, 237 | ); 238 | path = "RxStarscream-macOSTests"; 239 | sourceTree = ""; 240 | }; 241 | BEF314411E86D13C00C15DD4 /* RxStarscreamTests */ = { 242 | isa = PBXGroup; 243 | children = ( 244 | BEF314441E86D13C00C15DD4 /* Info.plist */, 245 | BEF314421E86D13C00C15DD4 /* RxStarscreamTests.swift */, 246 | ); 247 | path = RxStarscreamTests; 248 | sourceTree = ""; 249 | }; 250 | BEF3144B1E86DAF900C15DD4 /* Frameworks */ = { 251 | isa = PBXGroup; 252 | children = ( 253 | BEF3144E1E86DB0700C15DD4 /* iOS */, 254 | 98D95A5A204F7EEE00159C45 /* RxCocoa.framework */, 255 | EE32F638227B257600F27FFA /* RxRelay.framework */, 256 | 98D95A58204F7EDE00159C45 /* RxSwift.framework */, 257 | 98D95A64204F83AE00159C45 /* RxTest.framework */, 258 | 98D95A5C204F7EF800159C45 /* Starscream.framework */, 259 | ); 260 | name = Frameworks; 261 | sourceTree = ""; 262 | }; 263 | E42144A61CFF27C800885498 /* Dependency Frameworks */ = { 264 | isa = PBXGroup; 265 | children = ( 266 | 0B4DAAC61E0497BC00ECDBF9 /* RxCocoa.framework */, 267 | EE32F631227B251800F27FFA /* RxRelay.framework */, 268 | E42144A21CFF275E00885498 /* RxSwift.framework */, 269 | BEF3144C1E86DAFA00C15DD4 /* RxTest.framework */, 270 | E42144A31CFF275E00885498 /* Starscream.framework */, 271 | ); 272 | name = "Dependency Frameworks"; 273 | sourceTree = ""; 274 | }; 275 | E42144DB1CFF385E00885498 /* SampleApp */ = { 276 | isa = PBXGroup; 277 | children = ( 278 | E42144DC1CFF385E00885498 /* AppDelegate.swift */, 279 | E42144E31CFF385E00885498 /* Assets.xcassets */, 280 | E42144E81CFF385E00885498 /* Info.plist */, 281 | E42144E51CFF385E00885498 /* LaunchScreen.storyboard */, 282 | E42144E01CFF385E00885498 /* Main.storyboard */, 283 | E42144DE1CFF385E00885498 /* ViewController.swift */, 284 | ); 285 | path = SampleApp; 286 | sourceTree = ""; 287 | }; 288 | E46D001C1CFF22200054DF1F = { 289 | isa = PBXGroup; 290 | children = ( 291 | E46D00281CFF22200054DF1F /* RxStarscream */, 292 | E42144DB1CFF385E00885498 /* SampleApp */, 293 | BEF314411E86D13C00C15DD4 /* RxStarscreamTests */, 294 | 98D95A40204F7E9A00159C45 /* RxStarscream-macOS */, 295 | 98D95A4B204F7E9B00159C45 /* RxStarscream-macOSTests */, 296 | E46D00271CFF22200054DF1F /* Products */, 297 | E42144A61CFF27C800885498 /* Dependency Frameworks */, 298 | BEF3144B1E86DAF900C15DD4 /* Frameworks */, 299 | ); 300 | sourceTree = ""; 301 | }; 302 | E46D00271CFF22200054DF1F /* Products */ = { 303 | isa = PBXGroup; 304 | children = ( 305 | 98D95A47204F7E9B00159C45 /* RxStarscream-macOSTests.xctest */, 306 | E46D00261CFF22200054DF1F /* RxStarscream.framework */, 307 | 98D95A3F204F7E9A00159C45 /* RxStarscream_macOS.framework */, 308 | BEF314401E86D13C00C15DD4 /* RxStarscreamTests.xctest */, 309 | E42144DA1CFF385E00885498 /* SampleApp.app */, 310 | ); 311 | name = Products; 312 | sourceTree = ""; 313 | }; 314 | E46D00281CFF22200054DF1F /* RxStarscream */ = { 315 | isa = PBXGroup; 316 | children = ( 317 | E46D002B1CFF22200054DF1F /* Info.plist */, 318 | E46D00291CFF22200054DF1F /* RxStarscream.h */, 319 | E46D00311CFF22760054DF1F /* RxStarscream.swift */, 320 | ); 321 | path = RxStarscream; 322 | sourceTree = ""; 323 | }; 324 | /* End PBXGroup section */ 325 | 326 | /* Begin PBXHeadersBuildPhase section */ 327 | 98D95A3C204F7E9A00159C45 /* Headers */ = { 328 | isa = PBXHeadersBuildPhase; 329 | buildActionMask = 2147483647; 330 | files = ( 331 | 98D95A56204F7EB400159C45 /* RxStarscream_macOS.h in Headers */, 332 | ); 333 | runOnlyForDeploymentPostprocessing = 0; 334 | }; 335 | E46D00231CFF22200054DF1F /* Headers */ = { 336 | isa = PBXHeadersBuildPhase; 337 | buildActionMask = 2147483647; 338 | files = ( 339 | E46D002A1CFF22200054DF1F /* RxStarscream.h in Headers */, 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | }; 343 | /* End PBXHeadersBuildPhase section */ 344 | 345 | /* Begin PBXNativeTarget section */ 346 | 98D95A3E204F7E9A00159C45 /* RxStarscream-macOS */ = { 347 | isa = PBXNativeTarget; 348 | buildConfigurationList = 98D95A54204F7E9B00159C45 /* Build configuration list for PBXNativeTarget "RxStarscream-macOS" */; 349 | buildPhases = ( 350 | 98D95A3A204F7E9A00159C45 /* Sources */, 351 | 98D95A3B204F7E9A00159C45 /* Frameworks */, 352 | 98D95A3C204F7E9A00159C45 /* Headers */, 353 | 98D95A3D204F7E9A00159C45 /* Resources */, 354 | ); 355 | buildRules = ( 356 | ); 357 | dependencies = ( 358 | ); 359 | name = "RxStarscream-macOS"; 360 | productName = "RxStarscream-macOS"; 361 | productReference = 98D95A3F204F7E9A00159C45 /* RxStarscream_macOS.framework */; 362 | productType = "com.apple.product-type.framework"; 363 | }; 364 | 98D95A46204F7E9B00159C45 /* RxStarscream-macOSTests */ = { 365 | isa = PBXNativeTarget; 366 | buildConfigurationList = 98D95A55204F7E9B00159C45 /* Build configuration list for PBXNativeTarget "RxStarscream-macOSTests" */; 367 | buildPhases = ( 368 | 98D95A43204F7E9B00159C45 /* Sources */, 369 | 98D95A44204F7E9B00159C45 /* Frameworks */, 370 | 98D95A45204F7E9B00159C45 /* Resources */, 371 | 98D95A68204F874100159C45 /* CopyFiles */, 372 | ); 373 | buildRules = ( 374 | ); 375 | dependencies = ( 376 | 98D95A4A204F7E9B00159C45 /* PBXTargetDependency */, 377 | ); 378 | name = "RxStarscream-macOSTests"; 379 | productName = "RxStarscream-macOSTests"; 380 | productReference = 98D95A47204F7E9B00159C45 /* RxStarscream-macOSTests.xctest */; 381 | productType = "com.apple.product-type.bundle.unit-test"; 382 | }; 383 | BEF3143F1E86D13C00C15DD4 /* RxStarscreamTests */ = { 384 | isa = PBXNativeTarget; 385 | buildConfigurationList = BEF3144A1E86D13C00C15DD4 /* Build configuration list for PBXNativeTarget "RxStarscreamTests" */; 386 | buildPhases = ( 387 | BEF3143C1E86D13C00C15DD4 /* Sources */, 388 | BEF3143D1E86D13C00C15DD4 /* Frameworks */, 389 | BEF3143E1E86D13C00C15DD4 /* Resources */, 390 | BEF314561E875D5F00C15DD4 /* CopyFiles */, 391 | ); 392 | buildRules = ( 393 | ); 394 | dependencies = ( 395 | BEF314471E86D13C00C15DD4 /* PBXTargetDependency */, 396 | ); 397 | name = RxStarscreamTests; 398 | productName = RxStarscreamTests; 399 | productReference = BEF314401E86D13C00C15DD4 /* RxStarscreamTests.xctest */; 400 | productType = "com.apple.product-type.bundle.unit-test"; 401 | }; 402 | E42144D91CFF385E00885498 /* SampleApp */ = { 403 | isa = PBXNativeTarget; 404 | buildConfigurationList = E42144EB1CFF385E00885498 /* Build configuration list for PBXNativeTarget "SampleApp" */; 405 | buildPhases = ( 406 | E42144D61CFF385E00885498 /* Sources */, 407 | E42144D71CFF385E00885498 /* Frameworks */, 408 | E42144D81CFF385E00885498 /* Resources */, 409 | E402203D1CFF3C6900C5A874 /* Embed Frameworks */, 410 | ); 411 | buildRules = ( 412 | ); 413 | dependencies = ( 414 | ); 415 | name = SampleApp; 416 | productName = SampleApp; 417 | productReference = E42144DA1CFF385E00885498 /* SampleApp.app */; 418 | productType = "com.apple.product-type.application"; 419 | }; 420 | E46D00251CFF22200054DF1F /* RxStarscream */ = { 421 | isa = PBXNativeTarget; 422 | buildConfigurationList = E46D002E1CFF22200054DF1F /* Build configuration list for PBXNativeTarget "RxStarscream" */; 423 | buildPhases = ( 424 | E46D00211CFF22200054DF1F /* Sources */, 425 | E46D00221CFF22200054DF1F /* Frameworks */, 426 | E46D00231CFF22200054DF1F /* Headers */, 427 | E46D00241CFF22200054DF1F /* Resources */, 428 | ); 429 | buildRules = ( 430 | ); 431 | dependencies = ( 432 | ); 433 | name = RxStarscream; 434 | productName = RxStarscream; 435 | productReference = E46D00261CFF22200054DF1F /* RxStarscream.framework */; 436 | productType = "com.apple.product-type.framework"; 437 | }; 438 | /* End PBXNativeTarget section */ 439 | 440 | /* Begin PBXProject section */ 441 | E46D001D1CFF22200054DF1F /* Project object */ = { 442 | isa = PBXProject; 443 | attributes = { 444 | LastSwiftUpdateCheck = 0920; 445 | LastUpgradeCheck = 1000; 446 | ORGANIZATIONNAME = "Guy Kahlon"; 447 | TargetAttributes = { 448 | 98D95A3E204F7E9A00159C45 = { 449 | CreatedOnToolsVersion = 9.2; 450 | ProvisioningStyle = Automatic; 451 | }; 452 | 98D95A46204F7E9B00159C45 = { 453 | CreatedOnToolsVersion = 9.2; 454 | LastSwiftMigration = 1000; 455 | ProvisioningStyle = Automatic; 456 | }; 457 | BEF3143F1E86D13C00C15DD4 = { 458 | CreatedOnToolsVersion = 8.2.1; 459 | DevelopmentTeam = 7GE4Q65N57; 460 | ProvisioningStyle = Automatic; 461 | }; 462 | E42144D91CFF385E00885498 = { 463 | CreatedOnToolsVersion = 7.3; 464 | DevelopmentTeam = 7GE4Q65N57; 465 | LastSwiftMigration = 0920; 466 | ProvisioningStyle = Automatic; 467 | }; 468 | E46D00251CFF22200054DF1F = { 469 | CreatedOnToolsVersion = 7.3; 470 | DevelopmentTeam = 7GE4Q65N57; 471 | LastSwiftMigration = 0820; 472 | ProvisioningStyle = Automatic; 473 | }; 474 | }; 475 | }; 476 | buildConfigurationList = E46D00201CFF22200054DF1F /* Build configuration list for PBXProject "RxStarscream" */; 477 | compatibilityVersion = "Xcode 3.2"; 478 | developmentRegion = English; 479 | hasScannedForEncodings = 0; 480 | knownRegions = ( 481 | English, 482 | en, 483 | Base, 484 | ); 485 | mainGroup = E46D001C1CFF22200054DF1F; 486 | productRefGroup = E46D00271CFF22200054DF1F /* Products */; 487 | projectDirPath = ""; 488 | projectRoot = ""; 489 | targets = ( 490 | E46D00251CFF22200054DF1F /* RxStarscream */, 491 | E42144D91CFF385E00885498 /* SampleApp */, 492 | BEF3143F1E86D13C00C15DD4 /* RxStarscreamTests */, 493 | 98D95A3E204F7E9A00159C45 /* RxStarscream-macOS */, 494 | 98D95A46204F7E9B00159C45 /* RxStarscream-macOSTests */, 495 | ); 496 | }; 497 | /* End PBXProject section */ 498 | 499 | /* Begin PBXResourcesBuildPhase section */ 500 | 98D95A3D204F7E9A00159C45 /* Resources */ = { 501 | isa = PBXResourcesBuildPhase; 502 | buildActionMask = 2147483647; 503 | files = ( 504 | ); 505 | runOnlyForDeploymentPostprocessing = 0; 506 | }; 507 | 98D95A45204F7E9B00159C45 /* Resources */ = { 508 | isa = PBXResourcesBuildPhase; 509 | buildActionMask = 2147483647; 510 | files = ( 511 | ); 512 | runOnlyForDeploymentPostprocessing = 0; 513 | }; 514 | BEF3143E1E86D13C00C15DD4 /* Resources */ = { 515 | isa = PBXResourcesBuildPhase; 516 | buildActionMask = 2147483647; 517 | files = ( 518 | ); 519 | runOnlyForDeploymentPostprocessing = 0; 520 | }; 521 | E42144D81CFF385E00885498 /* Resources */ = { 522 | isa = PBXResourcesBuildPhase; 523 | buildActionMask = 2147483647; 524 | files = ( 525 | E42144E41CFF385E00885498 /* Assets.xcassets in Resources */, 526 | E42144E71CFF385E00885498 /* LaunchScreen.storyboard in Resources */, 527 | E42144E21CFF385E00885498 /* Main.storyboard in Resources */, 528 | ); 529 | runOnlyForDeploymentPostprocessing = 0; 530 | }; 531 | E46D00241CFF22200054DF1F /* Resources */ = { 532 | isa = PBXResourcesBuildPhase; 533 | buildActionMask = 2147483647; 534 | files = ( 535 | ); 536 | runOnlyForDeploymentPostprocessing = 0; 537 | }; 538 | /* End PBXResourcesBuildPhase section */ 539 | 540 | /* Begin PBXSourcesBuildPhase section */ 541 | 98D95A3A204F7E9A00159C45 /* Sources */ = { 542 | isa = PBXSourcesBuildPhase; 543 | buildActionMask = 2147483647; 544 | files = ( 545 | 98D95A57204F7EC000159C45 /* RxStarscream.swift in Sources */, 546 | ); 547 | runOnlyForDeploymentPostprocessing = 0; 548 | }; 549 | 98D95A43204F7E9B00159C45 /* Sources */ = { 550 | isa = PBXSourcesBuildPhase; 551 | buildActionMask = 2147483647; 552 | files = ( 553 | 98D95A61204F82BA00159C45 /* RxStarscream_macOSTests.swift in Sources */, 554 | ); 555 | runOnlyForDeploymentPostprocessing = 0; 556 | }; 557 | BEF3143C1E86D13C00C15DD4 /* Sources */ = { 558 | isa = PBXSourcesBuildPhase; 559 | buildActionMask = 2147483647; 560 | files = ( 561 | BEF314431E86D13C00C15DD4 /* RxStarscreamTests.swift in Sources */, 562 | ); 563 | runOnlyForDeploymentPostprocessing = 0; 564 | }; 565 | E42144D61CFF385E00885498 /* Sources */ = { 566 | isa = PBXSourcesBuildPhase; 567 | buildActionMask = 2147483647; 568 | files = ( 569 | E42144DD1CFF385E00885498 /* AppDelegate.swift in Sources */, 570 | E42144EC1CFF395500885498 /* RxStarscream.swift in Sources */, 571 | E42144DF1CFF385E00885498 /* ViewController.swift in Sources */, 572 | ); 573 | runOnlyForDeploymentPostprocessing = 0; 574 | }; 575 | E46D00211CFF22200054DF1F /* Sources */ = { 576 | isa = PBXSourcesBuildPhase; 577 | buildActionMask = 2147483647; 578 | files = ( 579 | E46D00321CFF22760054DF1F /* RxStarscream.swift in Sources */, 580 | ); 581 | runOnlyForDeploymentPostprocessing = 0; 582 | }; 583 | /* End PBXSourcesBuildPhase section */ 584 | 585 | /* Begin PBXTargetDependency section */ 586 | 98D95A4A204F7E9B00159C45 /* PBXTargetDependency */ = { 587 | isa = PBXTargetDependency; 588 | target = 98D95A3E204F7E9A00159C45 /* RxStarscream-macOS */; 589 | targetProxy = 98D95A49204F7E9B00159C45 /* PBXContainerItemProxy */; 590 | }; 591 | BEF314471E86D13C00C15DD4 /* PBXTargetDependency */ = { 592 | isa = PBXTargetDependency; 593 | target = E46D00251CFF22200054DF1F /* RxStarscream */; 594 | targetProxy = BEF314461E86D13C00C15DD4 /* PBXContainerItemProxy */; 595 | }; 596 | /* End PBXTargetDependency section */ 597 | 598 | /* Begin PBXVariantGroup section */ 599 | E42144E01CFF385E00885498 /* Main.storyboard */ = { 600 | isa = PBXVariantGroup; 601 | children = ( 602 | E42144E11CFF385E00885498 /* Base */, 603 | ); 604 | name = Main.storyboard; 605 | sourceTree = ""; 606 | }; 607 | E42144E51CFF385E00885498 /* LaunchScreen.storyboard */ = { 608 | isa = PBXVariantGroup; 609 | children = ( 610 | E42144E61CFF385E00885498 /* Base */, 611 | ); 612 | name = LaunchScreen.storyboard; 613 | sourceTree = ""; 614 | }; 615 | /* End PBXVariantGroup section */ 616 | 617 | /* Begin XCBuildConfiguration section */ 618 | 98D95A50204F7E9B00159C45 /* Debug */ = { 619 | isa = XCBuildConfiguration; 620 | buildSettings = { 621 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 622 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 623 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 624 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 625 | CODE_SIGN_IDENTITY = "-"; 626 | CODE_SIGN_STYLE = Automatic; 627 | COMBINE_HIDPI_IMAGES = YES; 628 | DEFINES_MODULE = YES; 629 | DYLIB_COMPATIBILITY_VERSION = 1; 630 | DYLIB_CURRENT_VERSION = 1; 631 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 632 | FRAMEWORK_SEARCH_PATHS = ( 633 | "$(inherited)", 634 | "$(PROJECT_DIR)/Carthage/Build/Mac", 635 | ); 636 | FRAMEWORK_VERSION = A; 637 | GCC_C_LANGUAGE_STANDARD = gnu11; 638 | INFOPLIST_FILE = "RxStarscream-macOS/Info.plist"; 639 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 640 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 641 | MACOSX_DEPLOYMENT_TARGET = 10.10; 642 | PRODUCT_BUNDLE_IDENTIFIER = "com.RxSwift.RxStarscream-macOS"; 643 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 644 | SDKROOT = macosx; 645 | SKIP_INSTALL = YES; 646 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 647 | SWIFT_VERSION = 5.0; 648 | }; 649 | name = Debug; 650 | }; 651 | 98D95A51204F7E9B00159C45 /* Release */ = { 652 | isa = XCBuildConfiguration; 653 | buildSettings = { 654 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 655 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 656 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 657 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 658 | CODE_SIGN_IDENTITY = "-"; 659 | CODE_SIGN_STYLE = Automatic; 660 | COMBINE_HIDPI_IMAGES = YES; 661 | DEFINES_MODULE = YES; 662 | DYLIB_COMPATIBILITY_VERSION = 1; 663 | DYLIB_CURRENT_VERSION = 1; 664 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 665 | FRAMEWORK_SEARCH_PATHS = ( 666 | "$(inherited)", 667 | "$(PROJECT_DIR)/Carthage/Build/Mac", 668 | ); 669 | FRAMEWORK_VERSION = A; 670 | GCC_C_LANGUAGE_STANDARD = gnu11; 671 | INFOPLIST_FILE = "RxStarscream-macOS/Info.plist"; 672 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 673 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 674 | MACOSX_DEPLOYMENT_TARGET = 10.10; 675 | PRODUCT_BUNDLE_IDENTIFIER = "com.RxSwift.RxStarscream-macOS"; 676 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 677 | SDKROOT = macosx; 678 | SKIP_INSTALL = YES; 679 | SWIFT_VERSION = 5.0; 680 | }; 681 | name = Release; 682 | }; 683 | 98D95A52204F7E9B00159C45 /* Debug */ = { 684 | isa = XCBuildConfiguration; 685 | buildSettings = { 686 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 687 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 688 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 689 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 690 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 691 | CODE_SIGN_IDENTITY = "-"; 692 | CODE_SIGN_STYLE = Automatic; 693 | COMBINE_HIDPI_IMAGES = YES; 694 | FRAMEWORK_SEARCH_PATHS = ( 695 | "$(inherited)", 696 | "$(PROJECT_DIR)/Carthage/Build/Mac", 697 | ); 698 | GCC_C_LANGUAGE_STANDARD = gnu11; 699 | INFOPLIST_FILE = "RxStarscream-macOSTests/Info.plist"; 700 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 701 | MACOSX_DEPLOYMENT_TARGET = 10.12; 702 | PRODUCT_BUNDLE_IDENTIFIER = "com.RxSwift.RxStarscream-macOSTests"; 703 | PRODUCT_NAME = "$(TARGET_NAME)"; 704 | SDKROOT = macosx; 705 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 706 | SWIFT_VERSION = 5.0; 707 | }; 708 | name = Debug; 709 | }; 710 | 98D95A53204F7E9B00159C45 /* Release */ = { 711 | isa = XCBuildConfiguration; 712 | buildSettings = { 713 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 714 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 715 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 716 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 717 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 718 | CODE_SIGN_IDENTITY = "-"; 719 | CODE_SIGN_STYLE = Automatic; 720 | COMBINE_HIDPI_IMAGES = YES; 721 | FRAMEWORK_SEARCH_PATHS = ( 722 | "$(inherited)", 723 | "$(PROJECT_DIR)/Carthage/Build/Mac", 724 | ); 725 | GCC_C_LANGUAGE_STANDARD = gnu11; 726 | INFOPLIST_FILE = "RxStarscream-macOSTests/Info.plist"; 727 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 728 | MACOSX_DEPLOYMENT_TARGET = 10.12; 729 | PRODUCT_BUNDLE_IDENTIFIER = "com.RxSwift.RxStarscream-macOSTests"; 730 | PRODUCT_NAME = "$(TARGET_NAME)"; 731 | SDKROOT = macosx; 732 | SWIFT_VERSION = 5.0; 733 | }; 734 | name = Release; 735 | }; 736 | BEF314481E86D13C00C15DD4 /* Debug */ = { 737 | isa = XCBuildConfiguration; 738 | buildSettings = { 739 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 740 | CLANG_WARN_INFINITE_RECURSION = YES; 741 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 742 | DEVELOPMENT_TEAM = 7GE4Q65N57; 743 | FRAMEWORK_SEARCH_PATHS = ( 744 | "$(inherited)", 745 | "$(PROJECT_DIR)/Carthage/Build/iOS", 746 | ); 747 | INFOPLIST_FILE = RxStarscreamTests/Info.plist; 748 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 749 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 750 | PRODUCT_BUNDLE_IDENTIFIER = com.RxSwift.RxStarscreamTests; 751 | PRODUCT_NAME = "$(TARGET_NAME)"; 752 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 753 | SWIFT_VERSION = 5.0; 754 | }; 755 | name = Debug; 756 | }; 757 | BEF314491E86D13C00C15DD4 /* Release */ = { 758 | isa = XCBuildConfiguration; 759 | buildSettings = { 760 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 761 | CLANG_WARN_INFINITE_RECURSION = YES; 762 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 763 | DEVELOPMENT_TEAM = 7GE4Q65N57; 764 | FRAMEWORK_SEARCH_PATHS = ( 765 | "$(inherited)", 766 | "$(PROJECT_DIR)/Carthage/Build/iOS", 767 | ); 768 | INFOPLIST_FILE = RxStarscreamTests/Info.plist; 769 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 770 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 771 | PRODUCT_BUNDLE_IDENTIFIER = com.RxSwift.RxStarscreamTests; 772 | PRODUCT_NAME = "$(TARGET_NAME)"; 773 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 774 | SWIFT_VERSION = 5.0; 775 | }; 776 | name = Release; 777 | }; 778 | E42144E91CFF385E00885498 /* Debug */ = { 779 | isa = XCBuildConfiguration; 780 | buildSettings = { 781 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 782 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 783 | CODE_SIGN_STYLE = Automatic; 784 | DEVELOPMENT_TEAM = 7GE4Q65N57; 785 | FRAMEWORK_SEARCH_PATHS = ( 786 | "$(inherited)", 787 | "$(PROJECT_DIR)/Carthage/Build/iOS", 788 | ); 789 | INFOPLIST_FILE = SampleApp/Info.plist; 790 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 791 | PRODUCT_BUNDLE_IDENTIFIER = com.RxSwift.SampleApp; 792 | PRODUCT_NAME = "$(TARGET_NAME)"; 793 | PROVISIONING_PROFILE_SPECIFIER = ""; 794 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 795 | SWIFT_VERSION = 5.0; 796 | TARGETED_DEVICE_FAMILY = 1; 797 | }; 798 | name = Debug; 799 | }; 800 | E42144EA1CFF385E00885498 /* Release */ = { 801 | isa = XCBuildConfiguration; 802 | buildSettings = { 803 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 804 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 805 | CODE_SIGN_STYLE = Automatic; 806 | DEVELOPMENT_TEAM = 7GE4Q65N57; 807 | FRAMEWORK_SEARCH_PATHS = ( 808 | "$(inherited)", 809 | "$(PROJECT_DIR)/Carthage/Build/iOS", 810 | ); 811 | INFOPLIST_FILE = SampleApp/Info.plist; 812 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 813 | PRODUCT_BUNDLE_IDENTIFIER = com.RxSwift.SampleApp; 814 | PRODUCT_NAME = "$(TARGET_NAME)"; 815 | PROVISIONING_PROFILE_SPECIFIER = ""; 816 | SWIFT_SWIFT3_OBJC_INFERENCE = Off; 817 | SWIFT_VERSION = 5.0; 818 | TARGETED_DEVICE_FAMILY = 1; 819 | }; 820 | name = Release; 821 | }; 822 | E46D002C1CFF22200054DF1F /* Debug */ = { 823 | isa = XCBuildConfiguration; 824 | buildSettings = { 825 | ALWAYS_SEARCH_USER_PATHS = NO; 826 | CLANG_ANALYZER_NONNULL = YES; 827 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 828 | CLANG_CXX_LIBRARY = "libc++"; 829 | CLANG_ENABLE_MODULES = YES; 830 | CLANG_ENABLE_OBJC_ARC = YES; 831 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 832 | CLANG_WARN_BOOL_CONVERSION = YES; 833 | CLANG_WARN_COMMA = YES; 834 | CLANG_WARN_CONSTANT_CONVERSION = YES; 835 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 836 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 837 | CLANG_WARN_EMPTY_BODY = YES; 838 | CLANG_WARN_ENUM_CONVERSION = YES; 839 | CLANG_WARN_INFINITE_RECURSION = YES; 840 | CLANG_WARN_INT_CONVERSION = YES; 841 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 842 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 843 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 844 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 845 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 846 | CLANG_WARN_STRICT_PROTOTYPES = YES; 847 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 848 | CLANG_WARN_UNREACHABLE_CODE = YES; 849 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 850 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 851 | COPY_PHASE_STRIP = NO; 852 | CURRENT_PROJECT_VERSION = 1; 853 | DEBUG_INFORMATION_FORMAT = dwarf; 854 | ENABLE_STRICT_OBJC_MSGSEND = YES; 855 | ENABLE_TESTABILITY = YES; 856 | GCC_C_LANGUAGE_STANDARD = gnu99; 857 | GCC_DYNAMIC_NO_PIC = NO; 858 | GCC_NO_COMMON_BLOCKS = YES; 859 | GCC_OPTIMIZATION_LEVEL = 0; 860 | GCC_PREPROCESSOR_DEFINITIONS = ( 861 | "DEBUG=1", 862 | "$(inherited)", 863 | ); 864 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 865 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 866 | GCC_WARN_UNDECLARED_SELECTOR = YES; 867 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 868 | GCC_WARN_UNUSED_FUNCTION = YES; 869 | GCC_WARN_UNUSED_VARIABLE = YES; 870 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 871 | MACOSX_DEPLOYMENT_TARGET = 10.10; 872 | MTL_ENABLE_DEBUG_INFO = YES; 873 | ONLY_ACTIVE_ARCH = YES; 874 | SDKROOT = iphoneos; 875 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 876 | SWIFT_VERSION = 4.2; 877 | TARGETED_DEVICE_FAMILY = "1,2"; 878 | VERSIONING_SYSTEM = "apple-generic"; 879 | VERSION_INFO_PREFIX = ""; 880 | }; 881 | name = Debug; 882 | }; 883 | E46D002D1CFF22200054DF1F /* Release */ = { 884 | isa = XCBuildConfiguration; 885 | buildSettings = { 886 | ALWAYS_SEARCH_USER_PATHS = NO; 887 | CLANG_ANALYZER_NONNULL = YES; 888 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 889 | CLANG_CXX_LIBRARY = "libc++"; 890 | CLANG_ENABLE_MODULES = YES; 891 | CLANG_ENABLE_OBJC_ARC = YES; 892 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 893 | CLANG_WARN_BOOL_CONVERSION = YES; 894 | CLANG_WARN_COMMA = YES; 895 | CLANG_WARN_CONSTANT_CONVERSION = YES; 896 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 897 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 898 | CLANG_WARN_EMPTY_BODY = YES; 899 | CLANG_WARN_ENUM_CONVERSION = YES; 900 | CLANG_WARN_INFINITE_RECURSION = YES; 901 | CLANG_WARN_INT_CONVERSION = YES; 902 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 903 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 904 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 905 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 906 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 907 | CLANG_WARN_STRICT_PROTOTYPES = YES; 908 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 909 | CLANG_WARN_UNREACHABLE_CODE = YES; 910 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 911 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 912 | COPY_PHASE_STRIP = NO; 913 | CURRENT_PROJECT_VERSION = 1; 914 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 915 | ENABLE_NS_ASSERTIONS = NO; 916 | ENABLE_STRICT_OBJC_MSGSEND = YES; 917 | GCC_C_LANGUAGE_STANDARD = gnu99; 918 | GCC_NO_COMMON_BLOCKS = YES; 919 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 920 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 921 | GCC_WARN_UNDECLARED_SELECTOR = YES; 922 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 923 | GCC_WARN_UNUSED_FUNCTION = YES; 924 | GCC_WARN_UNUSED_VARIABLE = YES; 925 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 926 | MACOSX_DEPLOYMENT_TARGET = 10.10; 927 | MTL_ENABLE_DEBUG_INFO = NO; 928 | SDKROOT = iphoneos; 929 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 930 | SWIFT_VERSION = 4.2; 931 | TARGETED_DEVICE_FAMILY = "1,2"; 932 | VALIDATE_PRODUCT = YES; 933 | VERSIONING_SYSTEM = "apple-generic"; 934 | VERSION_INFO_PREFIX = ""; 935 | }; 936 | name = Release; 937 | }; 938 | E46D002F1CFF22200054DF1F /* Debug */ = { 939 | isa = XCBuildConfiguration; 940 | buildSettings = { 941 | CLANG_ENABLE_MODULES = YES; 942 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 943 | CODE_SIGN_STYLE = Automatic; 944 | DEFINES_MODULE = YES; 945 | DEVELOPMENT_TEAM = 7GE4Q65N57; 946 | DYLIB_COMPATIBILITY_VERSION = 1; 947 | DYLIB_CURRENT_VERSION = 1; 948 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 949 | FRAMEWORK_SEARCH_PATHS = ( 950 | "$(inherited)", 951 | "$(PROJECT_DIR)/Carthage/Build/iOS", 952 | ); 953 | INFOPLIST_FILE = RxStarscream/Info.plist; 954 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 955 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 956 | PRODUCT_BUNDLE_IDENTIFIER = com.RxSwift.RxStarscream; 957 | PRODUCT_NAME = "$(TARGET_NAME)"; 958 | PROVISIONING_PROFILE_SPECIFIER = ""; 959 | SKIP_INSTALL = YES; 960 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 961 | SWIFT_VERSION = 5.0; 962 | }; 963 | name = Debug; 964 | }; 965 | E46D00301CFF22200054DF1F /* Release */ = { 966 | isa = XCBuildConfiguration; 967 | buildSettings = { 968 | CLANG_ENABLE_MODULES = YES; 969 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 970 | CODE_SIGN_STYLE = Automatic; 971 | DEFINES_MODULE = YES; 972 | DEVELOPMENT_TEAM = 7GE4Q65N57; 973 | DYLIB_COMPATIBILITY_VERSION = 1; 974 | DYLIB_CURRENT_VERSION = 1; 975 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 976 | FRAMEWORK_SEARCH_PATHS = ( 977 | "$(inherited)", 978 | "$(PROJECT_DIR)/Carthage/Build/iOS", 979 | ); 980 | INFOPLIST_FILE = RxStarscream/Info.plist; 981 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 982 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 983 | PRODUCT_BUNDLE_IDENTIFIER = com.RxSwift.RxStarscream; 984 | PRODUCT_NAME = "$(TARGET_NAME)"; 985 | PROVISIONING_PROFILE_SPECIFIER = ""; 986 | SKIP_INSTALL = YES; 987 | SWIFT_VERSION = 5.0; 988 | }; 989 | name = Release; 990 | }; 991 | /* End XCBuildConfiguration section */ 992 | 993 | /* Begin XCConfigurationList section */ 994 | 98D95A54204F7E9B00159C45 /* Build configuration list for PBXNativeTarget "RxStarscream-macOS" */ = { 995 | isa = XCConfigurationList; 996 | buildConfigurations = ( 997 | 98D95A50204F7E9B00159C45 /* Debug */, 998 | 98D95A51204F7E9B00159C45 /* Release */, 999 | ); 1000 | defaultConfigurationIsVisible = 0; 1001 | defaultConfigurationName = Release; 1002 | }; 1003 | 98D95A55204F7E9B00159C45 /* Build configuration list for PBXNativeTarget "RxStarscream-macOSTests" */ = { 1004 | isa = XCConfigurationList; 1005 | buildConfigurations = ( 1006 | 98D95A52204F7E9B00159C45 /* Debug */, 1007 | 98D95A53204F7E9B00159C45 /* Release */, 1008 | ); 1009 | defaultConfigurationIsVisible = 0; 1010 | defaultConfigurationName = Release; 1011 | }; 1012 | BEF3144A1E86D13C00C15DD4 /* Build configuration list for PBXNativeTarget "RxStarscreamTests" */ = { 1013 | isa = XCConfigurationList; 1014 | buildConfigurations = ( 1015 | BEF314481E86D13C00C15DD4 /* Debug */, 1016 | BEF314491E86D13C00C15DD4 /* Release */, 1017 | ); 1018 | defaultConfigurationIsVisible = 0; 1019 | defaultConfigurationName = Release; 1020 | }; 1021 | E42144EB1CFF385E00885498 /* Build configuration list for PBXNativeTarget "SampleApp" */ = { 1022 | isa = XCConfigurationList; 1023 | buildConfigurations = ( 1024 | E42144E91CFF385E00885498 /* Debug */, 1025 | E42144EA1CFF385E00885498 /* Release */, 1026 | ); 1027 | defaultConfigurationIsVisible = 0; 1028 | defaultConfigurationName = Release; 1029 | }; 1030 | E46D00201CFF22200054DF1F /* Build configuration list for PBXProject "RxStarscream" */ = { 1031 | isa = XCConfigurationList; 1032 | buildConfigurations = ( 1033 | E46D002C1CFF22200054DF1F /* Debug */, 1034 | E46D002D1CFF22200054DF1F /* Release */, 1035 | ); 1036 | defaultConfigurationIsVisible = 0; 1037 | defaultConfigurationName = Release; 1038 | }; 1039 | E46D002E1CFF22200054DF1F /* Build configuration list for PBXNativeTarget "RxStarscream" */ = { 1040 | isa = XCConfigurationList; 1041 | buildConfigurations = ( 1042 | E46D002F1CFF22200054DF1F /* Debug */, 1043 | E46D00301CFF22200054DF1F /* Release */, 1044 | ); 1045 | defaultConfigurationIsVisible = 0; 1046 | defaultConfigurationName = Release; 1047 | }; 1048 | /* End XCConfigurationList section */ 1049 | }; 1050 | rootObject = E46D001D1CFF22200054DF1F /* Project object */; 1051 | } 1052 | -------------------------------------------------------------------------------- /RxStarscream.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RxStarscream.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RxStarscream.xcodeproj/xcshareddata/xcschemes/RxStarscream-macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /RxStarscream.xcodeproj/xcshareddata/xcschemes/RxStarscream.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /RxStarscream/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /RxStarscream/RxStarscream.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guy Kahlon. 3 | // 4 | 5 | #import 6 | 7 | //! Project version number for RxStarscream. 8 | FOUNDATION_EXPORT double RxStarscreamVersionNumber; 9 | 10 | //! Project version string for RxStarscream. 11 | FOUNDATION_EXPORT const unsigned char RxStarscreamVersionString[]; 12 | 13 | // In this header, you should import all the public headers of your framework using statements like #import 14 | 15 | 16 | -------------------------------------------------------------------------------- /RxStarscreamTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /RxStarscreamTests/RxStarscreamTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxStarscreamTests.swift 3 | // RxStarscreamTests 4 | // 5 | // Created by Cezary Kopacz on 25/03/2017. 6 | // Copyright © 2017 Guy Kahlon. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import RxTest 12 | import Starscream 13 | import RxStarscream 14 | 15 | extension WebSocketEvent: Equatable { } 16 | 17 | public func ==(lhs: WebSocketEvent, rhs: WebSocketEvent) -> Bool { 18 | switch (lhs, rhs) { 19 | case (.connected, .connected): 20 | return true 21 | case (.disconnected(let lhsError), .disconnected(let rhsError)): 22 | return lhsError?.localizedDescription == rhsError?.localizedDescription 23 | case (.message(let lhsMsg), .message(let rhsMsg)): 24 | return lhsMsg == rhsMsg 25 | case (.data(let lhsData), .data(let rhsData)): 26 | return lhsData == rhsData 27 | case (.pong, .pong): 28 | return true 29 | default: 30 | return false 31 | } 32 | } 33 | 34 | class RxStarscreamTests: XCTestCase { 35 | 36 | private var connectedObserver: TestableObserver! 37 | private var pongObserver: TestableObserver! 38 | private var responseObserver: TestableObserver! 39 | private var socket: WebSocket! 40 | 41 | let disposeBag = DisposeBag() 42 | 43 | override func setUp() { 44 | super.setUp() 45 | 46 | socket = WebSocket(url: URL(string: "wss://echo.websocket.org")!) 47 | continueAfterFailure = false 48 | } 49 | 50 | func testConnection() { 51 | let scheduler = TestScheduler(initialClock: 0) 52 | connectedObserver = scheduler.createObserver(Bool.self) 53 | 54 | let connected = socket.rx.connected.share(replay: 1) 55 | connected.subscribe(onNext: { [unowned self] _ in 56 | self.socket.disconnect() 57 | }).disposed(by: disposeBag) 58 | 59 | socket.rx.connected 60 | .subscribe(connectedObserver) 61 | .disposed(by: disposeBag) 62 | 63 | XCTAssertTrue(socket.delegate != nil, "delegate should be set") 64 | 65 | socket.delegate!.websocketDidConnect(socket: socket) 66 | socket.delegate!.websocketDidDisconnect(socket: socket, error: nil) 67 | 68 | XCTAssertEqual(self.connectedObserver.events.count, 2) 69 | XCTAssertEqual(self.connectedObserver.events[0].value.element!, true) 70 | XCTAssertEqual(self.connectedObserver.events[1].value.element!, false) 71 | } 72 | 73 | func testPongMessage() { 74 | let scheduler = TestScheduler(initialClock: 0) 75 | pongObserver = scheduler.createObserver(WebSocketEvent.self) 76 | 77 | socket.rx.response 78 | .subscribe(pongObserver) 79 | .disposed(by: disposeBag) 80 | 81 | XCTAssertTrue(socket.pongDelegate != nil, "pongDelegate should be set") 82 | 83 | socket.pongDelegate!.websocketDidReceivePong(socket: socket, data: Data()) 84 | 85 | XCTAssertEqual(self.pongObserver.events.count, 1) 86 | XCTAssertEqual(self.pongObserver.events[0].value.element!, WebSocketEvent.pong) 87 | } 88 | 89 | func testMessageResponse() { 90 | let sentMessage = "Hello" 91 | 92 | let scheduler = TestScheduler(initialClock: 0) 93 | responseObserver = scheduler.createObserver(WebSocketEvent.self) 94 | 95 | socket.rx.response 96 | .subscribe(responseObserver) 97 | .disposed(by: disposeBag) 98 | 99 | XCTAssertTrue(socket.delegate != nil, "delegate should be set") 100 | 101 | socket.delegate!.websocketDidReceiveMessage(socket: socket, text: sentMessage) 102 | 103 | XCTAssertEqual(self.responseObserver.events.count, 1) 104 | XCTAssertEqual(WebSocketEvent.message(sentMessage), self.responseObserver.events[0].value.element!) 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /SampleApp/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guy Kahlon. 3 | // 4 | 5 | import UIKit 6 | 7 | @UIApplicationMain 8 | class AppDelegate: UIResponder, UIApplicationDelegate { 9 | 10 | var window: UIWindow? 11 | } 12 | -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "RxStarscreamIcon40.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "RxStarscreamIcon60.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "iPhone_Settings_iOS5-9_29pt@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "iPhone_Settings_iOS5-9_29pt@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "iPhone_Spotlight_iOS7-9_40pt@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "iPhone_Spotlight_iOS7-9_40pt@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "iPhone_App_iOS7-9_60pt@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "iPhone_App_iOS7-9_60pt@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "1024x1024", 53 | "idiom" : "ios-marketing", 54 | "filename" : "RxStarscream1024.png", 55 | "scale" : "1x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/RxStarscream1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/RxStarscream1024.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/RxStarscreamIcon40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/RxStarscreamIcon40.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/RxStarscreamIcon60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/RxStarscreamIcon60.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_App_iOS7-9_60pt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_App_iOS7-9_60pt@2x.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_App_iOS7-9_60pt@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_App_iOS7-9_60pt@3x.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_iOS5-9_29pt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_iOS5-9_29pt@2x.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_iOS5-9_29pt@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Settings_iOS5-9_29pt@3x.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_iOS7-9_40pt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_iOS7-9_40pt@2x.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_iOS7-9_40pt@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/AppIcon.appiconset/iPhone_Spotlight_iOS7-9_40pt@3x.png -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/RxStarscreamIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "RxStarscreamIcon.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /SampleApp/Assets.xcassets/RxStarscreamIcon.imageset/RxStarscreamIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxStarscream/295d44f485ad9cf74c5a2821dd76870ca2a44cd3/SampleApp/Assets.xcassets/RxStarscreamIcon.imageset/RxStarscreamIcon.png -------------------------------------------------------------------------------- /SampleApp/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /SampleApp/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /SampleApp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /SampleApp/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guy Kahlon. 3 | // 4 | 5 | import UIKit 6 | import RxSwift 7 | import Starscream 8 | 9 | class ViewController: UIViewController { 10 | 11 | @IBOutlet fileprivate weak var inputTextField: UITextField! 12 | @IBOutlet fileprivate weak var sendButton: UIButton! 13 | @IBOutlet fileprivate weak var logTextView: UITextView! 14 | @IBOutlet fileprivate weak var pongButton: UIBarButtonItem! 15 | 16 | private let disposeBag = DisposeBag() 17 | private let socket = WebSocket(url: URL(string: "wss://echo.websocket.org")!) 18 | private let writeSubject = PublishSubject() 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | sendButton.rx.tap 24 | .subscribe(onNext: { [unowned self] in 25 | guard let text = self.inputTextField.text, !text.isEmpty else { 26 | return 27 | } 28 | self.sendMessage(message: text) 29 | }).disposed(by: disposeBag) 30 | 31 | pongButton.rx.tap.subscribe(onNext: { [unowned self] in 32 | self.socket.write(ping: Data()) 33 | self.writeSubject.onNext("PING") 34 | }).disposed(by: disposeBag) 35 | 36 | let responseString = socket.rx.response 37 | .map { response -> String in 38 | switch response { 39 | case .connected: 40 | return "Connected\n" 41 | case .disconnected(let error): 42 | return "Disconnected with error: \(String(describing: error)) \n" 43 | case .message(let msg): 44 | return "RESPONSE (Message): \(msg) \n" 45 | case .data(let data): 46 | return "RESPONSE (Data): \(data) \n" 47 | case .pong: 48 | return "RESPONSE (Pong)" 49 | } 50 | } 51 | 52 | Observable.merge([responseString, writeSubject.asObservable()]) 53 | .scan([]) { lastMsg, newMsg -> Array in 54 | return Array(lastMsg + [newMsg]) 55 | }.map { $0.joined(separator: "\n") 56 | }.asDriver(onErrorJustReturn: "") 57 | .drive(logTextView.rx.text) 58 | .disposed(by: disposeBag) 59 | 60 | socket.connect() 61 | } 62 | 63 | fileprivate func sendMessage(message: String) { 64 | socket.write(string: message) 65 | writeSubject.onNext("SENT: \(message)") 66 | inputTextField.text = nil 67 | inputTextField.resignFirstResponder() 68 | } 69 | } 70 | 71 | extension ViewController: UITextFieldDelegate { 72 | 73 | func textFieldShouldReturn(_ textField: UITextField) -> Bool { 74 | if let text = textField.text, !text.isEmpty { 75 | sendMessage(message: text) 76 | return true 77 | } 78 | return false 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /Source/RxStarscream.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Guy Kahlon. 3 | // 4 | 5 | import Foundation 6 | import RxSwift 7 | import RxCocoa 8 | import Starscream 9 | 10 | public enum WebSocketEvent { 11 | case connected 12 | case disconnected(Error?) 13 | case message(String) 14 | case data(Data) 15 | case pong 16 | } 17 | 18 | public class RxWebSocketDelegateProxy: DelegateProxy, DelegateProxyType, WebSocketDelegate, WebSocketPongDelegate { 19 | 20 | private weak var forwardDelegate: WebSocketDelegate? 21 | private weak var forwardPongDelegate: WebSocketPongDelegate? 22 | 23 | fileprivate let subject = PublishSubject() 24 | 25 | required public init(websocket: Client) { 26 | super.init(parentObject: websocket, delegateProxy: RxWebSocketDelegateProxy.self) 27 | } 28 | 29 | public static func currentDelegate(for object: Client) -> NSObjectProtocol? { 30 | return object.delegate as? NSObjectProtocol 31 | } 32 | 33 | public static func setCurrentDelegate(_ delegate: NSObjectProtocol?, to object: Client) { 34 | object.delegate = delegate as? WebSocketDelegate 35 | object.pongDelegate = delegate as? WebSocketPongDelegate 36 | } 37 | 38 | public static func registerKnownImplementations() { 39 | self.register { RxWebSocketDelegateProxy(websocket: $0) } 40 | } 41 | 42 | public func websocketDidConnect(socket: WebSocketClient) { 43 | subject.onNext(WebSocketEvent.connected) 44 | forwardDelegate?.websocketDidConnect(socket: socket) 45 | } 46 | 47 | public func websocketDidDisconnect(socket: WebSocketClient, error: Error?) { 48 | subject.onNext(WebSocketEvent.disconnected(error)) 49 | forwardDelegate?.websocketDidDisconnect(socket: socket, error: error) 50 | } 51 | 52 | public func websocketDidReceiveMessage(socket: WebSocketClient, text: String) { 53 | subject.onNext(WebSocketEvent.message(text)) 54 | forwardDelegate?.websocketDidReceiveMessage(socket: socket, text: text) 55 | } 56 | 57 | public func websocketDidReceiveData(socket: WebSocketClient, data: Data) { 58 | subject.onNext(WebSocketEvent.data(data)) 59 | forwardDelegate?.websocketDidReceiveData(socket: socket, data: data) 60 | } 61 | 62 | public func websocketDidReceivePong(socket: WebSocketClient, data: Data?) { 63 | subject.onNext(WebSocketEvent.pong) 64 | forwardPongDelegate?.websocketDidReceivePong(socket: socket, data: data) 65 | } 66 | 67 | deinit { 68 | subject.onCompleted() 69 | } 70 | } 71 | 72 | extension Reactive where Base: WebSocketClient { 73 | 74 | public var response: Observable { 75 | return RxWebSocketDelegateProxy.proxy(for: base).subject 76 | } 77 | 78 | public var text: Observable { 79 | return self.response 80 | .filter { 81 | switch $0 { 82 | case .message: 83 | return true 84 | default: 85 | return false 86 | } 87 | } 88 | .map { 89 | switch $0 { 90 | case .message(let message): 91 | return message 92 | default: 93 | return String() 94 | } 95 | } 96 | } 97 | 98 | public var connected: Observable { 99 | return response 100 | .filter { 101 | switch $0 { 102 | case .connected, .disconnected: 103 | return true 104 | default: 105 | return false 106 | } 107 | } 108 | .map { 109 | switch $0 { 110 | case .connected: 111 | return true 112 | default: 113 | return false 114 | } 115 | } 116 | } 117 | 118 | public func write(data: Data) -> Observable { 119 | return Observable.create { sub in 120 | self.base.write(data: data) { 121 | sub.onNext(()) 122 | sub.onCompleted() 123 | } 124 | 125 | return Disposables.create() 126 | } 127 | } 128 | 129 | public func write(ping: Data) -> Observable { 130 | return Observable.create { sub in 131 | self.base.write(ping: ping) { 132 | sub.onNext(()) 133 | sub.onCompleted() 134 | } 135 | 136 | return Disposables.create() 137 | } 138 | } 139 | 140 | public func write(string: String) -> Observable { 141 | return Observable.create { sub in 142 | self.base.write(string: string) { 143 | sub.onNext(()) 144 | sub.onCompleted() 145 | } 146 | 147 | return Disposables.create() 148 | } 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /scripts/bootstrap-if-needed.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | RED='\033[1;31m' 4 | GREEN='\033[1;32m' 5 | NC='\033[0m' # No Color 6 | 7 | if ! cmp -s Cartfile.resolved Carthage/Cartfile.resolved; then 8 | printf "${RED}Dependencies out of date with cache.${NC} Bootstrapping...\n" 9 | scripts/bootstrap.sh 10 | else 11 | printf "${GREEN}Cache up-to-date.${NC} Skipping bootstrap...\n" 12 | fi 13 | -------------------------------------------------------------------------------- /scripts/bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | carthage bootstrap 4 | cp Cartfile.resolved Carthage 5 | --------------------------------------------------------------------------------