in invoker/core/src/main/java/com/google/cloud/functions/invoker/CloudEvents.java [143:183]
final Event convertToLegacyEvent(CloudEvent cloudEvent) {
/*
Ex 1: "//firebaseauth.googleapis.com/projects/my-project-id"
m.group(0): "//firebaseauth.googleapis.com/projects/my-project-id"
m.group(1): "firebaseauth.googleapis.com"
m.group(2): "projects/my-project-id"
Ex 2: "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test"
m.group(0): "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test"
m.group(1): "pubsub.googleapis.com"
m.group(2): "projects/sample-project/topics/gcf-test"
*/
Matcher m = sourcePattern.matcher(cloudEvent.getSource().toString());
if (!m.find() || m.groupCount() != 2) {
throw new IllegalArgumentException(
String.format(
"Invalid CloudEvent source '%s', unable to parse into resource service and name",
cloudEvent.getSource().toString()));
}
String service = m.group(1);
String name = m.group(2);
String resource = String.format("%s/%s", name, cloudEvent.getSubject());
ParsedCloudEvent parsed = new ParsedCloudEvent(resource, service, name);
OffsetDateTime timestamp =
Optional.ofNullable(cloudEvent.getTime()).orElse(OffsetDateTime.now());
CloudFunctionsContext.Builder ctxBuilder =
CloudFunctionsContext.builder()
.setEventId(cloudEvent.getId())
.setEventType(this.legacyEventType)
.setResource(resource)
.setTimestamp(DateTimeFormatter.ISO_INSTANT.format(timestamp));
JsonObject data =
GSON.fromJson(
new String(cloudEvent.getData().toBytes(), java.nio.charset.StandardCharsets.UTF_8),
JsonObject.class);
return createLegacyEvent(parsed, ctxBuilder, data);
}