Skip to content

Commit 5ec827f

Browse files
committed
Merge remote-tracking branch 'origin/@invertase/fix-rtdb-instance-params' into @invertase/fix-rtdb-instance-params
2 parents 8219434 + a5a4244 commit 5ec827f

File tree

5 files changed

+169
-11
lines changed

5 files changed

+169
-11
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "firebase-functions",
3-
"version": "7.2.3",
3+
"version": "7.2.5",
44
"description": "Firebase SDK for Cloud Functions",
55
"keywords": [
66
"firebase",
@@ -123,6 +123,21 @@
123123
"import": "./lib/esm/v2/providers/https.mjs",
124124
"require": "./lib/v2/providers/https.js"
125125
},
126+
"./ai": {
127+
"types": "./lib/v2/providers/ai/index.d.ts",
128+
"import": "./lib/esm/v2/providers/ai/index.mjs",
129+
"require": "./lib/v2/providers/ai/index.js"
130+
},
131+
"./ai/types/gemini/v1beta": {
132+
"types": "./lib/v2/providers/ai/types/gemini/v1beta/index.d.ts",
133+
"import": "./lib/esm/v2/providers/ai/types/gemini/v1beta/index.mjs",
134+
"require": "./lib/v2/providers/ai/types/gemini/v1beta/index.js"
135+
},
136+
"./ai/types/vertex/v1beta1": {
137+
"types": "./lib/v2/providers/ai/types/vertex/v1beta1/index.d.ts",
138+
"import": "./lib/esm/v2/providers/ai/types/vertex/v1beta1/index.mjs",
139+
"require": "./lib/v2/providers/ai/types/vertex/v1beta1/index.js"
140+
},
126141
"./pubsub": {
127142
"types": "./lib/v2/providers/pubsub.d.ts",
128143
"import": "./lib/esm/v2/providers/pubsub.mjs",
@@ -228,6 +243,21 @@
228243
"import": "./lib/esm/v2/providers/https.mjs",
229244
"require": "./lib/v2/providers/https.js"
230245
},
246+
"./v2/ai": {
247+
"types": "./lib/v2/providers/ai/index.d.ts",
248+
"import": "./lib/esm/v2/providers/ai/index.mjs",
249+
"require": "./lib/v2/providers/ai/index.js"
250+
},
251+
"./v2/ai/types/gemini/v1beta": {
252+
"types": "./lib/v2/providers/ai/types/gemini/v1beta/index.d.ts",
253+
"import": "./lib/esm/v2/providers/ai/types/gemini/v1beta/index.mjs",
254+
"require": "./lib/v2/providers/ai/types/gemini/v1beta/index.js"
255+
},
256+
"./v2/ai/types/vertex/v1beta1": {
257+
"types": "./lib/v2/providers/ai/types/vertex/v1beta1/index.d.ts",
258+
"import": "./lib/esm/v2/providers/ai/types/vertex/v1beta1/index.mjs",
259+
"require": "./lib/v2/providers/ai/types/vertex/v1beta1/index.js"
260+
},
231261
"./v2/pubsub": {
232262
"types": "./lib/v2/providers/pubsub.d.ts",
233263
"import": "./lib/esm/v2/providers/pubsub.mjs",
@@ -367,6 +397,15 @@
367397
"https": [
368398
"lib/v2/providers/https"
369399
],
400+
"ai": [
401+
"lib/v2/providers/ai"
402+
],
403+
"ai/types/gemini/v1beta": [
404+
"lib/v2/providers/ai/types/gemini/v1beta"
405+
],
406+
"ai/types/vertex/v1beta1": [
407+
"lib/v2/providers/ai/types/vertex/v1beta1"
408+
],
370409
"pubsub": [
371410
"lib/v2/providers/pubsub"
372411
],
@@ -457,6 +496,15 @@
457496
"v2/https": [
458497
"lib/v2/providers/https"
459498
],
499+
"v2/ai": [
500+
"lib/v2/providers/ai"
501+
],
502+
"v2/ai/types/gemini/v1beta": [
503+
"lib/v2/providers/ai/types/gemini/v1beta"
504+
],
505+
"v2/ai/types/vertex/v1beta1": [
506+
"lib/v2/providers/ai/types/vertex/v1beta1"
507+
],
460508
"v2/pubsub": [
461509
"lib/v2/providers/pubsub"
462510
],

spec/v2/providers/pubsub.spec.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,114 @@ describe("onMessagePublished", () => {
220220
expect(result).to.deep.equal({ test: "data" });
221221
});
222222

223+
describe("event.data.message wrapping (POJO -> Message instance)", () => {
224+
const rawMessagePOJO = {
225+
messageId: "pojo-msg-id",
226+
data: Buffer.from(JSON.stringify({ regression: "test" })).toString("base64"),
227+
attributes: { env: "test" },
228+
orderingKey: "key1",
229+
publishTime: new Date().toISOString(),
230+
};
231+
232+
function makeRawEvent(
233+
message: any,
234+
subscription = "projects/aProject/subscriptions/aSub"
235+
): CloudEvent<any> {
236+
return {
237+
specversion: "1.0",
238+
source: "//pubsub.googleapis.com/projects/aProject/topics/topic",
239+
id: "raw-event-id",
240+
type: EVENT_TRIGGER.eventType,
241+
time: rawMessagePOJO.publishTime,
242+
data: { message, subscription },
243+
};
244+
}
245+
246+
it("should convert a raw POJO message into a Message instance on event.data.message", async () => {
247+
let capturedMessage: any;
248+
const func = pubsub.onMessagePublished("topic", (event) => {
249+
capturedMessage = event.data.message;
250+
});
251+
252+
// Pass a raw POJO, NOT a Message instance — this is what the runtime delivers
253+
await func(makeRawEvent({ ...rawMessagePOJO }));
254+
255+
expect(capturedMessage).to.be.an.instanceOf(pubsub.Message);
256+
});
257+
258+
it("should provide a working .json getter on event.data.message when input is a raw POJO", async () => {
259+
let json: unknown;
260+
const func = pubsub.onMessagePublished("topic", (event) => {
261+
json = event.data.message.json;
262+
});
263+
264+
await func(makeRawEvent({ ...rawMessagePOJO }));
265+
266+
expect(json).to.deep.equal({ regression: "test" });
267+
});
268+
269+
it("should preserve all Message fields when wrapping a raw POJO", async () => {
270+
let msg: any;
271+
const func = pubsub.onMessagePublished("topic", (event) => {
272+
msg = event.data.message;
273+
});
274+
275+
await func(makeRawEvent({ ...rawMessagePOJO }));
276+
277+
expect(msg.messageId).to.equal("pojo-msg-id");
278+
expect(msg.data).to.equal(rawMessagePOJO.data);
279+
expect(msg.attributes).to.deep.equal({ env: "test" });
280+
expect(msg.orderingKey).to.equal("key1");
281+
expect(msg.publishTime).to.equal(rawMessagePOJO.publishTime);
282+
});
283+
284+
it("should not re-wrap if event.data.message is already a Message instance", async () => {
285+
const original = new pubsub.Message(rawMessagePOJO);
286+
let capturedMessage: any;
287+
const func = pubsub.onMessagePublished("topic", (event) => {
288+
capturedMessage = event.data.message;
289+
});
290+
291+
await func(makeRawEvent(original));
292+
293+
expect(capturedMessage).to.equal(original); // same reference
294+
expect(capturedMessage.json).to.deep.equal({ regression: "test" });
295+
});
296+
297+
it("should throw on a malformed event without a message property", async () => {
298+
const func = pubsub.onMessagePublished("topic", () => undefined);
299+
const badEvent: CloudEvent<any> = {
300+
specversion: "1.0",
301+
source: "//pubsub.googleapis.com/projects/aProject/topics/topic",
302+
id: "bad-event",
303+
type: EVENT_TRIGGER.eventType,
304+
time: new Date().toISOString(),
305+
data: { subscription: "sub" }, // no message!
306+
};
307+
308+
try {
309+
await func(badEvent);
310+
expect.fail("should have thrown");
311+
} catch (err: any) {
312+
expect(err.message).to.match(/missing 'message' property/i);
313+
}
314+
});
315+
316+
it("should make event.data.message.json and event.message.json return the same value", async () => {
317+
let v2Json: unknown;
318+
let v1Json: unknown;
319+
const func = pubsub.onMessagePublished("topic", (event) => {
320+
v2Json = event.data.message.json;
321+
v1Json = (event as any).message.json;
322+
});
323+
324+
await func(makeRawEvent({ ...rawMessagePOJO }));
325+
326+
expect(v2Json).to.deep.equal({ regression: "test" });
327+
expect(v1Json).to.deep.equal({ regression: "test" });
328+
});
329+
});
330+
223331
describe("v1-compatible getters", () => {
224332
let capturedEvent: any;
225333
const messageData = {

src/v2/providers/ai/index.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,24 +61,24 @@ export const rpcCodeMap: Record<FunctionsErrorCode, number> = {
6161
};
6262

6363
import {
64-
GenerateContentRequest as VertexV1Beta1GenerateContentRequest,
65-
GenerateContentResponse as VertexV1Beta1GenerateContentResponse,
64+
type GenerateContentRequest as VertexV1Beta1GenerateContentRequest,
65+
type GenerateContentResponse as VertexV1Beta1GenerateContentResponse,
6666
requestTypeName as vertexV1Beta1RequestTypeName,
6767
responseTypeName as vertexV1Beta1ResponseTypeName,
6868
} from "./types/vertex/v1beta1";
6969

7070
import {
71-
GenerateContentRequest as GeminiV1BetaGenerateContentRequest,
72-
GenerateContentResponse as GeminiV1BetaGenerateContentResponse,
71+
type GenerateContentRequest as GeminiV1BetaGenerateContentRequest,
72+
type GenerateContentResponse as GeminiV1BetaGenerateContentResponse,
7373
requestTypeName as geminiV1BetaRequestTypeName,
7474
responseTypeName as geminiV1BetaResponseTypeName,
7575
} from "./types/gemini/v1beta";
7676

7777
export {
78-
VertexV1Beta1GenerateContentRequest,
79-
VertexV1Beta1GenerateContentResponse,
80-
GeminiV1BetaGenerateContentRequest,
81-
GeminiV1BetaGenerateContentResponse,
78+
type VertexV1Beta1GenerateContentRequest,
79+
type VertexV1Beta1GenerateContentResponse,
80+
type GeminiV1BetaGenerateContentRequest,
81+
type GeminiV1BetaGenerateContentResponse,
8282
};
8383
type MultipleLocationsIf<Allowed extends boolean> = Allowed extends true ? string[] : never;
8484

src/v2/providers/pubsub.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ export function onMessagePublished<T = any>(
346346
pubsubData.message instanceof Message
347347
? pubsubData.message
348348
: new Message<T>(pubsubData.message);
349+
350+
(pubsubData as any).message = v2Message;
349351
} else {
350352
throw new Error("Malformed Pub/Sub event: missing 'message' property.");
351353
}

0 commit comments

Comments
 (0)