@@ -40,6 +40,7 @@ class Provider {
40
40
}
41
41
42
42
Provider (this .client, [String id]) {
43
+ Method .registerContextType ('ProviderContext' );
43
44
_invokeManager = InvokeManager (_execute);
44
45
if (id != null && id.isNotEmpty) this .id = id;
45
46
addMethod (_methodManager.getNames, '~' );
@@ -53,9 +54,15 @@ class Provider {
53
54
return Function .apply (method.method, [name, args]);
54
55
}
55
56
if (method.namedParameterTypes.isEmpty) {
57
+ if (method.contextInPositionalArguments) {
58
+ args.add (context);
59
+ }
56
60
return Function .apply (method.method, args);
57
61
}
58
62
final namedArguments = args.removeLast ();
63
+ if (method.contextInNamedArguments) {
64
+ namedArguments[Symbol ('context' )] = context;
65
+ }
59
66
return Function .apply (method.method, args, namedArguments);
60
67
}
61
68
@@ -87,14 +94,12 @@ class Provider {
87
94
if (method.hasNamedArguments) {
88
95
n = ppl + 1 ;
89
96
}
90
- if (count > n) {
91
- args.length = n;
92
- }
93
97
if (method.contextInPositionalArguments) {
94
98
ppl-- ;
95
99
n-- ;
96
100
}
97
101
n = min (count, n);
102
+ args.length = n;
98
103
for (var i = 0 ; i < n; ++ i) {
99
104
if (i < ppl) {
100
105
args[i] = Formatter .deserialize (Formatter .serialize (args[i]),
@@ -119,15 +124,9 @@ class Provider {
119
124
namedArgs[Symbol (name)] = value;
120
125
}
121
126
}
122
- if (method.contextInNamedArguments) {
123
- namedArgs[Symbol ('context' )] = context;
124
- }
125
127
args[i] = namedArgs;
126
128
}
127
129
}
128
- if (method.contextInPositionalArguments) {
129
- args[ppl] = context;
130
- }
131
130
}
132
131
return [index, await _invokeManager.handler (name, args, context), null ];
133
132
} on Error catch (e) {
@@ -202,23 +201,23 @@ class _Proxy {
202
201
}
203
202
204
203
@override
205
- dynamic noSuchMethod (Invocation mirror ) {
206
- var name = _namespace + _getName (mirror .memberName);
207
- if (mirror .isGetter) {
204
+ dynamic noSuchMethod (Invocation invocation ) {
205
+ var name = _namespace + _getName (invocation .memberName);
206
+ if (invocation .isGetter) {
208
207
return _Proxy (_caller, _id, name);
209
208
}
210
- if (mirror .isMethod) {
209
+ if (invocation .isMethod) {
211
210
var type = dynamic ;
212
- if (mirror .typeArguments.isNotEmpty) {
213
- type = mirror .typeArguments.first;
211
+ if (invocation .typeArguments.isNotEmpty) {
212
+ type = invocation .typeArguments.first;
214
213
}
215
214
var args = [];
216
- if (mirror .positionalArguments.isNotEmpty) {
217
- args.addAll (mirror .positionalArguments);
215
+ if (invocation .positionalArguments.isNotEmpty) {
216
+ args.addAll (invocation .positionalArguments);
218
217
}
219
- if (mirror .namedArguments.isNotEmpty) {
218
+ if (invocation .namedArguments.isNotEmpty) {
220
219
var namedArgs = < String , dynamic > {};
221
- mirror .namedArguments.forEach ((name, value) {
220
+ invocation .namedArguments.forEach ((name, value) {
222
221
namedArgs[_getName (name)] = value;
223
222
});
224
223
if (namedArgs.isNotEmpty) {
@@ -227,7 +226,19 @@ class _Proxy {
227
226
}
228
227
return _caller._invoke (_id, name, args, type);
229
228
}
230
- super .noSuchMethod (mirror);
229
+ super .noSuchMethod (invocation);
230
+ }
231
+ }
232
+
233
+ class CallerContext extends ServiceContext {
234
+ final Caller caller;
235
+ dynamic proxy;
236
+ CallerContext (this .caller, ServiceContext context) : super (context.service) {
237
+ context.copyTo (this );
238
+ proxy = caller.useService (caller._getId (this ));
239
+ }
240
+ invoke <T >(String name, [List args]) {
241
+ caller.invoke <T >(caller._getId (this ), name, args);
231
242
}
232
243
}
233
244
@@ -241,6 +252,7 @@ class Caller {
241
252
var heartbeat = const Duration (minutes: 2 );
242
253
var timeout = const Duration (seconds: 30 );
243
254
Caller (this .service) {
255
+ Method .registerContextType ('CallerContext' );
244
256
service
245
257
..addMethod (_close, '!!' )
246
258
..addMethod (_begin, '!' )
@@ -386,8 +398,6 @@ class Caller {
386
398
387
399
Future _handler (
388
400
String name, List args, Context context, NextInvokeHandler next) {
389
- context['invoke' ] = < T > (String name, [List args]) =>
390
- invoke <T >(_getId (context as ServiceContext ), name, args);
391
- return next (name, args, context);
401
+ return next (name, args, new CallerContext (this , context as ServiceContext ));
392
402
}
393
403
}
0 commit comments