| // Copyright 2025 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package pubsub |
| |
| import ( |
| pb "cloud.google.com/go/pubsub/apiv1/pubsubpb" |
| ) |
| |
| // MessageTransform is a single instance of a message transformation to apply to messages. |
| type MessageTransform struct { |
| // The transform to apply to messages. |
| // If multiple JavaScriptUDF's are specified on a resource, |
| // each must have a unique `function_name`. |
| Transform Transform |
| |
| // If true, the transform is disabled and will not be applied to |
| // messages. Defaults to `false`. |
| Disabled bool |
| } |
| |
| func messageTransformsToProto(m []MessageTransform) []*pb.MessageTransform { |
| if m == nil { |
| return nil |
| } |
| var transforms []*pb.MessageTransform |
| for _, mt := range m { |
| switch transform := mt.Transform.(type) { |
| case JavaScriptUDF: |
| transforms = append(transforms, &pb.MessageTransform{ |
| Disabled: mt.Disabled, |
| Transform: transform.toProto(), |
| }) |
| default: |
| } |
| } |
| return transforms |
| } |
| |
| func protoToMessageTransforms(m []*pb.MessageTransform) []MessageTransform { |
| if m == nil { |
| return nil |
| } |
| var transforms []MessageTransform |
| for _, mt := range m { |
| switch t := mt.Transform.(type) { |
| case *pb.MessageTransform_JavascriptUdf: |
| transform := MessageTransform{ |
| Transform: protoToJavaScriptUDF(t), |
| Disabled: mt.Disabled, |
| } |
| transforms = append(transforms, transform) |
| default: |
| } |
| } |
| return transforms |
| } |
| |
| // Transform represents the type of transforms that can be applied to messages. |
| // Currently JavaScriptUDF is the only type that satisfies this. |
| type Transform interface { |
| isTransform() bool |
| } |
| |
| // JavaScriptUDF is a user-defined JavaScript function |
| // that can transform or filter a Pub/Sub message. |
| type JavaScriptUDF struct { |
| // Name of the JavaScript function that should applied to Pub/Sub |
| // messages. |
| FunctionName string |
| |
| // JavaScript code that contains a function `function_name` with the |
| // below signature: |
| // |
| // /** |
| // * Transforms a Pub/Sub message. |
| // |
| // * @return {(Object<string, (string | Object<string, string>)>|null)} - To |
| // * filter a message, return `null`. To transform a message return a map |
| // * with the following keys: |
| // * - (required) 'data' : {string} |
| // * - (optional) 'attributes' : {Object<string, string>} |
| // * Returning empty `attributes` will remove all attributes from the |
| // * message. |
| // * |
| // * @param {(Object<string, (string | Object<string, string>)>} Pub/Sub |
| // * message. Keys: |
| // * - (required) 'data' : {string} |
| // * - (required) 'attributes' : {Object<string, string>} |
| // * |
| // * @param {Object<string, any>} metadata - Pub/Sub message metadata. |
| // * Keys: |
| // * - (required) 'message_id' : {string} |
| // * - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format |
| // * - (optional) 'ordering_key': {string} |
| // */ |
| // |
| // function <function_name>(message, metadata) { |
| // } |
| Code string |
| } |
| |
| var _ Transform = (*JavaScriptUDF)(nil) |
| |
| func (i JavaScriptUDF) isTransform() bool { |
| return true |
| } |
| |
| func (j *JavaScriptUDF) toProto() *pb.MessageTransform_JavascriptUdf { |
| return &pb.MessageTransform_JavascriptUdf{ |
| JavascriptUdf: &pb.JavaScriptUDF{ |
| FunctionName: j.FunctionName, |
| Code: j.Code, |
| }, |
| } |
| } |
| |
| func protoToJavaScriptUDF(m *pb.MessageTransform_JavascriptUdf) JavaScriptUDF { |
| return JavaScriptUDF{ |
| FunctionName: m.JavascriptUdf.FunctionName, |
| Code: m.JavascriptUdf.Code, |
| } |
| } |