Skip to content

Commit 1c1d1b2

Browse files
authored
v0.4.0 (#60)
* remove cloud namespace (#47) * remove event.app (#53) * removed wrapping of old style events * changed interface definitions to match new EventFlow format * change version to 0.4.0
1 parent e669c43 commit 1c1d1b2

23 files changed

+256
-485
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ lib
77
coverage
88
node_modules
99
typings
10+
.vscode

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"typescript.tsdk": "./node_modules/typescript/lib"
3+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "firebase-functions",
3-
"version": "0.3.3",
3+
"version": "0.4.0",
44
"description": "Node helpers for Firebase Functions.",
55
"main": "lib/index.js",
66
"scripts": {

src/builder.ts

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import * as _ from 'lodash';
2-
31
import { FirebaseEnv } from './env';
4-
import { FirebaseEventMetadata, Event, RawEvent } from './event';
2+
import { Event, RawEvent } from './event';
53

64
export interface TriggerAnnotated {
75
__trigger: TriggerDefinition;
@@ -12,49 +10,39 @@ export interface TriggerDefinition {
1210
event: string;
1311
}
1412

13+
/* A CloudFunction is both an object that exports its trigger definitions at __trigger and
14+
can be called as a function using the raw JS API for Google Cloud Functions. */
15+
export type CloudFunction = TriggerAnnotated & ((event: RawEvent) => PromiseLike<any> | any);
16+
1517
export class FunctionBuilder {
1618
protected _env: FirebaseEnv;
1719

1820
constructor(env: FirebaseEnv) {
1921
this._env = env;
2022
}
2123

22-
protected _isEventNewFormat(event: {action?: string}): boolean {
23-
return /sources\/[^/]+\/actions\/[^/]+/.test(event.action);
24-
}
25-
2624
protected _toTrigger(event?: string): TriggerDefinition {
2725
throw new Error('Unimplemented _toTrigger');
2826
}
2927

30-
protected _wrapHandler<EventData, OldRawType>(
31-
handler: (event: Event<EventData>) => PromiseLike<any> | any,
32-
event: string,
33-
additionalMeta: FirebaseEventMetadata,
34-
): TriggerAnnotated & ((raw: OldRawType | RawEvent) => PromiseLike<any> | any) {
35-
const wrapped: any = (payload: OldRawType | RawEvent) => {
36-
const metadata = <FirebaseEventMetadata>_.extend({}, additionalMeta, payload);
37-
return handler(new Event(metadata, this._dataConstructor<EventData, OldRawType>(payload)));
38-
};
39-
40-
return this._makeHandler<EventData>(wrapped, event);
41-
}
42-
4328
protected _makeHandler<EventData>(
44-
fn: (event: Event<EventData>) => PromiseLike<any> | any,
29+
fn: (event?: Event<EventData>) => PromiseLike<any> | any,
4530
event: string,
46-
): TriggerAnnotated & ((raw: RawEvent) => PromiseLike<any> | any) {
31+
): CloudFunction {
32+
let fnWithDataConstructor: any = (payload: RawEvent) => {
33+
return fn(new Event(payload, this._dataConstructor<EventData>(payload)));
34+
};
4735
let handler: any = (payload) => {
4836
return this._env.ready().then(function() {
49-
return fn(payload);
37+
return fnWithDataConstructor(payload);
5038
});
5139
};
5240
handler.__trigger = this._toTrigger(event);
5341

5442
return handler;
5543
}
5644

57-
protected _dataConstructor<EventData, OldRawType>(raw: OldRawType | RawEvent): EventData {
58-
return <any>raw;
45+
protected _dataConstructor<EventData>(raw: RawEvent): EventData {
46+
return raw.data;
5947
}
6048
}

src/builders/database-builder.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { AuthMode, default as Apps } from '../apps';
2+
import DatabaseDeltaSnapshot from '../database/delta-snapshot';
3+
import { Event } from '../event';
4+
import { FunctionBuilder, TriggerDefinition, CloudFunction } from '../builder';
5+
import { normalizePath } from '../utils';
6+
import { FirebaseEnv } from '../env';
7+
8+
export interface DatabaseTriggerDefinition extends TriggerDefinition {
9+
path: string;
10+
}
11+
12+
export interface DatabaseEventData {
13+
data: any;
14+
delta: any;
15+
}
16+
17+
export interface DatabaseEvent extends Event<DatabaseEventData> {
18+
auth: AuthMode;
19+
}
20+
21+
export default class DatabaseBuilder extends FunctionBuilder {
22+
private _path: string;
23+
private _apps: Apps;
24+
25+
constructor(env: FirebaseEnv, apps: Apps) {
26+
super(env);
27+
this._apps = apps;
28+
}
29+
30+
path(path: string): DatabaseBuilder {
31+
this._path = this._path || '';
32+
this._path += normalizePath(path);
33+
return this;
34+
}
35+
36+
onWrite(
37+
handler: (event: Event<DatabaseDeltaSnapshot>) => PromiseLike<any> | any
38+
): CloudFunction {
39+
if (!this._path) {
40+
throw new Error('Must call .path(pathValue) before .on() for database function definitions.');
41+
}
42+
return this._makeHandler(handler, 'data.write');
43+
}
44+
45+
protected _toTrigger(event?: string): DatabaseTriggerDefinition {
46+
return {
47+
service: 'firebase.database',
48+
event: 'write',
49+
path: this._path,
50+
};
51+
}
52+
53+
protected _dataConstructor(payload: any): DatabaseDeltaSnapshot {
54+
return new DatabaseDeltaSnapshot(this._apps, payload);
55+
}
56+
}

src/cloud/https-builder.ts renamed to src/builders/https-builder.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,6 @@ export {
77
}
88

99
export default class CloudHttpsBuilder extends FunctionBuilder {
10-
on(
11-
event: string, handler: (req: Request, resp: Response) => void
12-
): ((req: Request, resp: Response) => void) & TriggerAnnotated {
13-
if (event !== 'request') {
14-
throw new Error(`Provider cloud.http does not support event type "${event}"`);
15-
}
16-
17-
console.warn(
18-
'DEPRECATION NOTICE: cloud.http().on("request", handler) is deprecated, use cloud.http().onRequest(handler)'
19-
);
20-
21-
return this.onRequest(handler);
22-
}
23-
2410
onRequest(
2511
handler: (req: Request, resp: Response) => void
2612
): ((req: Request, resp: Response) => void) & TriggerAnnotated {
Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { FunctionBuilder, TriggerAnnotated, TriggerDefinition } from '../builder';
2-
import { Event, RawEvent } from '../event';
1+
import { FunctionBuilder, TriggerDefinition, CloudFunction } from '../builder';
2+
import { Event } from '../event';
33
import { FirebaseEnv } from '../env';
44

55
export class PubsubMessage {
@@ -38,7 +38,7 @@ export interface CloudPubsubTriggerDefinition extends TriggerDefinition {
3838
topic: string;
3939
}
4040

41-
export default class CloudPubsubBuilder extends FunctionBuilder {
41+
export default class PubsubBuilder extends FunctionBuilder {
4242
topic: string;
4343
event: string;
4444

@@ -47,45 +47,20 @@ export default class CloudPubsubBuilder extends FunctionBuilder {
4747
this.topic = topic;
4848
}
4949

50-
on(
51-
event: string, handler: (event: Event<PubsubMessage>) => PromiseLike<any> | any,
52-
): TriggerAnnotated & ((event: RawEvent | any) => PromiseLike<any> | any) {
53-
if (event !== 'message') {
54-
throw new Error(`Provider cloud.pubsub does not support event type "${event}"`);
55-
}
56-
57-
console.warn(
58-
'DEPRECATION NOTICE: cloud.pubsub("topic").on("message", handler) is deprecated, ' +
59-
'use cloud.pubsub("topic").onPublish(handler)'
60-
);
61-
return this._makeHandler(handler, 'message');
62-
}
63-
6450
onPublish(
65-
handler: (event: Event<PubsubMessage>) => PromiseLike<any> | any
66-
): TriggerAnnotated & ((event: RawEvent | any) => PromiseLike<any> | any) {
67-
return this._wrapHandler(handler, 'message', {
68-
action: 'sources/cloud.pubsub/actions/publish',
69-
resource: 'projects/' + process.env.GCLOUD_PROJECT + '/topics/' + this.topic,
70-
});
51+
handler: (event: Event<PubsubMessage>) => PromiseLike<any> | any): CloudFunction {
52+
return this._makeHandler(handler, 'topic.publish');
7153
}
7254

7355
protected _toTrigger(event: string): CloudPubsubTriggerDefinition {
7456
return {
7557
service: 'cloud.pubsub',
76-
event: event,
58+
event: 'message',
7759
topic: this.topic,
7860
};
7961
}
8062

8163
protected _dataConstructor(payload: any): PubsubMessage {
82-
if (this._isEventNewFormat(payload)) {
83-
return new PubsubMessage(payload.data);
84-
}
85-
86-
return new PubsubMessage({
87-
data: new Buffer(JSON.stringify(payload), 'utf8').toString('base64'),
88-
attributes: {},
89-
});
64+
return new PubsubMessage(payload.data);
9065
}
9166
}

src/cloud/storage-builder.ts renamed to src/builders/storage-builder.ts

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { FunctionBuilder, TriggerDefinition, TriggerAnnotated } from '../builder';
2-
import { Event, RawEvent } from '../event';
1+
import { FunctionBuilder, TriggerDefinition, CloudFunction } from '../builder';
2+
import { Event } from '../event';
33
import { FirebaseEnv } from '../env';
44

55
export interface StorageObjectAccessControl {
@@ -70,34 +70,17 @@ export default class CloudStorageBuilder extends FunctionBuilder {
7070
this.bucket = bucket;
7171
}
7272

73-
on(
74-
event: string, handler: (event: Event<StorageObject>) => PromiseLike<any> | any
75-
): TriggerAnnotated & ((event: RawEvent) => PromiseLike<any> | any) {
76-
if (event !== 'change') {
77-
throw new Error(`Provider cloud.storage does not support event type "${event}"`);
78-
}
79-
80-
console.warn(
81-
'DEPRECATION NOTICE: cloud.storage("bucket").on("change", handler) is deprecated,' +
82-
'use cloud.storage("bucket").onChange(handler)'
83-
);
84-
return this._makeHandler(handler, 'change');
85-
}
86-
8773
onChange(
8874
handler: (event: Event<StorageObject>) => PromiseLike<any>
89-
): TriggerAnnotated & ((event: Event<StorageObject>) => PromiseLike<any> | any) {
90-
return this._wrapHandler(handler, 'change', {
91-
action: 'sources/cloud.storage/actions/change',
92-
resource: 'projects/' + process.env.GCLOUD_PROJECT + '/buckets/' + this.bucket,
93-
});
75+
): CloudFunction {
76+
return this._makeHandler(handler, 'object.change');
9477
}
9578

9679
protected _toTrigger(event: string): CloudStorageTriggerDefinition {
9780
return {
9881
service: 'cloud.storage',
9982
bucket: this.bucket,
100-
event,
83+
event: 'object',
10184
};
10285
}
10386
}

src/cloud/index.ts

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/database/builder.ts

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)