1- //Code to communicate with feathers js server through socketio
1+ import 'dart:async' ;
2+
3+ import 'package:feathersjs/src/featherjs_client_base.dart' ;
4+ import 'package:socket_io_client/socket_io_client.dart' as IO;
5+ import 'package:meta/meta.dart' ;
6+
7+ class SocketioClient extends FeathersJsClient {
8+ /////////////////////////////////////////////////////////////////////
9+ IO .Socket _socket;
10+ String accesToken;
11+ bool dev = true ;
12+ ////////////////////////////////////////////////////////////////////////
13+
14+ /// Constructor
15+ /// Connect anonymously to the _socket server througth web _socket
16+ SocketioClient (
17+ {@required String baseUrl, Map <String , dynamic > extraHeaders}) {
18+ _socket = IO .io (baseUrl, < String , dynamic > {
19+ 'transports' : ['websocket' ],
20+ 'extraHeaders' : extraHeaders,
21+ //'autoConnect': false,
22+ });
23+ //_socket.connect();
24+
25+ if (dev) {
26+ _socket.on ('connect' , (_) {
27+ print ("Socket connection established" );
28+ });
29+
30+ _socket.on ('connect_error' , (e) {
31+ print ("Connection error" );
32+ print (e);
33+ });
34+ _socket.on ('connect_timeout' , (data) {
35+ print ("Timeout error" );
36+ print (data);
37+ });
38+ _socket.on ('connecting' , (_) => print ("Connecting..." ));
39+ _socket.on ('disconnect' , (_) => print ("Disconnected..." ));
40+ _socket.on ('error' , (_) => print ("An error occured" ));
41+ _socket.on ('reconnect' , (_) => print ("Reconnected" ));
42+ _socket.on ('reconnect_error' , (_) => print ("Reconnection error..." ));
43+ _socket.on (
44+ 'reconnect_attempt' , (_) => print ("Attempting a reconnection" ));
45+ _socket.on ('reconnect_failed' , (_) => print ("A reconnection failed" ));
46+ _socket.on ('reconnecting' , (_) => print ("Reconnecting..." ));
47+ }
48+ }
49+
50+ /// EMIT create authentication
51+ /// Authenticate the _socket connection
52+ Future <bool > authenticate ({
53+ String email,
54+ String password,
55+ }) async {
56+ Completer asyncTask = Completer <bool >();
57+ _socket.emitWithAck ('create' , [
58+ 'authentication' ,
59+ < String , dynamic > {
60+ 'strategy' : 'local' ,
61+ 'email' : email,
62+ 'password' : password
63+ }
64+ ], ack: (authResult) {
65+ try {
66+ accesToken = authResult[1 ]['accessToken' ];
67+ asyncTask.complete (true );
68+ } catch (e) {
69+ asyncTask.complete (false );
70+ }
71+ });
72+ return asyncTask.future;
73+ }
74+
75+ /// EMIT find serviceName
76+ /// Retrieves a list of all matching resources from the service
77+ Future <dynamic > emitFind (
78+ {String serviceName, Map <String , dynamic > query}) async {
79+ Completer asyncTask = Completer <dynamic >();
80+ _socket.emitWithAck ("find" , [serviceName, query], ack: (response) {
81+ asyncTask.complete (response[1 ]);
82+ });
83+ return asyncTask.future;
84+ }
85+
86+ /// EMIT create serviceName
87+ /// Create new ressource
88+ Future <dynamic > emitCreate ({String serviceName, Map <String , dynamic > data}) {
89+ Completer asyncTask = Completer <dynamic >();
90+ _socket.emitWithAck ("create" , [serviceName, data], ack: (response) {
91+ asyncTask.complete (response[1 ]);
92+ });
93+ return asyncTask.future;
94+ }
95+
96+ /// EMIT update serviceName
97+ /// Update a ressource
98+ Future <dynamic > emitUpdate (
99+ {String serviceName, objectId, Map <String , dynamic > data}) {
100+ Completer asyncTask = Completer <dynamic >();
101+ _socket.emitWithAck ("update" , [serviceName, objectId, data],
102+ ack: (response) {
103+ asyncTask.complete (response[1 ]);
104+ });
105+ return asyncTask.future;
106+ }
107+
108+ /// EMIT get serviceName
109+ /// Retrieve a single ressource
110+ Future <dynamic > emitGet ({String serviceName, objectId}) {
111+ Completer asyncTask = Completer <dynamic >();
112+ _socket.emitWithAck ("get" , [serviceName, objectId], ack: (response) {
113+ asyncTask.complete (response[1 ]);
114+ });
115+ return asyncTask.future;
116+ }
117+
118+ /// EMIT patch serviceName
119+ ///Merge the existing data of a single or multiple resources with the new data
120+ Future <dynamic > emitPatch (
121+ {String serviceName, objectId, Map <String , dynamic > data}) {
122+ Completer asyncTask = Completer <dynamic >();
123+ _socket.emitWithAck ("patch" , [serviceName, objectId, data],
124+ ack: (response) {
125+ asyncTask.complete (response[1 ]);
126+ });
127+ return asyncTask.future;
128+ }
129+
130+ /// EMIT patch serviceName
131+ ///Merge the existing data of a single or multiple resources with the new data
132+ Future <dynamic > emitRemove ({String serviceName, objectId}) {
133+ Completer asyncTask = Completer <dynamic >();
134+ _socket.emitWithAck ("remove" , [serviceName, objectId], ack: (response) {
135+ asyncTask.complete (response[1 ]);
136+ });
137+ return asyncTask.future;
138+ }
139+
140+ /// Listen to create method call
141+ ///Get the last created ressource
142+ onCreated ({String serviceName, Function callback}) {
143+ _socket.on ("$serviceName created" , (data) {
144+ callback (data);
145+ });
146+ }
147+
148+ /// Listen to update method
149+ ///Get the last updated ressource
150+ onUpdated ({String serviceName, Function callback}) {
151+ _socket.on ("$serviceName updated" , (data) {
152+ callback (data);
153+ });
154+ }
155+
156+ /// Listen to remove method call
157+ ///Get the last deleted ressource
158+ onRemoved ({String serviceName, Function callback}) {
159+ _socket.on ("$serviceName removed" , (data) {
160+ callback (data);
161+ });
162+ }
163+ }
0 commit comments