blob: ff78d7de5a101065bb03289d1d65154779e670d7 [file] [log] [blame] [edit]
// 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,
}
}