mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-16 23:53:33 +08:00
40 lines
861 B
Go
40 lines
861 B
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"unicode/utf16"
|
|
)
|
|
|
|
// Turn metadata is also used as an HTTP header, including when carried in WS JSON.
|
|
func marshalCodexTurnMetadata(metadata map[string]any) ([]byte, error) {
|
|
raw, err := json.Marshal(metadata)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for i, b := range raw {
|
|
if b < 0x7f {
|
|
continue
|
|
}
|
|
out := make([]byte, 0, len(raw)+16)
|
|
out = append(out, raw[:i]...)
|
|
appendEscape := func(r rune) {
|
|
const hex = "0123456789abcdef"
|
|
out = append(out, '\\', 'u', hex[r>>12&15], hex[r>>8&15], hex[r>>4&15], hex[r&15])
|
|
}
|
|
for _, r := range string(raw[i:]) {
|
|
switch {
|
|
case r < 0x7f:
|
|
out = append(out, byte(r))
|
|
case r <= 0xffff:
|
|
appendEscape(r)
|
|
default:
|
|
high, low := utf16.EncodeRune(r)
|
|
appendEscape(high)
|
|
appendEscape(low)
|
|
}
|
|
}
|
|
return out, nil
|
|
}
|
|
return raw, nil
|
|
}
|