A newer version of this documentation is available.

View Latest

Function: Basic Binary KV

    March 9, 2025
    + 12

    Goal: Show Basic Bucket Op Binary Write and Read.

    • This function basicBinaryKV demonstrates creating, marshalling and unmarshalling binary docs.

    • Requires Eventing Storage (or metadata collection) and a "source" collection.

    • Needs a Binding of type "bucket alias" (as documented in the Scriptlet).

    • Will operate on any mutation where the KEY or meta.id starts with "basicbinarykv".

    • The function will create one binary document and write it then read it back.

    • The document written will be read back and verified demonstrating binary marshalling and unmarshalling.

    • On a second deployment the binary doc that was written on the first deployment will cause a mutation.

    javascript
    // To run configure the settings for this Function, basicBinaryKV, as follows: // // Version 7.1+ // "Function Scope" // *.* (or try bulk.data if non-privileged) // Version 7.0+ // "Listen to Location" // bulk.data.source // "Eventing Storage" // rr100.eventing.metadata // Binding(s) // 1. "binding type", "alias name...", "bucket.scope.collection", "Access" // "bucket alias", "src_col", "bulk.data.source", "read and write" // // Version 6.6.2 // "Source Bucket" // source // "MetaData Bucket" // metadata // Binding(s) // 1. "binding type", "alias name...", "bucket", "Access" // "bucket alias", "src_col", "source", "read and write" function OnUpdate(doc, meta) { if (meta.id === "bindoc_kvput") { // if we deploy/undeploy/deploy we will see the document we created on the first deploy // Note that meta.datatype === "binary" on this mutation. log ("4. received binary mutation",doc,"unmarshalled ("+new Uint8Array(doc)+") meta:",meta); log ("5. deleting the binary doc with KEY 'bindoc_kvput'"); delete src_col["bindoc_kvput"]; return; } if (!meta.id.startsWith("basicbinarykv") || src_col["bindoc_kvput"]) return; var arr = new Uint8Array([1, 0, 2, 3]); var bindoc = arr.buffer; // Write via a Basic Bucket Op, i.e. JavaScript map exposed via a bucket binding. // Note the JavaScript map only returns the doc (unlike the mutations received via // OnUpate which also has meta) so do not know if we just read a binary doc or text src_col["bindoc_kvput"] = bindoc; log ("1. wrote bindoc",bindoc,"unmarshalled ("+new Uint8Array(bindoc)+")"); // Read via a Basic Bucket Op, i.e. JavaScript map exposed via a bucket binding var retdoc = src_col["bindoc_kvput"]; log ("2. read retdoc",retdoc) log ("3. test bindoc("+ new Uint8Array(bindoc)+") == retdoc("+ new Uint8Array(retdoc)+") => " + buffersEqual(bindoc,retdoc)); } function buffersEqual(buf1, buf2) { if (buf1.byteLength != buf2.byteLength) return false; var dv1 = new Uint8Array(buf1); var dv2 = new Uint8Array(buf2); for (var i = 0; i != buf1.byteLength; i++) { if (dv1[i] != dv2[i]) return false; } return true; }