Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit dc97b05

Browse files
committedSep 23, 2024·
improve xmlhttprequest , support transformstream
1 parent d0843d5 commit dc97b05

12 files changed

+312
-40
lines changed
 

‎base/baseobject/baseobject.go

+9
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,15 @@ func NewFromJSObject(obj js.Value) (BaseObject, error) {
255255

256256
}
257257

258+
// NewEmptyObject empty object.
259+
func NewEmptyObject() (BaseObject, error) {
260+
var o BaseObject
261+
obj := js.ValueOf(map[string]interface{}{})
262+
o.object = &obj
263+
return o, nil
264+
265+
}
266+
258267
// Empty check if the struct is an empty Struct or have a JS Value attached
259268
func (b BaseObject) Empty() bool {
260269

‎base/serviceworkerregistration/serviceworkerregistration.go

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package serviceworkerregistration
22

33
import (
4-
"fmt"
54
"sync"
65
"syscall/js"
76

@@ -82,7 +81,6 @@ func (s ServiceWorkerRegistration) getserviceworkerAttribute(attribute string) (
8281
return sw, baseobject.ErrUndefinedValue
8382
} else {
8483
if sw, ok = obj.(serviceworker.ServiceWorker); !ok {
85-
fmt.Printf("-->%v\n", obj.(baseobject.BaseObject).ConstructName_())
8684
err = serviceworker.ErrNotAServiceWorker
8785

8886
}

‎base/stream/errors.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@ package stream
33
import "errors"
44

55
var (
6-
ErrNotImplementedReadableStream = errors.New("Browser not implemented ReadableStream")
7-
ErrNotImplementedWritableStream = errors.New("Browser not implemented WritableStream")
8-
ErrNotAReadableStream = errors.New("Object is not a ReadableStream")
9-
ErrNotAWritableStream = errors.New("Object is not a WritableStream")
6+
ErrNotImplementedReadableStream = errors.New("Browser not implemented ReadableStream")
7+
ErrNotImplementedWritableStream = errors.New("Browser not implemented WritableStream")
8+
ErrNotImplementedTransformStream = errors.New("Browser not implemented TransformStream")
9+
ErrNotAReadableStream = errors.New("Object is not a ReadableStream")
10+
ErrNotAWritableStream = errors.New("Object is not a WritableStream")
11+
ErrNotATransformStream = errors.New("Object is not a TransformStream")
12+
ErrNotAReadableStreamDefaultReader = errors.New("Object is not a ReadableStreamDefaultReader")
13+
ErrNotATransformStreamDefaultController = errors.New("Object is not a TransformStreamDefaultController")
1014
)

‎base/stream/readablestream.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ func init() {
1616

1717
initinterface.RegisterInterface(GetRInterface)
1818
initinterface.RegisterInterface(GetWInterface)
19+
initinterface.RegisterInterface(GetTInterface)
1920
initinterface.RegisterInterface(GetReadableStreamDefaultReaderInterface)
2021
initinterface.RegisterInterface(GetWritableStreamDefaultWriterInterface)
21-
22+
initinterface.RegisterInterface(GetTransformStreamDefaultControllerInterface)
2223
}
2324

2425
var singletonr sync.Once

‎base/stream/readablestreamdefaultreader.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func NewReadableStreamDefaultReaderFromJSObject(obj js.Value) (ReadableStreamDef
5252
}
5353
}
5454

55-
return r, ErrNotAReadableStream
55+
return r, ErrNotAReadableStreamDefaultReader
5656
}
5757

5858
func (r ReadableStreamDefaultReader) newRead(data []byte, dataHandle func([]byte, int)) *promise.Promise {

‎base/stream/transformstream.go

+103-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,113 @@
11
package stream
22

3-
import "github.com/realPy/hogosuru/base/baseobject"
3+
import (
4+
"sync"
5+
"syscall/js"
6+
7+
"github.com/realPy/hogosuru/base/baseobject"
8+
)
49

510
type TransformStream struct {
611
baseobject.BaseObject
12+
start, transform, flush js.Func
13+
}
14+
15+
var singletont sync.Once
16+
17+
var transformstreaminterface js.Value
18+
19+
// GetRInterface get the JS interface ReadableStream.
20+
func GetTInterface() js.Value {
21+
22+
singletont.Do(func() {
23+
24+
var err error
25+
if transformstreaminterface, err = baseobject.Get(js.Global(), "TransformStream"); err != nil {
26+
transformstreaminterface = js.Undefined()
27+
}
28+
baseobject.Register(transformstreaminterface, func(v js.Value) (interface{}, error) {
29+
return NewTransformStreamFromJSObject(v)
30+
})
31+
})
32+
33+
return transformstreaminterface
734
}
835

36+
// NewReadableStream Create a new ReadableStream
37+
func NewTransformStream(
38+
start func(controller TransformStreamDefaultController),
39+
transform func(chunk interface{}, controller TransformStreamDefaultController),
40+
) (TransformStream, error) {
41+
var t TransformStream
42+
var obj js.Value
43+
var err error
44+
if ri := GetTInterface(); !ri.IsUndefined() {
45+
ob, _ := baseobject.NewEmptyObject()
46+
t.start = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
47+
48+
if c, err := baseobject.Discover(args[0]); err == nil {
49+
if ctrl, ok := c.(TransformStreamDefaultController); ok {
50+
start(ctrl)
51+
}
52+
}
53+
return nil
54+
})
55+
t.transform = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
56+
if c, err := baseobject.Discover(args[1]); err == nil {
57+
if ctrl, ok := c.(TransformStreamDefaultController); ok {
58+
chunk, _ := baseobject.Discover(args[0])
59+
transform(chunk, ctrl)
60+
}
61+
}
62+
63+
return nil
64+
})
65+
66+
t.flush = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
67+
if c, err := baseobject.Discover(args[0]); err == nil {
68+
if ctrl, ok := c.(TransformStreamDefaultController); ok {
69+
ctrl.Terminate()
70+
}
71+
}
72+
return nil
73+
})
74+
75+
ob.Set("start", t.start)
76+
ob.Set("transform", t.transform)
77+
ob.Set("flush", t.flush)
78+
79+
if obj, err = baseobject.New(ri, ob.JSObject()); err == nil {
80+
t.BaseObject = t.BaseObject.SetObject(obj)
81+
82+
}
83+
84+
} else {
85+
err = ErrNotImplementedReadableStream
86+
}
87+
return t, err
88+
}
89+
90+
func NewTransformStreamFromJSObject(obj js.Value) (TransformStream, error) {
91+
var t TransformStream
92+
var err error
93+
if tsi := GetTInterface(); !tsi.IsUndefined() {
94+
if obj.IsUndefined() || obj.IsNull() {
95+
err = baseobject.ErrUndefinedValue
96+
} else {
97+
98+
if obj.InstanceOf(tsi) {
99+
t.BaseObject = t.SetObject(obj)
100+
101+
} else {
102+
err = ErrNotATransformStream
103+
}
104+
}
105+
} else {
106+
err = ErrNotImplementedTransformStream
107+
}
108+
109+
return t, err
110+
}
9111
func TransfertToTransformStream(b baseobject.BaseObject) TransformStream {
10112
var t TransformStream
11113
t.BaseObject = t.SetObject(b.JSObject())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package stream
2+
3+
import (
4+
"sync"
5+
"syscall/js"
6+
7+
"github.com/realPy/hogosuru/base/baseobject"
8+
)
9+
10+
var singletonTransformStreamDefaultController sync.Once
11+
12+
var transformstreamdefaultcontrollerinterface js.Value
13+
14+
// GetTransformStreamDefaultControllerInterface
15+
func GetTransformStreamDefaultControllerInterface() js.Value {
16+
singletonTransformStreamDefaultController.Do(func() {
17+
18+
var err error
19+
if transformstreamdefaultcontrollerinterface, err = baseobject.Get(js.Global(), "TransformStreamDefaultController"); err != nil {
20+
transformstreamdefaultcontrollerinterface = js.Undefined()
21+
}
22+
23+
baseobject.Register(transformstreamdefaultcontrollerinterface, func(v js.Value) (interface{}, error) {
24+
return NewTransformStreamDefaultControllerFromJSObject(v)
25+
})
26+
})
27+
28+
return transformstreamdefaultcontrollerinterface
29+
}
30+
31+
type TransformStreamDefaultController struct {
32+
baseobject.BaseObject
33+
}
34+
35+
type TransformStreamDefaultControllerFrom interface {
36+
TransformStreamDefaultController_() TransformStreamDefaultController
37+
}
38+
39+
func (t TransformStreamDefaultController) TransformStreamDefaultController_() TransformStreamDefaultController {
40+
return t
41+
}
42+
43+
func NewTransformStreamDefaultControllerFromJSObject(obj js.Value) (TransformStreamDefaultController, error) {
44+
var t TransformStreamDefaultController
45+
var err error
46+
if wsi := GetTransformStreamDefaultControllerInterface(); !wsi.IsUndefined() {
47+
if obj.IsUndefined() || obj.IsNull() {
48+
err = baseobject.ErrUndefinedValue
49+
} else {
50+
51+
if obj.InstanceOf(wsi) {
52+
t.BaseObject = t.SetObject(obj)
53+
54+
} else {
55+
err = ErrNotATransformStreamDefaultController
56+
}
57+
}
58+
} else {
59+
err = ErrNotImplementedTransformStream
60+
}
61+
62+
return t, err
63+
}
64+
65+
func (t TransformStreamDefaultController) Enqueue(chunk baseobject.BaseObject) error {
66+
var err error
67+
68+
if _, err = t.Call("enqueue", chunk.JSObject()); err != nil {
69+
return err
70+
71+
}
72+
73+
return nil
74+
}
75+
76+
func (t TransformStreamDefaultController) Terminate() error {
77+
var err error
78+
79+
if _, err = t.Call("terminate"); err != nil {
80+
return err
81+
82+
}
83+
84+
return nil
85+
}

‎base/stream/writablestreamdefaultwriter.go

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ var writeablestreamdefaultinterface js.Value
1515

1616
// GetWritableStreamDefaultWriterInterface
1717
func GetWritableStreamDefaultWriterInterface() js.Value {
18-
1918
singletonReadableStreamDefault.Do(func() {
2019

2120
var err error

‎base/typedarray/int8array.go

-2
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,10 @@ func NewInt8Array(value interface{}) (Int8Array, error) {
6060
}
6161

6262
func NewInt8ArrayFrom(iterable interface{}) (Int8Array, error) {
63-
6463
arr, err := newTypedArrayFrom(GetInt8ArrayInterface(), func(v js.Value) (interface{}, error) {
6564
return NewInt8FromJSObject(v)
6665
}, iterable)
6766
return arr.(Int8Array), err
68-
6967
}
7068

7169
func NewInt8ArrayOf(values ...interface{}) (Int8Array, error) {

‎base/typedarray/typedarray.go

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
)
1212

1313
func init() {
14-
1514
initinterface.RegisterInterface(GetFloat32ArrayInterface)
1615
initinterface.RegisterInterface(GetFloat64ArrayInterface)
1716
initinterface.RegisterInterface(GetInt8ArrayInterface)

‎base/xmlhttprequest/xmlhttprequest.go

+24
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,30 @@ func (x XMLHTTPRequest) GetResponseHeader(header string) (string, error) {
195195
return "", err
196196
}
197197

198+
// GetAllResponseHeader https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders
199+
func (x XMLHTTPRequest) GetAllResponseHeader() (string, error) {
200+
var responseHeader js.Value
201+
var err error
202+
if responseHeader, err = x.Call("getAllResponseHeaders"); err == nil {
203+
204+
if responseHeader.Type() == js.TypeString {
205+
return responseHeader.String(), nil
206+
} else {
207+
return "", baseobject.ErrObjectNotString
208+
}
209+
210+
}
211+
return "", err
212+
}
213+
214+
// overrideMimeType https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/overrideMimeType
215+
func (x XMLHTTPRequest) OverrideMimeType(mimetype string) error {
216+
var err error
217+
_, err = x.Call("overrideMimeType", js.ValueOf(mimetype))
218+
219+
return err
220+
}
221+
198222
// Response
199223
func (x XMLHTTPRequest) Response() (js.Value, error) {
200224
return x.Get("response")

0 commit comments

Comments
 (0)
Please sign in to comment.