go.temporal.io/server@v1.23.0/common/persistence/serialization/blob.go (about) 1 // The MIT License 2 // 3 // Copyright (c) 2020 Temporal Technologies Inc. All rights reserved. 4 // 5 // Copyright (c) 2020 Uber Technologies, Inc. 6 // 7 // Permission is hereby granted, free of charge, to any person obtaining a copy 8 // of this software and associated documentation files (the "Software"), to deal 9 // in the Software without restriction, including without limitation the rights 10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 // copies of the Software, and to permit persons to whom the Software is 12 // furnished to do so, subject to the following conditions: 13 // 14 // The above copyright notice and this permission notice shall be included in 15 // all copies or substantial portions of the Software. 16 // 17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 // THE SOFTWARE. 24 25 package serialization 26 27 import ( 28 commonpb "go.temporal.io/api/common/v1" 29 enumspb "go.temporal.io/api/enums/v1" 30 "google.golang.org/protobuf/proto" 31 32 persistencespb "go.temporal.io/server/api/persistence/v1" 33 "go.temporal.io/server/common/codec" 34 ) 35 36 func HistoryBranchToBlob(info *persistencespb.HistoryBranch) (*commonpb.DataBlob, error) { 37 return proto3Encode(info) 38 } 39 40 func HistoryBranchFromBlob(blob []byte, encoding string) (*persistencespb.HistoryBranch, error) { 41 result := &persistencespb.HistoryBranch{} 42 return result, proto3Decode(blob, encoding, result) 43 } 44 45 func WorkflowExecutionInfoFromBlob(blob []byte, encoding string) (*persistencespb.WorkflowExecutionInfo, error) { 46 result := &persistencespb.WorkflowExecutionInfo{} 47 return result, proto3Decode(blob, encoding, result) 48 } 49 50 func WorkflowExecutionStateToBlob(info *persistencespb.WorkflowExecutionState) (*commonpb.DataBlob, error) { 51 return proto3Encode(info) 52 } 53 54 func WorkflowExecutionStateFromBlob(blob []byte, encoding string) (*persistencespb.WorkflowExecutionState, error) { 55 result := &persistencespb.WorkflowExecutionState{} 56 return result, proto3Decode(blob, encoding, result) 57 } 58 59 func TransferTaskInfoToBlob(info *persistencespb.TransferTaskInfo) (*commonpb.DataBlob, error) { 60 return proto3Encode(info) 61 } 62 63 func TransferTaskInfoFromBlob(blob []byte, encoding string) (*persistencespb.TransferTaskInfo, error) { 64 result := &persistencespb.TransferTaskInfo{} 65 return result, proto3Decode(blob, encoding, result) 66 } 67 68 func TimerTaskInfoToBlob(info *persistencespb.TimerTaskInfo) (*commonpb.DataBlob, error) { 69 return proto3Encode(info) 70 } 71 72 func TimerTaskInfoFromBlob(blob []byte, encoding string) (*persistencespb.TimerTaskInfo, error) { 73 result := &persistencespb.TimerTaskInfo{} 74 return result, proto3Decode(blob, encoding, result) 75 } 76 77 func ReplicationTaskInfoToBlob(info *persistencespb.ReplicationTaskInfo) (*commonpb.DataBlob, error) { 78 return proto3Encode(info) 79 } 80 81 func ReplicationTaskInfoFromBlob(blob []byte, encoding string) (*persistencespb.ReplicationTaskInfo, error) { 82 result := &persistencespb.ReplicationTaskInfo{} 83 return result, proto3Decode(blob, encoding, result) 84 } 85 86 func VisibilityTaskInfoToBlob(info *persistencespb.VisibilityTaskInfo) (*commonpb.DataBlob, error) { 87 return proto3Encode(info) 88 } 89 90 func VisibilityTaskInfoFromBlob(blob []byte, encoding string) (*persistencespb.VisibilityTaskInfo, error) { 91 result := &persistencespb.VisibilityTaskInfo{} 92 return result, proto3Decode(blob, encoding, result) 93 } 94 95 func ArchivalTaskInfoToBlob(info *persistencespb.ArchivalTaskInfo) (*commonpb.DataBlob, error) { 96 return proto3Encode(info) 97 } 98 99 func ArchivalTaskInfoFromBlob(blob []byte, encoding string) (*persistencespb.ArchivalTaskInfo, error) { 100 result := &persistencespb.ArchivalTaskInfo{} 101 return result, proto3Decode(blob, encoding, result) 102 } 103 104 func QueueMetadataToBlob(metadata *persistencespb.QueueMetadata) (*commonpb.DataBlob, error) { 105 // TODO change ENCODING_TYPE_JSON to ENCODING_TYPE_PROTO3 106 return encode(metadata, enumspb.ENCODING_TYPE_JSON) 107 } 108 109 func QueueMetadataFromBlob(blob []byte, encoding string) (*persistencespb.QueueMetadata, error) { 110 result := &persistencespb.QueueMetadata{} 111 return result, decode(blob, encoding, result) 112 } 113 114 func QueueStateToBlob(info *persistencespb.QueueState) (*commonpb.DataBlob, error) { 115 return proto3Encode(info) 116 } 117 118 func QueueStateFromBlob(blob []byte, encoding string) (*persistencespb.QueueState, error) { 119 result := &persistencespb.QueueState{} 120 return result, proto3Decode(blob, encoding, result) 121 } 122 123 func encode( 124 object proto.Message, 125 encoding enumspb.EncodingType, 126 ) (*commonpb.DataBlob, error) { 127 if object == nil { 128 return &commonpb.DataBlob{ 129 Data: nil, 130 EncodingType: encoding, 131 }, nil 132 } 133 134 switch encoding { 135 case enumspb.ENCODING_TYPE_JSON: 136 blob, err := codec.NewJSONPBEncoder().Encode(object) 137 if err != nil { 138 return nil, err 139 } 140 return &commonpb.DataBlob{ 141 Data: blob, 142 EncodingType: enumspb.ENCODING_TYPE_JSON, 143 }, nil 144 case enumspb.ENCODING_TYPE_PROTO3: 145 return proto3Encode(object) 146 default: 147 return nil, NewUnknownEncodingTypeError(encoding.String(), enumspb.ENCODING_TYPE_JSON, enumspb.ENCODING_TYPE_PROTO3) 148 } 149 } 150 151 func decode( 152 blob []byte, 153 encoding string, 154 result proto.Message, 155 ) error { 156 if blob == nil { 157 return nil 158 } 159 160 enc, _ := enumspb.EncodingTypeFromString(encoding) 161 switch enc { 162 case enumspb.ENCODING_TYPE_JSON: 163 return codec.NewJSONPBEncoder().Decode(blob, result) 164 case enumspb.ENCODING_TYPE_PROTO3: 165 return proto3Decode(blob, encoding, result) 166 default: 167 return NewUnknownEncodingTypeError(encoding, enumspb.ENCODING_TYPE_JSON, enumspb.ENCODING_TYPE_PROTO3) 168 } 169 } 170 171 func proto3Encode(m proto.Message) (*commonpb.DataBlob, error) { 172 blob := commonpb.DataBlob{EncodingType: enumspb.ENCODING_TYPE_PROTO3} 173 data, err := proto.Marshal(m) 174 if err != nil { 175 return nil, NewSerializationError(enumspb.ENCODING_TYPE_PROTO3, err) 176 } 177 blob.Data = data 178 return &blob, nil 179 } 180 181 func proto3Decode(blob []byte, encoding string, result proto.Message) error { 182 e, _ := enumspb.EncodingTypeFromString(encoding) 183 if e != enumspb.ENCODING_TYPE_PROTO3 { 184 return NewUnknownEncodingTypeError(encoding, enumspb.ENCODING_TYPE_PROTO3) 185 } 186 return Proto3Decode(blob, e, result) 187 } 188 189 func Proto3Decode(blob []byte, e enumspb.EncodingType, result proto.Message) error { 190 if e != enumspb.ENCODING_TYPE_PROTO3 { 191 return NewUnknownEncodingTypeError(e.String(), enumspb.ENCODING_TYPE_PROTO3) 192 } 193 if err := proto.Unmarshal(blob, result); err != nil { 194 return NewDeserializationError(enumspb.ENCODING_TYPE_PROTO3, err) 195 } 196 return nil 197 }