Dart Documentationobjectory_implObjectoryWebsocketBrowserImpl

ObjectoryWebsocketBrowserImpl class

class ObjectoryWebsocketBrowserImpl extends Objectory{
 WebSocket webSocket;
 bool isConnected;
 Map<int,Completer> awaitedRequests = new Map<int,Completer>();
 int requestId = 0;
 ObjectoryWebsocketBrowserImpl(String uri,Function registerClassesCallback,bool dropCollectionsOnStartup):
   super(uri, registerClassesCallback, dropCollectionsOnStartup);

 Future open(){
   return setupWebsocket(uri);
 }
 
 ObjectoryCollection constructCollection() => new ObjectoryCollectionWebsocketBrowserImpl(this);

 Future<bool> setupWebsocket(String uri) {
   Completer completer = new Completer();
   webSocket = new WebSocket("ws://$uri/ws");
   webSocket.onOpen.listen((event) {
   
     isConnected = true;
     completer.complete(true);
   });

   webSocket.onClose.listen((e) {
     //log.fine('close $e');
     isConnected = false;
   });

   webSocket.onMessage.listen((m) {
     // TODO: Figure out if it's binary or not.
     // We could use print((new WebSocket('ws://.')).binaryType); -- but how does the server know?
     /*var reader = new FileReader();
     reader.onLoadEnd.listen(_onMessageRead);
     reader.readAsArrayBuffer(m.data);*/
     _onMessageRead(m.data);
   });
   return completer.future;
 }
 
 _onMessageRead(/*ProgressEvent event*/data) {
   /*FileReader reader = event.target;
   var data = reader.result;
   if (data is! List) {
     data = new Uint8List.view(data);
   }*/
   var jdata = new BSON().deserialize(new BsonBinary.from(JSON.decode(data)));
   //log.info('onmessage: $jdata');
   var message = new ObjectoryMessage.fromMessage(jdata);      
   int receivedRequestId = message.command['requestId'];
   if (receivedRequestId == null) {
     return;
   }
   var completer = awaitedRequests[receivedRequestId];
   if (completer != null) {
     //log.fine("Complete request: $receivedRequestId message: $message");
     completer.complete(message.content);
   } else {
     //log.shout('Not found completer for request: $receivedRequestId');
   }
 }
 Future _postMessage(Map command, Map content, [Map extParams]) {
   requestId++;
   command['requestId'] = requestId;
   webSocket.send(JSON.encode(new BSON().serialize({'header':command, 'content':content, 'extParams': extParams}).byteList));
   var completer = new Completer();
   awaitedRequests[requestId] = completer;
   return completer.future;
 }
 Map _createCommand(String command, String collection){
   return {'command': command, 'collection': collection};
 }
 ObjectId generateId() => new ObjectId(clientMode: true);

 Future doUpdate(String collection,ObjectId id, Map toUpdate) =>
     _postMessage(_createCommand('update',collection),toUpdate,{"_id": id});


 Future insert(PersistentObject persistentObject) =>
     _postMessage(_createCommand('insert',persistentObject.collectionName),persistentObject.map);

 Future remove(PersistentObject persistentObject) =>
   _postMessage(_createCommand('remove',persistentObject.collectionName),persistentObject.map);

 Future<Map> dropDb() {
   return _postMessage(_createCommand('dropDb',null),{});
 }

 Future<Map> queryDb(Map map) {
   return _postMessage(_createCommand('queryDb',null),map);
 }

 Future<Map> wait(){
   return queryDb({"getlasterror":1});
 }

 void close(){
   webSocket.close();
 }
 Future dropCollections() {
   return Future.wait(getCollections().map(
       (collection) => _postMessage(_createCommand('dropCollection',collection),{})));
 }
}

Extends

Objectory > ObjectoryWebsocketBrowserImpl

Constructors

new ObjectoryWebsocketBrowserImpl(String uri, Function registerClassesCallback, bool dropCollectionsOnStartup) #

Creates a new Object instance.

Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.

docs inherited from Object
ObjectoryWebsocketBrowserImpl(String uri,Function registerClassesCallback,bool dropCollectionsOnStartup):
 super(uri, registerClassesCallback, dropCollectionsOnStartup);

Properties

Map<int, Completer> awaitedRequests #

Map<int,Completer> awaitedRequests = new Map<int,Completer>()

final Map<String, BasePersistentObject> cache #

inherited from Objectory
final Map<String,BasePersistentObject> cache = new  Map<String,BasePersistentObject>()

DataListDecorator dataListDecorator #

inherited from Objectory
DataListDecorator dataListDecorator = (List list) => list

DataMapDecorator dataMapDecorator #

inherited from Objectory
DataMapDecorator dataMapDecorator = (Map map) => map

bool dropCollectionsOnStartup #

inherited from Objectory
bool dropCollectionsOnStartup

bool isConnected #

bool isConnected

Function registerClassesCallback #

inherited from Objectory
Function registerClassesCallback

int requestId #

int requestId = 0

String uri #

inherited from Objectory
String uri

bool useFieldLevelUpdate #

inherited from Objectory
bool useFieldLevelUpdate = true

WebSocket webSocket #

WebSocket webSocket

Operators

ObjectoryCollection operator [](Type classType) #

inherited from Objectory
ObjectoryCollection operator[](Type classType) => _collections[classType];

Methods

void close() #

void close(){
 webSocket.close();
}

dynamic completeFindOne(Map map, Completer completer, ObjectoryQueryBuilder selector, Type classType) #

inherited from Objectory
completeFindOne(Map map,Completer completer,ObjectoryQueryBuilder selector,Type classType) {
 var obj;
 if (map == null) {
   completer.complete(null);
 }
 else {
   obj = objectory.map2Object(classType,map);
   if ((selector == null) ||  !selector.paramFetchLinks) {
     completer.complete(obj);
   } else {
     obj.fetchLinks().then((_) {
       completer.complete(obj);
     });  
   }
 }
}

ObjectoryCollection constructCollection() #

ObjectoryCollection constructCollection() => new ObjectoryCollectionWebsocketBrowserImpl(this);

List createTypedList(Type classType) #

inherited from Objectory
List createTypedList(Type classType) {
 return _listFactories[classType]();
}

PersistentObject dbRef2Object(DbRef dbRef) #

inherited from Objectory
PersistentObject dbRef2Object(DbRef dbRef) {
 return findInCacheOrGetProxy(dbRef.id, objectory.getClassTypeByCollection(dbRef.collection));
}

Future doUpdate(String collection, ObjectId id, Map toUpdate) #

Future doUpdate(String collection,ObjectId id, Map toUpdate) =>
   _postMessage(_createCommand('update',collection),toUpdate,{"_id": id});

Future dropCollections() #

Future dropCollections() {
 return Future.wait(getCollections().map(
     (collection) => _postMessage(_createCommand('dropCollection',collection),{})));
}

Future<Map> dropDb() #

Future<Map> dropDb() {
 return _postMessage(_createCommand('dropDb',null),{});
}

PersistentObject findInCacheOrGetProxy(id, Type classType) #

inherited from Objectory
PersistentObject findInCacheOrGetProxy(var id, Type classType) {
 if (id == null) {
   return null;
 }
 PersistentObject result = _findInCache(id);
 if (result == null) {
   result = objectory.newInstance(classType);
   result.id = id;
 }
 return result;
}

ObjectId generateId() #

ObjectId generateId() => new ObjectId(clientMode: true);

Type getClassTypeByCollection(String collectionName) #

inherited from Objectory
Type getClassTypeByCollection(String collectionName) => _collectionNameToTypeMap[collectionName];

List<String> getCollections() #

inherited from Objectory
List<String> getCollections() => _collections.values.map((ObjectoryCollection oc) => oc.collectionName).toList();

Future<bool> initDomainModel() #

inherited from Objectory
Future<bool> initDomainModel() {
 registerClassesCallback();
 return open().then((_){
   if (dropCollectionsOnStartup) {
     return objectory.dropCollections();
   }
 });
}

Future insert(PersistentObject persistentObject) #

Future insert(PersistentObject persistentObject) =>
   _postMessage(_createCommand('insert',persistentObject.collectionName),persistentObject.map);

BasePersistentObject map2Object(Type classType, Map map) #

inherited from Objectory
BasePersistentObject map2Object(Type classType, Map map){
 if (map == null) {
   map = new LinkedHashMap();
 }
 var result = newInstance(classType);
 result.map = map;
 if (result is PersistentObject){
   result.id = map["_id"];
 }
 if (result is PersistentObject) {
   if (result.id != null) {
     objectory._addToCache(result);
   }
 }
 return result;
}

BasePersistentObject newInstance(Type classType) #

inherited from Objectory
BasePersistentObject newInstance(Type classType){
 if (_factories.containsKey(classType)){
   return _factories[classType]();
 }
 throw new Exception('Class $classType have not been registered in Objectory');
}

Future open() #

Future open(){
 return setupWebsocket(uri);
}

Future<Map> queryDb(Map map) #

Future<Map> queryDb(Map map) {
 return _postMessage(_createCommand('queryDb',null),map);
}

void registerClass(Type classType, FactoryMethod factory, [FactoryMethod listFactory]) #

inherited from Objectory
void registerClass(Type classType,FactoryMethod factory,[FactoryMethod listFactory]){
 _factories[classType] = factory;
 _listFactories[classType] = (listFactory==null ? ()=>new List<PersistentObject>() : listFactory);
 BasePersistentObject obj = factory();
 if (obj is PersistentObject) {
   var collectionName = obj.collectionName;
   _collectionNameToTypeMap[collectionName] = classType;
   _collections[classType] = _createObjectoryCollection(classType,collectionName);
 }
}

Future remove(PersistentObject persistentObject) #

Future remove(PersistentObject persistentObject) =>
 _postMessage(_createCommand('remove',persistentObject.collectionName),persistentObject.map);

Future save(PersistentObject persistentObject) #

inherited from Objectory
Future save(PersistentObject persistentObject){
 Future res;
 if (persistentObject.id != null){
   res = update(persistentObject);
 }
 else{
   persistentObject.id = generateId();
   persistentObject.map["_id"] = persistentObject.id;
   objectory._addToCache(persistentObject);
   res =  insert(persistentObject);
 }
 persistentObject.dirtyFields.clear();
 return res;
}

Future<bool> setupWebsocket(String uri) #

Future<bool> setupWebsocket(String uri) {
 Completer completer = new Completer();
 webSocket = new WebSocket("ws://$uri/ws");
 webSocket.onOpen.listen((event) {
 
   isConnected = true;
   completer.complete(true);
 });

 webSocket.onClose.listen((e) {
   //log.fine('close $e');
   isConnected = false;
 });

 webSocket.onMessage.listen((m) {
   // TODO: Figure out if it's binary or not.
   // We could use print((new WebSocket('ws://.')).binaryType); -- but how does the server know?
   /*var reader = new FileReader();
   reader.onLoadEnd.listen(_onMessageRead);
   reader.readAsArrayBuffer(m.data);*/
   _onMessageRead(m.data);
 });
 return completer.future;
}

Future update(PersistentObject persistentObject) #

inherited from Objectory
Future update(PersistentObject persistentObject) {
 var id = persistentObject.id;
 if (id == null) {
   return new Future.error(new Exception('Update operation on object with null id'));
 }
 Map toUpdate = _getMapForUpdateCommand(persistentObject);
 if (toUpdate.isEmpty) {
   return new Future.value({'ok': 1.0, 'warn': 'Update operation called without actual changes'});
 }
 return doUpdate(persistentObject.collectionName,id,toUpdate);
}

Future<Map> wait() #

Future<Map> wait(){
 return queryDb({"getlasterror":1});
}