public JsValueHolder(IContextSwitchService contextSwitch, JavaScriptValue value) { this.contextSwitch = contextSwitch; contextSwitch.With(() => { value.AddRef(); }); }
internal void SetJSSource(JavaScriptValue value, IContextSwitchService context) { if (JSSource.IsValid) { throw new InvalidOperationException("cannot set jsvalue twice"); } if (!value.IsValid) { throw new ArgumentException("not a valid javascriptvalue", nameof(value)); } value.AddRef(); JSSource = value; releaseJSValue = new Action(() => { context.With(() => value.Release()); }); }
public static JavaScriptValue CreateTypedArray(this IJSValueService valueService, JSTypedArray source, JavaScriptValue?arrayBufferSource) { IContextSwitchService switchService = valueService.CurrentNode.GetService <IRuntimeService>().InternalContextSwitchService; if (source.JSSource.IsValid) { return(source.JSSource); } switch (source.BufferSource) { case SharedBufferSourceEnum.CreateByDotnet: return(switchService.With <JavaScriptValue>( () => { if (arrayBufferSource == null) { throw new ArgumentNullException(nameof(arrayBufferSource)); } var result = JavaScriptValue.CreateTypedArray(source.ArrayType, arrayBufferSource.Value, source.Position, source.UnitCount); source.SetJSSource(result, switchService); return result; } )); case SharedBufferSourceEnum.CreateByJavascript: throw new InvalidOperationException("invalid source typed array"); //create by javascript should already have JavaScriptValue assigned case SharedBufferSourceEnum.CreateInJavascript: return(switchService.With <JavaScriptValue>( () => { var result = JavaScriptValue.CreateTypedArray(source.ArrayType, JavaScriptValue.Invalid, source.Position, source.UnitCount); source.SetJSSource(result, switchService); //hold the objec //get the internal storage JavaScriptValue.GetTypedArrayStorage(result, out IntPtr data, out uint bufferLength, out JavaScriptTypedArrayType type, out int elementSize); source.InitWindow(data, false); source.InitBeforeConvert(source.Buffer); return result; } )); case SharedBufferSourceEnum.CreateByExternal: throw new ArgumentException("TypedArray does not support create from external"); default: throw new ArgumentOutOfRangeException("Invalid BufferSource property in JSTypedArray object"); } }
/// <summary> /// Create DataView in javascript /// this method requires a sourceArrayBuffer which make sure the arraybuffer is initialized before transfer to javascript /// </summary> /// <param name="sourceArrayBuffer">ArrayBuffer object</param> /// <param name="source"></param> /// <returns></returns> public static JavaScriptValue CreateDataView(this IJSValueService valueService, JavaScriptValue sourceArrayBuffer, JSDataView source) { IContextSwitchService switchService = valueService.CurrentNode.GetService <IRuntimeService>().InternalContextSwitchService; if (source.JSSource.IsValid) { return(source.JSSource); } switch (source.BufferSource) { case SharedBufferSourceEnum.CreateByDotnet: return(switchService.With <JavaScriptValue>( () => { var result = JavaScriptValue.CreateDataView(sourceArrayBuffer, source.Position, (uint)source.Size); source.SetJSSource(result, switchService); source.InitBeforeConvert(source.Buffer); return result; } )); case SharedBufferSourceEnum.CreateByJavascript: throw new InvalidOperationException("invalid source typed array"); //create by javascript should already have JavaScriptValue assigned case SharedBufferSourceEnum.CreateInJavascript: return(switchService.With <JavaScriptValue>( () => { var result = JavaScriptValue.CreateDataView(sourceArrayBuffer, source.Position, (uint)source.Size); source.SetJSSource(result, switchService); JavaScriptValue.GetDataViewStorage(result, out IntPtr data, out uint bufferLength); source.InitWindow(data, false); source.InitBeforeConvert(source.Buffer); return result; } )); case SharedBufferSourceEnum.CreateByExternal: throw new ArgumentException("DataView does not support create from external"); default: throw new ArgumentOutOfRangeException("Invalid BufferSource property in JSDataView object"); } }
public static JavaScriptValue CreateArrayBuffer(this IJSValueService valueService, JSArrayBuffer source) { IContextSwitchService switchService = valueService.CurrentNode.GetService <IRuntimeService>().InternalContextSwitchService; return(switchService.With <JavaScriptValue>(() => { if (source.JSSource.IsValid) { return source.JSSource; } switch (source.BufferSource) { case SharedBufferSourceEnum.CreateByJavascript: throw new InvalidOperationException("invalid source array buffer"); //create by javascript should already have JavaScriptValue assigned case SharedBufferSourceEnum.CreateInJavascript: { JavaScriptValue result = JavaScriptValue.CreateArrayBuffer((uint)source.Size); source.SetJSSource(result, switchService); //hold the varient var data = JavaScriptValue.GetArrayBufferStorage(result, out uint bufferSize); source.InitWindow(data, false); source.InitBeforeConvert(source.Buffer); return result; } case SharedBufferSourceEnum.CreateByDotnet: case SharedBufferSourceEnum.CreateByExternal: { var result = JavaScriptValue.CreateExternalArrayBuffer(source.Buffer.Handle, (uint)source.Buffer.ByteLength, null, IntPtr.Zero); //do not handle GC callback, user should control the varient life cycle source.SetJSSource(result, switchService); //hold the varient return result; } default: throw new ArgumentOutOfRangeException("Invalid BufferSource property in JSArryBuffer object"); } } )); }
internal static JSArrayBuffer CreateFromJS(IntPtr handle, uint size, JavaScriptValue value, IContextSwitchService context) { var result = new JSArrayBuffer(SharedBufferSourceEnum.CreateByJavascript, (ulong)size); result.SetJSSource(value, context); result.InitWindow(handle, false); //memory owned by js, do not release when object is disposed return(result); }
internal static JSDataView CreateFromJS(JavaScriptValue value, IntPtr handle, uint size, IContextSwitchService context) { JSDataView result = new JSDataView(SharedBufferSourceEnum.CreateByJavascript, null, 0, size); result.SetJSSource(value, context); result.InitWindow(handle, false); return(result); }
internal static JSTypedArray CreateFromJS(JavaScriptTypedArrayType type, IntPtr data, uint unitCount, JavaScriptValue source, IContextSwitchService context) { JSTypedArray result = new JSTypedArray(type, 0, unitCount); result.SetJSSource(source, context); result.InitWindow(data, false); return(result); }
public RuntimeService(JavaScriptRuntime runtime) { this.runtime = runtime; context = runtime.CreateContext(); InternalContextSwitchService = new RuntimeInternalContextSwitcher(context); }