/* * Copyright (c) 2018-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. * */ #if FB_SONARKIT_ENABLED #import #import "SKBufferingPlugin.h" #import #import "SKDispatchQueue.h" #import "SKBufferingPlugin+CPPInitialization.h" static const NSUInteger bufferSize = 500; @interface SKBufferingPlugin() @property(assign, nonatomic) std::vector ringBuffer; @property(assign, nonatomic) std::shared_ptr connectionAccessQueue; @property(strong, nonatomic) id connection; @end @implementation SKBufferingPlugin // { // std::vector _ringBuffer; // std::shared_ptr _connectionAccessQueue; // // id _connection; // } - (instancetype)initWithQueue:(dispatch_queue_t)queue { if (self = [super init]) { _ringBuffer.reserve(bufferSize); _connectionAccessQueue = std::make_shared(queue); } return self; } - (NSString *)identifier { // Note: This must match with the javascript pulgin identifier!! return @"Network"; } - (void)didConnect:(id)connection { _connectionAccessQueue->async(^{ self->_connection = connection; [self sendBufferedEvents]; }); } - (void)didDisconnect { _connectionAccessQueue->async(^{ self->_connection = nil; }); } - (BOOL)runInBackground { return YES; } - (void)send:(NSString *)method sonarObject:(NSDictionary *)sonarObject { _connectionAccessQueue->async(^{ if (self->_connection) { [self->_connection send:method withParams:sonarObject]; } else { if (self->_ringBuffer.size() == bufferSize) { return; } self->_ringBuffer.push_back({ .method = method, .sonarObject = sonarObject }); } }); } - (void)sendBufferedEvents { NSAssert(_connection, @"connection object cannot be nil"); for (const auto &event : _ringBuffer) { [_connection send:event.method withParams:event.sonarObject]; } _ringBuffer.clear(); } @end @implementation SKBufferingPlugin(CPPInitialization) - (instancetype)initWithVectorEventSize:(NSUInteger)size connectionAccessQueue:(std::shared_ptr)connectionAccessQueue { if (self = [super init]) { _ringBuffer.reserve(size); _connectionAccessQueue = connectionAccessQueue; } return self; } - (instancetype)initWithDispatchQueue:(std::shared_ptr)queue { return [self initWithVectorEventSize:bufferSize connectionAccessQueue:queue]; } @end #endif