jsObjectToStringMap converts a flat JS object {k: "v", ...} into a Go map[string]string. Non-string values are stringified via Object.toString. A null/undefined input yields a nil map.
(v js.Value)
| 71 | // map[string]string. Non-string values are stringified via Object.toString. |
| 72 | // A null/undefined input yields a nil map. |
| 73 | func jsObjectToStringMap(v js.Value) map[string]string { |
| 74 | if v.Type() != js.TypeObject { |
| 75 | return nil |
| 76 | } |
| 77 | keys := js.Global().Get("Object").Call("keys", v) |
| 78 | out := make(map[string]string, keys.Length()) |
| 79 | for i := 0; i < keys.Length(); i++ { |
| 80 | k := keys.Index(i).String() |
| 81 | val := v.Get(k) |
| 82 | if val.Type() == js.TypeString { |
| 83 | out[k] = val.String() |
| 84 | } else { |
| 85 | out[k] = val.Call("toString").String() |
| 86 | } |
| 87 | } |
| 88 | return out |
| 89 | } |
| 90 | |
| 91 | // jsToMessages decodes a JS array of {role, content} objects into a slice of |
| 92 | // chat.Message. We round-trip through JSON so any extra fields the JS side |