blob: 2e653b650c082a0c378b0d0d83b902b2d3df6c56 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import "WXWebSocketModule.h"
#import "WXUtility.h"
#import "WXWebSocketHandler.h"
#import "WXHandlerFactory.h"
#import "WXWebSocketLoader.h"
#import "WXConvert.h"
@interface WXWebSocketModule()
@property(nonatomic,copy)WXModuleKeepAliveCallback errorCallBack;
@property(nonatomic,copy)WXModuleKeepAliveCallback messageCallBack;
@property(nonatomic,copy)WXModuleKeepAliveCallback openCallBack;
@property(nonatomic,copy)WXModuleKeepAliveCallback closeCallBack;
@end
@implementation WXWebSocketModule
{
WXWebSocketLoader *loader;
}
WX_EXPORT_METHOD(@selector(WebSocket:protocol:))
WX_EXPORT_METHOD(@selector(send:))
WX_EXPORT_METHOD(@selector(close:reason:))
WX_EXPORT_METHOD(@selector(onerror:))
WX_EXPORT_METHOD(@selector(onmessage:))
WX_EXPORT_METHOD(@selector(onopen:))
WX_EXPORT_METHOD(@selector(onclose:))
@synthesize weexInstance;
- (void)WebSocket:(NSString *)url protocol:(NSString *)protocol
{
if(loader)
{
[loader clear];
}
loader = [[WXWebSocketLoader alloc] initWithUrl:url protocol:protocol];
__weak typeof(self) weakSelf = self;
loader.onReceiveMessage = ^(id message) {
if (weakSelf) {
NSMutableDictionary *dic = [NSMutableDictionary new];
if([message isKindOfClass:[NSString class]]) {
[dic setObject:message forKey:@"data"];
}else if([message isKindOfClass:[NSData class]]){
[dic setObject:[WXUtility dataToBase64Dict:message] forKey:@"data"];
}
if (weakSelf.messageCallBack) {
weakSelf.messageCallBack(dic,true);;
}
}
};
loader.onOpen = ^() {
if (weakSelf) {
if (weakSelf.openCallBack) {
NSMutableDictionary *dict = [NSMutableDictionary new];
weakSelf.openCallBack(dict,true);;
}
}
};
loader.onFail = ^(NSError *error) {
if (weakSelf) {
WXLogError(@":( Websocket Failed With Error %@", error);
NSMutableDictionary *dict = [NSMutableDictionary new];
[dict setObject:error.userInfo?[WXUtility JSONString:error.userInfo]:@"" forKey:@"data"];
if (weakSelf.errorCallBack) {
weakSelf.errorCallBack(dict, true);
}
}
};
loader.onClose = ^(NSInteger code,NSString *reason,BOOL wasClean) {
if (weakSelf) {
if (weakSelf.closeCallBack) {
WXLogInfo(@"Websocket colse ");
NSMutableDictionary * callbackRsp = [[NSMutableDictionary alloc] init];
[callbackRsp setObject:[NSNumber numberWithInteger:code] forKey:@"code"];
[callbackRsp setObject:reason?reason:@"" forKey:@"reason"];
[callbackRsp setObject:wasClean?@true:@false forKey:@"wasClean"];
if (weakSelf.closeCallBack) {
weakSelf.closeCallBack(callbackRsp,false);
}
}
}
};
[loader open];
}
- (void)send:(id)data
{
if([data isKindOfClass:[NSString class]]){
[loader send:data];
}else if([data isKindOfClass:[NSDictionary class]]){
NSData *sendData = [WXUtility base64DictToData:data];
if(sendData){
[loader send:sendData];
}
}
}
- (void)close
{
[loader close];
}
- (void)close:(NSString *)code reason:(NSString *)reason
{
if([WXUtility isBlankString:code])
{
[loader close];
return;
}
[loader close:[code integerValue] reason:reason];
}
- (void)onerror:(WXModuleKeepAliveCallback)callback
{
self.errorCallBack = callback;
}
- (void)onmessage:(WXModuleKeepAliveCallback)callback
{
self.messageCallBack = callback;
}
- (void)onopen:(WXModuleKeepAliveCallback)callback
{
self.openCallBack = callback;
}
- (void)onclose:(WXModuleKeepAliveCallback)callback
{
self.closeCallBack = callback;
}
-(void)dealloc
{
[loader clear];
}
@end