2017-06-13 9 views
1

Scala.jsでsendBeacon APIを使用し、ByteBufferの形式でバイナリデータを送信したいが、それをBodyInitに変換していない。私はboopickleを使用しています。これは、バイナリByteBufferに、私のインスタンスのエンコードされたデータが含まれています。ByteBufferをScala.jsのBodyInitに変換するには?

私が提案したように、ByteBufferArrayBufferに変換してBodyInitにキャストしようとしました。しかし、Firefox 53.0.3でこのコードを実行すると、ランタイムエラーは発生しませんが、ペイロードには、バイナリデータそのものではなく、ちょうど[object ArrayBuffer]が含まれています。ここで

コードです:Scala.jsで

import scala.scalajs.js.typedarray.TypedArrayBufferOps._ 
import boopickle.Default._ 
import org.scalajs.dom.experimental.BodyInit 
import org.scalajs.dom.experimental.beacon._ 

case class Message(firstName: String, lastName: String) 
val message = Message("John", "Doe") 
val data = Pickle.intoBytes(message).arrayBuffer() 
dom.window.navigator.sendBeacon("/api", data.asInstanceOf[BodyInit]) 

答えて

1

TL; DRを行います代わりに:

val data = Pickle.intoBytes(message).typedArray() 
dom.window.navigator.sendBeacon("/api", data.asInstanceOf[BodyInit]) 

は、MozillaのsendBeaconで受け付けられていないより低レベルの構造体であるため(ArrayBufferViewを受け入れる)、arrayBuffer()ではありません。

また、ByteBufferは、基礎をなすバッファの一部を表すに過ぎないため、ByteBuffer上にそれ自身でarrayBuffer()が一般的に無意味であることにも注意してください。 arrayBufferOffset()も使用する必要があります。

+0

ありがとう!それは私のためにそれをしました。バウンティはあなたの2時間後です。 –

2

、ダイレクトたByteBufferをTypedArraysが付いています。したがって

、あなたのByteBufferを割り当てたときに、それが直接的であることを確認してください:あなたは根本的TypedArrayへのアクセスを得るためにTypedArrayBufferOpsを使用することができ、

val buf = ByteBuffer.allocateDirect(1024) 

その後:

import scala.scalajs.js.typedarray.TypedArrayBufferOps._ 
sendBeacon("http://foo.bar/", buf.typedArray) 
+0

残念ながら、これは機能しません。 '[error] found:scala.scalajs.js.typedarray.Int8Array [エラー]必須:org.scalajs.dom.experimental.BodyInit [エラー](これまでのところ)scala.scalajs.js | [scala.scalajs .js。| [scala.scalajs.js。| [org.scalajs.dom.raw.Blob、org.scalajs.dom.crypto.BufferSource]、org.scalajs.dom.raw.FormData]、String] '。私はboopickleを使用しているので、次のように試してみました: 'Pickle.intoBytes(message).arrayBuffer()。asInstanceOf [BufferSource]'、これはコンパイルされますが、送信されるペイロードは単に '[object ArrayBuffer]'です違う。 –

+0

私は参照してください。この場合、私はあなたを助けるためにさらに多くの情報が必要です。あなたの質問をサンプルコードで更新してください。現在の状態では、あなたが話している正確なAPIがわからないので、私はあなたを助けることができません。 – gzm0

+0

私が理解できる限り、Scala.js DOM APIは古くなっています。フェッチ仕様は、「ArrayBuffer」が許容可能なデータ型であることを明確に述べている。 'BodyInit'にキャストしようとしましたか? – gzm0

関連する問題