public KayakFrameworkBehavior(Type[] types)
 {
     var methodMap = types.CreateMethodMap();
     RouteFunc = c => methodMap.GetMethodForContext(c);
     JsonMapper = new TypedJsonMapper();
     JsonMapper.AddDefaultInputConversions();
     JsonMapper.AddDefaultOutputConversions();
 }
        public static IDisposable UseFramework(this IObservable<ISocket> sockets)
        {
            TypedJsonMapper jsonMapper = new TypedJsonMapper();
            jsonMapper.AddDefaultInputConversions();
            jsonMapper.AddDefaultOutputConversions();

            return sockets.UseFramework(new KayakFrameworkBehavior(Assembly.GetCallingAssembly().GetTypes()));
        }
        public static IObservable<Unit> SerializeResultToJson(this IKayakContext context, TypedJsonMapper mapper)
        {
            var info = context.GetInvocationInfo();

            if (info.Result != null)
                return context.WriteJsonResponse(info.Result, mapper);
            else if (info.Exception != null)
            {
                var exception = info.Exception;

                if (exception is TargetInvocationException)
                    exception = exception.InnerException;

                context.Response.SetStatusToInternalServerError();

                return context.WriteJsonResponse(new { Error = exception.Message }, mapper);
            }
            else return null;
        }
        static IEnumerable<object> DeserializeArgsFromJsonInternal(this IKayakContext context, TypedJsonMapper mapper)
        {
            var info = context.GetInvocationInfo();

            var parameters = info.Method.GetParameters().Where(p => RequestBodyAttribute.IsDefinedOn(p));

            if (parameters.Count() != 0 && context.Request.Headers.GetContentLength() != 0)
            {
                IList<ArraySegment<byte>> requestBody = null;
                yield return BufferRequestBody(context).AsCoroutine<IList<ArraySegment<byte>>>().Do(d => requestBody = d);

                var reader = new JsonReader(new StringReader(requestBody.GetString()));

                if (parameters.Count() > 1)
                    reader.Read(); // read array start

                foreach (var param in parameters)
                    info.Arguments[param.Position] = mapper.Read(param.ParameterType, reader);

                //if (parameters.Count() > 1)
                //    reader.Read(); // read array end
            }
        }
 public static IObservable<Unit> DeserializeArgsFromJson(this IKayakContext context, TypedJsonMapper mapper)
 {
     return context.DeserializeArgsFromJsonInternal(mapper).AsCoroutine<Unit>();
 }
        static IObservable<Unit> WriteJsonResponse(this IKayakContext context, object o, TypedJsonMapper mapper)
        {
            var buffer = new MemoryStream();
            var writer = new StreamWriter(buffer);

            bool minified = context.GetJsonOutputMinified();

            var response = context.Response;

            response.Headers["Content-Type"] = minified ? "application/json; charset=utf-8" : "text/plain; charset=utf-8";

            mapper.Write(o, new JsonWriter(writer) { Validate = false, PrettyPrint = !minified });
            writer.Flush();

            var bufferBytes = buffer.ToArray();

            context.Response.Headers["Content-Length"] = bufferBytes.Length.ToString();
            return context.Response.Write(bufferBytes, 0, bufferBytes.Length);
        }