如何ES6代理ArrayBuffer或Uint8Array?

时间:2017-10-06 15:28:33

标签: javascript arraybuffer webcryptoapi es6-proxy

这些工作:

crypto.subtle.digest('SHA-512', new Uint8Array([0]))
crypto.subtle.digest('SHA-512', new Uint8Array([0]).buffer)

这些不是:

crypto.subtle.digest('SHA-512', new Proxy(new Uint8Array([0]),{}))
crypto.subtle.digest('SHA-512', new Proxy(new Uint8Array([0]).buffer,{})

错误:

Failed to execute 'digest' on 'SubtleCrypto': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'

instanceof Uint8Arrayinstanceof ArrayBuffer在两种情况下都返回true。

1 个答案:

答案 0 :(得分:2)

digest is specified by its IDL interface仅接受BufferSourceeither an ArrayBufferView or an ArrayBuffer。此IDL级别的输入表明正确的实现将断然拒绝任何没有正确内部类型的输入。

您可能想要使用Proxy的任何技巧都不能用于digest。相反,您可以执行代理技巧,在将数据传递到ArrayBuffer之前立即获得所需的确切digest

例如,这里有一个伪造buffer的代理,它与内部对象的buffer不同。 buffer是真实的,因此可以传递到digest,但它是由Proxy魔法创建的:

var proxy = new Proxy(new Uint8Array([0]), {
                          get:function(obj, prop) {
                              if(prop=="buffer"){ return new Uint8Array([42]).buffer }
                              else { return obj[prop]; }
                          }
            });
crypto.subtle.digest('SHA-512', proxy.buffer)

如果无法生成缓冲区(例如,如果它太大而无法放入RAM),那么您目前必须依赖SubtleCrypto之外的其他内容。

这似乎是与W3C一起提出的一个很好的观点,例如,支持update机制来迭代收集输入。