@@ -46,152 +46,152 @@ npn install --save laravel-echo-api-gateway
4646<details >
4747 <summary >Expand Bref-specific instructions</summary >
4848
49- #### A. When using Bref
50-
51- Next, when using Bref, we have to add some elements to our ` serverless.yml ` file. If using Vapor, these resources have
52- to be created by hand using the AWS CLI or console.
53-
54- Add a new function that will handle websocket events (messages etc):
55-
56- ``` yaml
57- functions :
58- # Add this function
59- websocket :
60- handler : handlers/websocket.php
61- layers :
62- - ${bref:layer.php-80}
63- events :
64- - websocket : $disconnect
65- - websocket : $default
66- ` ` `
67-
68- Add a resource to create and configure our DynamoDB table, where connections will be stored in:
69-
70- ` ` ` yaml
71- resources :
72- Resources :
73- # Add this resource
74- ConnectionsTable :
75- Type : AWS::DynamoDB::Table
76- Properties :
77- TableName : connections
78- AttributeDefinitions :
79- - AttributeName : connectionId
80- AttributeType : S
81- - AttributeName : channel
82- AttributeType : S
83- KeySchema :
84- - AttributeName : connectionId
85- KeyType : HASH
86- - AttributeName : channel
87- KeyType : RANGE
88- GlobalSecondaryIndexes :
89- - IndexName : lookup-by-channel
90- KeySchema :
91- - AttributeName : channel
92- KeyType : HASH
93- Projection :
94- ProjectionType : ALL
95- - IndexName : lookup-by-connection
96- KeySchema :
97- - AttributeName : connectionId
98- KeyType : HASH
99- Projection :
100- ProjectionType : ALL
101- BillingMode : PAY_PER_REQUEST
102- ` ` `
103-
104- Add the following ` iamRoleStatement` to enable our Lambda function to access the table:
105-
106- ` ` ` yaml
107- provider:
108- name: aws
109-
110- iamRoleStatements:
111- # Add this iamRoleStatement
112- - Effect: Allow
113- Action: [ dynamodb:Query, dynamodb:GetItem, dynamodb:PutItem, dynamodb:UpdateItem, dynamodb:DeleteItem, dynamodb:BatchWriteItem ]
114- Resource:
115- - !GetAtt ConnectionsTable.Arn
116- - !Join [ '', [ !GetAtt ConnectionsTable.Arn, '/index/*' ] ]
117- ` ` `
118-
119- Add an environment variable to autogenerate our websocket URL :
120-
121- ` ` ` yaml
122- provider:
123- name: aws
124-
125- environment:
126- # Add these variables
127- BROADCAST_DRIVER: laravel-echo-api-gateway
128- LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE: !Ref ConnectionsTable
129- LARAVEL_ECHO_API_GATEWAY_API_ID: !Ref WebsocketsApi
130- LARAVEL_ECHO_API_GATEWAY_API_STAGE: "${self:provider.stage}"
131- ` ` `
132-
133- Next, create the PHP handler file in `handlers/websocket.php`
134-
135- ` ` ` php
136- <?php
137-
138- use Georgeboot\L aravelEchoApiGateway\H andler;
139- use Illuminate\F oundation\A pplication;
140-
141- require __DIR__ . '/../vendor/autoload.php';
142-
143- /** @var Application $app */
144- $app = require __DIR__ . '/../bootstrap/app.php';
145-
146- $kernel = $app->make(Illuminate\C ontracts\C onsole\K ernel::class);
147- $kernel->bootstrap();
148-
149- return $app->make(Handler::class);
150- ` ` `
151-
152- Now, deploy your app by running `serverless deploy` or similar. Write down the websocket url the output gives you.
49+ #### A. When using Bref
50+
51+ Next, when using Bref, we have to add some elements to our `serverless.yml` file. If using Vapor, these resources have
52+ to be created by hand using the AWS CLI or console.
53+
54+ Add a new function that will handle websocket events (messages etc):
55+
56+ ```yaml
57+ functions:
58+ # Add this function
59+ websocket:
60+ handler: handlers/websocket.php
61+ layers:
62+ - ${bref:layer.php-80}
63+ events:
64+ - websocket: $disconnect
65+ - websocket: $default
66+ ```
67+
68+ Add a resource to create and configure our DynamoDB table, where connections will be stored in:
69+
70+ ```yaml
71+ resources:
72+ Resources:
73+ # Add this resource
74+ ConnectionsTable:
75+ Type: AWS::DynamoDB::Table
76+ Properties:
77+ TableName: connections
78+ AttributeDefinitions:
79+ - AttributeName: connectionId
80+ AttributeType: S
81+ - AttributeName: channel
82+ AttributeType: S
83+ KeySchema:
84+ - AttributeName: connectionId
85+ KeyType: HASH
86+ - AttributeName: channel
87+ KeyType: RANGE
88+ GlobalSecondaryIndexes:
89+ - IndexName: lookup-by-channel
90+ KeySchema:
91+ - AttributeName: channel
92+ KeyType: HASH
93+ Projection:
94+ ProjectionType: ALL
95+ - IndexName: lookup-by-connection
96+ KeySchema:
97+ - AttributeName: connectionId
98+ KeyType: HASH
99+ Projection:
100+ ProjectionType: ALL
101+ BillingMode: PAY_PER_REQUEST
102+ ```
103+
104+ Add the following `iamRoleStatement` to enable our Lambda function to access the table:
105+
106+ ```yaml
107+ provider:
108+ name: aws
109+
110+ iamRoleStatements:
111+ # Add this iamRoleStatement
112+ - Effect: Allow
113+ Action: [ dynamodb:Query, dynamodb:GetItem, dynamodb:PutItem, dynamodb:UpdateItem, dynamodb:DeleteItem, dynamodb:BatchWriteItem ]
114+ Resource:
115+ - !GetAtt ConnectionsTable.Arn
116+ - !Join [ '', [ !GetAtt ConnectionsTable.Arn, '/index/*' ] ]
117+ ```
118+
119+ Add an environment variable to autogenerate our websocket URL:
120+
121+ ```yaml
122+ provider:
123+ name: aws
124+
125+ environment:
126+ # Add these variables
127+ BROADCAST_DRIVER: laravel-echo-api-gateway
128+ LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE: !Ref ConnectionsTable
129+ LARAVEL_ECHO_API_GATEWAY_API_ID: !Ref WebsocketsApi
130+ LARAVEL_ECHO_API_GATEWAY_API_STAGE: "${self:provider.stage}"
131+ ```
132+
133+ Next, create the PHP handler file in `handlers/websocket.php`
134+
135+ ```php
136+ <?php
137+
138+ use Georgeboot\LaravelEchoApiGateway\Handler;
139+ use Illuminate\Foundation\Application;
140+
141+ require __DIR__ . '/../vendor/autoload.php';
142+
143+ /** @var Application $app */
144+ $app = require __DIR__ . '/../bootstrap/app.php';
145+
146+ $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
147+ $kernel->bootstrap();
148+
149+ return $app->make(Handler::class);
150+ ```
151+
152+ Now, deploy your app by running `serverless deploy` or similar. Write down the websocket url the output gives you.
153153
154154</details >
155155
156156<details >
157- <summary>Expand Vapor-specific instructions</summary>
158-
159- # ### B. When using Vapor
160-
161- When using Vapor, you will have to create these required resources by hand using the AWS CLI or Console :
162-
163- # #### B1. DynamoDB table for connections
164-
165- Create a DynamoDB table for the connections. Use `connectionId` (string) as a HASH key, and `channel` (string) as a SORT
166- key. Set the capacity setting to whatever you like (probably on-demand).
167-
168- Create 2 indexes :
169-
170- 1. Name : ` lookup-by-connection` , key: `connectionId`, no sort key, projected: ALL
171- 2. Name : ` lookup-by-channel` , key: `channel`, no sort key, projected: ALL
172-
173- # #### B2. API Gateway
174-
175- Create a new Websocket API. Enter a name and leave the route selection expression to what it is. Add a `$disconnect`
176- and `$default`. Set both integrations to `Lambda` and select your CLI lambda from the list. Set the name of the stage to
177- what you desire and create the API. Once created, write down the ID, as we'll need it later.
178-
179- # #### B3. IAM Permissions
180-
181- In IAM, go to roles and open `laravel-vapor-role`. Open the inline policy and edit it. On the JSON tab,
182- add `"execute-api:*"` to the list of actions.
183-
184- Then, login to [Laravel Vapor](https://vapor.laravel.com/app), go to team settings, AWS Accounts, click on Role next to
185- the correct account and deselect Receive Updates.
186-
187- Edit your `.env` :
188-
189- ` ` ` dotenv
190- BROADCAST_DRIVER=laravel-echo-api-gateway
191- LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE=the-table-name-you-entered-when-creating-it
192- LARAVEL_ECHO_API_GATEWAY_API_ID=your-websocket-api-id
193- LARAVEL_ECHO_API_GATEWAY_API_STAGE=your-api-stage-name
194- ` ` `
157+ <summary >Expand Vapor-specific instructions</summary >
158+
159+ #### B. When using Vapor
160+
161+ When using Vapor, you will have to create these required resources by hand using the AWS CLI or Console:
162+
163+ ##### B1. DynamoDB table for connections
164+
165+ Create a DynamoDB table for the connections. Use `connectionId` (string) as a HASH key, and `channel` (string) as a SORT
166+ key. Set the capacity setting to whatever you like (probably on-demand).
167+
168+ Create 2 indexes:
169+
170+ 1. Name: `lookup-by-connection`, key: `connectionId`, no sort key, projected: ALL
171+ 2. Name: `lookup-by-channel`, key: `channel`, no sort key, projected: ALL
172+
173+ ##### B2. API Gateway
174+
175+ Create a new Websocket API. Enter a name and leave the route selection expression to what it is. Add a `$disconnect`
176+ and `$default`. Set both integrations to `Lambda` and select your CLI lambda from the list. Set the name of the stage to
177+ what you desire and create the API. Once created, write down the ID, as we'll need it later.
178+
179+ ##### B3. IAM Permissions
180+
181+ In IAM, go to roles and open `laravel-vapor-role`. Open the inline policy and edit it. On the JSON tab,
182+ add `"execute-api:*"` to the list of actions.
183+
184+ Then, login to [Laravel Vapor](https://vapor.laravel.com/app), go to team settings, AWS Accounts, click on Role next to
185+ the correct account and deselect Receive Updates.
186+
187+ Edit your `.env`:
188+
189+ ```dotenv
190+ BROADCAST_DRIVER=laravel-echo-api-gateway
191+ LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE=the-table-name-you-entered-when-creating-it
192+ LARAVEL_ECHO_API_GATEWAY_API_ID=your-websocket-api-id
193+ LARAVEL_ECHO_API_GATEWAY_API_STAGE=your-api-stage-name
194+ ```
195195
196196</details >
197197
0 commit comments