add notify by socketio
This commit is contained in:
		
							parent
							
								
									77e41940e9
								
							
						
					
					
						commit
						f81c2a26da
					
				|  | @ -2,11 +2,14 @@ FROM alpine:3.18 | ||||||
| 
 | 
 | ||||||
| RUN apk update | RUN apk update | ||||||
| RUN apk add --no-cache npm | RUN apk add --no-cache npm | ||||||
|  | RUN npm i -g pnpm | ||||||
| 
 | 
 | ||||||
| RUN mkdir /socketio | RUN mkdir /socketio | ||||||
| WORKDIR /socketio | WORKDIR /socketio | ||||||
| COPY ./server.js /socketio |  | ||||||
| COPY ./package.json /socketio | COPY ./package.json /socketio | ||||||
|  | COPY ./pnpm-lock.yaml /socketio | ||||||
|  | RUN pnpm i | ||||||
| 
 | 
 | ||||||
| EXPOSE 3000 | EXPOSE 3000 | ||||||
| CMD sh -c 'npm i && node server.js' | COPY ./server.js /socketio | ||||||
|  | CMD sh -c 'node server.js' | ||||||
|  |  | ||||||
|  | @ -0,0 +1,217 @@ | ||||||
|  | lockfileVersion: '6.0' | ||||||
|  | 
 | ||||||
|  | settings: | ||||||
|  |   autoInstallPeers: true | ||||||
|  |   excludeLinksFromLockfile: false | ||||||
|  | 
 | ||||||
|  | dependencies: | ||||||
|  |   socket.io: | ||||||
|  |     specifier: ^4.7.4 | ||||||
|  |     version: 4.7.4 | ||||||
|  |   socket.io-client: | ||||||
|  |     specifier: ^4.7.4 | ||||||
|  |     version: 4.7.4 | ||||||
|  | 
 | ||||||
|  | packages: | ||||||
|  | 
 | ||||||
|  |   /@socket.io/component-emitter@3.1.0: | ||||||
|  |     resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@types/cookie@0.4.1: | ||||||
|  |     resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@types/cors@2.8.17: | ||||||
|  |     resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/node': 20.11.24 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /@types/node@20.11.24: | ||||||
|  |     resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} | ||||||
|  |     dependencies: | ||||||
|  |       undici-types: 5.26.5 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /accepts@1.3.8: | ||||||
|  |     resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} | ||||||
|  |     engines: {node: '>= 0.6'} | ||||||
|  |     dependencies: | ||||||
|  |       mime-types: 2.1.35 | ||||||
|  |       negotiator: 0.6.3 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /base64id@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} | ||||||
|  |     engines: {node: ^4.5.0 || >= 5.9} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /cookie@0.4.2: | ||||||
|  |     resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} | ||||||
|  |     engines: {node: '>= 0.6'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /cors@2.8.5: | ||||||
|  |     resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} | ||||||
|  |     engines: {node: '>= 0.10'} | ||||||
|  |     dependencies: | ||||||
|  |       object-assign: 4.1.1 | ||||||
|  |       vary: 1.1.2 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /debug@4.3.4: | ||||||
|  |     resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} | ||||||
|  |     engines: {node: '>=6.0'} | ||||||
|  |     peerDependencies: | ||||||
|  |       supports-color: '*' | ||||||
|  |     peerDependenciesMeta: | ||||||
|  |       supports-color: | ||||||
|  |         optional: true | ||||||
|  |     dependencies: | ||||||
|  |       ms: 2.1.2 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /engine.io-client@6.5.3: | ||||||
|  |     resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} | ||||||
|  |     dependencies: | ||||||
|  |       '@socket.io/component-emitter': 3.1.0 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       engine.io-parser: 5.2.2 | ||||||
|  |       ws: 8.11.0 | ||||||
|  |       xmlhttprequest-ssl: 2.0.0 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /engine.io-parser@5.2.2: | ||||||
|  |     resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /engine.io@6.5.4: | ||||||
|  |     resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} | ||||||
|  |     engines: {node: '>=10.2.0'} | ||||||
|  |     dependencies: | ||||||
|  |       '@types/cookie': 0.4.1 | ||||||
|  |       '@types/cors': 2.8.17 | ||||||
|  |       '@types/node': 20.11.24 | ||||||
|  |       accepts: 1.3.8 | ||||||
|  |       base64id: 2.0.0 | ||||||
|  |       cookie: 0.4.2 | ||||||
|  |       cors: 2.8.5 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       engine.io-parser: 5.2.2 | ||||||
|  |       ws: 8.11.0 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /mime-db@1.52.0: | ||||||
|  |     resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} | ||||||
|  |     engines: {node: '>= 0.6'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /mime-types@2.1.35: | ||||||
|  |     resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} | ||||||
|  |     engines: {node: '>= 0.6'} | ||||||
|  |     dependencies: | ||||||
|  |       mime-db: 1.52.0 | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /ms@2.1.2: | ||||||
|  |     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /negotiator@0.6.3: | ||||||
|  |     resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} | ||||||
|  |     engines: {node: '>= 0.6'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /object-assign@4.1.1: | ||||||
|  |     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} | ||||||
|  |     engines: {node: '>=0.10.0'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /socket.io-adapter@2.5.4: | ||||||
|  |     resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} | ||||||
|  |     dependencies: | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       ws: 8.11.0 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /socket.io-client@4.7.4: | ||||||
|  |     resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     dependencies: | ||||||
|  |       '@socket.io/component-emitter': 3.1.0 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       engine.io-client: 6.5.3 | ||||||
|  |       socket.io-parser: 4.2.4 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /socket.io-parser@4.2.4: | ||||||
|  |     resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     dependencies: | ||||||
|  |       '@socket.io/component-emitter': 3.1.0 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - supports-color | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /socket.io@4.7.4: | ||||||
|  |     resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} | ||||||
|  |     engines: {node: '>=10.2.0'} | ||||||
|  |     dependencies: | ||||||
|  |       accepts: 1.3.8 | ||||||
|  |       base64id: 2.0.0 | ||||||
|  |       cors: 2.8.5 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       engine.io: 6.5.4 | ||||||
|  |       socket.io-adapter: 2.5.4 | ||||||
|  |       socket.io-parser: 4.2.4 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /undici-types@5.26.5: | ||||||
|  |     resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /vary@1.1.2: | ||||||
|  |     resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} | ||||||
|  |     engines: {node: '>= 0.8'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /ws@8.11.0: | ||||||
|  |     resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     peerDependencies: | ||||||
|  |       bufferutil: ^4.0.1 | ||||||
|  |       utf-8-validate: ^5.0.2 | ||||||
|  |     peerDependenciesMeta: | ||||||
|  |       bufferutil: | ||||||
|  |         optional: true | ||||||
|  |       utf-8-validate: | ||||||
|  |         optional: true | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /xmlhttprequest-ssl@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} | ||||||
|  |     engines: {node: '>=0.4.0'} | ||||||
|  |     dev: false | ||||||
|  | @ -1,29 +1,47 @@ | ||||||
| const httpServer = require("http").createServer(); | const httpServer = require("http").createServer(); | ||||||
| const io = require("socket.io")(httpServer, { | const io = require("socket.io")(httpServer, { | ||||||
|   cors: { |   cors: { | ||||||
|     origin: '*', |     origin: "*", | ||||||
|   } |   }, | ||||||
|   // config
 |   // config
 | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| io.on("connection", (socket) => { | io.on("connection", (socket) => { | ||||||
|     // Handle data received from the client
 |   try { | ||||||
|     socket.on('data', (data) => { |     // JOIN
 | ||||||
|         console.log('Received:', data.toString()); |     socket.on("join", (data) => { | ||||||
|  |       console.log({ | ||||||
|  |         info: "Socket was join to room", | ||||||
|  |         join: data, | ||||||
|  |         id: socket.id, | ||||||
|  |       }); | ||||||
|  |       socket.join(data.join); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     socket.on('message', (data) => { |     // MESSAGE
 | ||||||
|         console.log('Received:', data.toString()); |     socket.on("message", (data) => { | ||||||
|  |       console.log({ | ||||||
|  |         info: "Received from client", | ||||||
|  |         data: data, | ||||||
|  |         id: socket.id | ||||||
|       }); |       }); | ||||||
| 
 |       // handle message
 | ||||||
|     // Handle when the client disconnects
 |       if (data?.to) { | ||||||
|     socket.on('end', () => { |         socket.join(data.to); | ||||||
|         console.log('Client disconnected'); |         socket.broadcast | ||||||
|  |           .to(data.to) | ||||||
|  |           .emit('message', data); | ||||||
|  |       } else { | ||||||
|  |         io.emit('message', data); | ||||||
|  |       } | ||||||
|     }); |     }); | ||||||
|  |   } catch (error) { | ||||||
|  |     console.error(error); | ||||||
|  |   } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| const port = process.env.PORT || 3000; | const port = process.env.PORT || 3000; | ||||||
| const host = '0.0.0.0'; | const host = "0.0.0.0"; | ||||||
| httpServer.listen(port, host, () => { | httpServer.listen(port, host, () => { | ||||||
|   console.log(`Server running on port ${host}:${port}`); |   console.log(`Server running on port ${host}:${port}`); | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | @ -35,6 +35,7 @@ async function processMessage(channel, message) { | ||||||
|     const response = JSON.parse(message.content.toString()); |     const response = JSON.parse(message.content.toString()); | ||||||
|     console.log("[x] RECEIVED", response); |     console.log("[x] RECEIVED", response); | ||||||
|     await require("./puppeteer")(response['data']); |     await require("./puppeteer")(response['data']); | ||||||
|  |     await require("./socket.io") | ||||||
|     console.log("[v] DONE"); |     console.log("[v] DONE"); | ||||||
|     channel.ack(message); |     channel.ack(message); | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|  |  | ||||||
|  | @ -1,7 +1,8 @@ | ||||||
| { | { | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "amqplib": "^0.10.3", |     "amqplib": "^0.10.3", | ||||||
|     "puppeteer": "^22.3.0" |     "puppeteer": "^22.3.0", | ||||||
|  |     "socket.io-client": "^4.7.4" | ||||||
|   }, |   }, | ||||||
|   "license": "MIT" |   "license": "MIT" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -11,6 +11,9 @@ dependencies: | ||||||
|   puppeteer: |   puppeteer: | ||||||
|     specifier: ^22.3.0 |     specifier: ^22.3.0 | ||||||
|     version: 22.3.0 |     version: 22.3.0 | ||||||
|  |   socket.io-client: | ||||||
|  |     specifier: ^4.7.4 | ||||||
|  |     version: 4.7.4 | ||||||
| 
 | 
 | ||||||
| packages: | packages: | ||||||
| 
 | 
 | ||||||
|  | @ -64,6 +67,10 @@ packages: | ||||||
|       - supports-color |       - supports-color | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /@socket.io/component-emitter@3.1.0: | ||||||
|  |     resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /@tootallnate/quickjs-emscripten@0.23.0: |   /@tootallnate/quickjs-emscripten@0.23.0: | ||||||
|     resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} |     resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} | ||||||
|     dev: false |     dev: false | ||||||
|  | @ -315,6 +322,25 @@ packages: | ||||||
|       once: 1.4.0 |       once: 1.4.0 | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /engine.io-client@6.5.3: | ||||||
|  |     resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} | ||||||
|  |     dependencies: | ||||||
|  |       '@socket.io/component-emitter': 3.1.0 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       engine.io-parser: 5.2.2 | ||||||
|  |       ws: 8.11.0 | ||||||
|  |       xmlhttprequest-ssl: 2.0.0 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /engine.io-parser@5.2.2: | ||||||
|  |     resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /env-paths@2.2.1: |   /env-paths@2.2.1: | ||||||
|     resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} |     resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} | ||||||
|     engines: {node: '>=6'} |     engines: {node: '>=6'} | ||||||
|  | @ -721,6 +747,30 @@ packages: | ||||||
|     engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} |     engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /socket.io-client@4.7.4: | ||||||
|  |     resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     dependencies: | ||||||
|  |       '@socket.io/component-emitter': 3.1.0 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |       engine.io-client: 6.5.3 | ||||||
|  |       socket.io-parser: 4.2.4 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - bufferutil | ||||||
|  |       - supports-color | ||||||
|  |       - utf-8-validate | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|  |   /socket.io-parser@4.2.4: | ||||||
|  |     resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     dependencies: | ||||||
|  |       '@socket.io/component-emitter': 3.1.0 | ||||||
|  |       debug: 4.3.4 | ||||||
|  |     transitivePeerDependencies: | ||||||
|  |       - supports-color | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /socks-proxy-agent@8.0.2: |   /socks-proxy-agent@8.0.2: | ||||||
|     resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} |     resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} | ||||||
|     engines: {node: '>= 14'} |     engines: {node: '>= 14'} | ||||||
|  | @ -870,6 +920,19 @@ packages: | ||||||
|     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} |     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /ws@8.11.0: | ||||||
|  |     resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} | ||||||
|  |     engines: {node: '>=10.0.0'} | ||||||
|  |     peerDependencies: | ||||||
|  |       bufferutil: ^4.0.1 | ||||||
|  |       utf-8-validate: ^5.0.2 | ||||||
|  |     peerDependenciesMeta: | ||||||
|  |       bufferutil: | ||||||
|  |         optional: true | ||||||
|  |       utf-8-validate: | ||||||
|  |         optional: true | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /ws@8.16.0: |   /ws@8.16.0: | ||||||
|     resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} |     resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} | ||||||
|     engines: {node: '>=10.0.0'} |     engines: {node: '>=10.0.0'} | ||||||
|  | @ -883,6 +946,11 @@ packages: | ||||||
|         optional: true |         optional: true | ||||||
|     dev: false |     dev: false | ||||||
| 
 | 
 | ||||||
|  |   /xmlhttprequest-ssl@2.0.0: | ||||||
|  |     resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} | ||||||
|  |     engines: {node: '>=0.4.0'} | ||||||
|  |     dev: false | ||||||
|  | 
 | ||||||
|   /y18n@5.0.8: |   /y18n@5.0.8: | ||||||
|     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} |     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} | ||||||
|     engines: {node: '>=10'} |     engines: {node: '>=10'} | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ | ||||||
| 
 | 
 | ||||||
| const puppeteer = require('puppeteer'); | const puppeteer = require('puppeteer'); | ||||||
| 
 | 
 | ||||||
| const launch = async ( | const run = async ( | ||||||
|   config = { url: '', screenshotPath: '', executablePath: '', timeout: 1000 } |   config = { url: '', screenshotPath: '', executablePath: '', timeout: 1000 } | ||||||
| ) => { | ) => { | ||||||
|   config = Object.assign({ |   config = Object.assign({ | ||||||
|  | @ -64,4 +64,4 @@ const launch = async ( | ||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| module.exports = launch | module.exports = run | ||||||
|  |  | ||||||
|  | @ -0,0 +1,29 @@ | ||||||
|  | /** | ||||||
|  |  * { | ||||||
|  |  * } | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | const {io} = require("socket.io-client"); | ||||||
|  | const socket = io("http://socketio:3000"); | ||||||
|  | 
 | ||||||
|  | // event socket init
 | ||||||
|  | socket.on("connect", () => { | ||||||
|  |   console.log("SOCKET connect"); | ||||||
|  |   socket.emit("join", "notify"); | ||||||
|  | }); | ||||||
|  | socket.on("disconnect", function () { | ||||||
|  |   console.warn("SOCKET disconnected"); | ||||||
|  | }); | ||||||
|  | socket.on("connect_failed", function () { | ||||||
|  |   console.error("SOCKET connection failed"); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const notify = { | ||||||
|  |   emit: async (msg: null) => { | ||||||
|  |     socket.emit("message", { | ||||||
|  |       to: 'notify', | ||||||
|  |       data: msg | ||||||
|  |     }); | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | module.exports = notify; | ||||||
|  | @ -1,132 +1,91 @@ | ||||||
| <!DOCTYPE html> | <!doctype html> | ||||||
| <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> | <html lang="en"> | ||||||
|     <head> | 
 | ||||||
|  | <head> | ||||||
|  |     <!-- Required meta tags --> | ||||||
|     <meta charset="utf-8"> |     <meta charset="utf-8"> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
| 
 | 
 | ||||||
|         <title>Laravel</title> |     <!-- Bootstrap CSS --> | ||||||
|  |     <link href="https://bootswatch.com/5/quartz/bootstrap.min.css" rel="stylesheet"> | ||||||
| 
 | 
 | ||||||
|         <!-- Fonts --> |     <title>Hello, world!</title> | ||||||
|         <link href="https://fonts.bunny.net/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet"> | </head> | ||||||
| 
 | 
 | ||||||
|         <!-- Styles --> | <body class="container-fluid"> | ||||||
|         <style> |     <div class="mb-2 mt-1"> | ||||||
|             /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.text-center{text-align:center}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.dark\:bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity))}.dark\:border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity))}.dark\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\:text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.dark\:text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}}
 |         <div class="progress" style="height: 20px"> | ||||||
|         </style> |             <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="75" | ||||||
| 
 |                 aria-valuemin="0" aria-valuemax="100" style="width: 75%;"></div> | ||||||
|         <style> |  | ||||||
|             body { |  | ||||||
|                 font-family: 'Nunito', sans-serif; |  | ||||||
|             } |  | ||||||
|         </style> |  | ||||||
|     </head> |  | ||||||
|     <body class="antialiased"> |  | ||||||
|         <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0"> |  | ||||||
|             @if (Route::has('login')) |  | ||||||
|                 <div class="hidden fixed top-0 right-0 px-6 py-4 sm:block"> |  | ||||||
|                     @auth |  | ||||||
|                         <a href="{{ url('/home') }}" class="text-sm text-gray-700 dark:text-gray-500 underline">Home</a> |  | ||||||
|                     @else |  | ||||||
|                         <a href="{{ route('login') }}" class="text-sm text-gray-700 dark:text-gray-500 underline">Log in</a> |  | ||||||
| 
 |  | ||||||
|                         @if (Route::has('register')) |  | ||||||
|                             <a href="{{ route('register') }}" class="ml-4 text-sm text-gray-700 dark:text-gray-500 underline">Register</a> |  | ||||||
|                         @endif |  | ||||||
|                     @endauth |  | ||||||
|                 </div> |  | ||||||
|             @endif |  | ||||||
| 
 |  | ||||||
|             <div class="max-w-6xl mx-auto sm:px-6 lg:px-8"> |  | ||||||
|                 <div class="flex justify-center pt-8 sm:justify-start sm:pt-0"> |  | ||||||
|                     <svg viewBox="0 0 651 192" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-16 w-auto text-gray-700 sm:h-20"> |  | ||||||
|                         <g clip-path="url(#clip0)" fill="#EF3B2D"> |  | ||||||
|                             <path d="M248.032 44.676h-16.466v100.23h47.394v-14.748h-30.928V44.676zM337.091 87.202c-2.101-3.341-5.083-5.965-8.949-7.875-3.865-1.909-7.756-2.864-11.669-2.864-5.062 0-9.69.931-13.89 2.792-4.201 1.861-7.804 4.417-10.811 7.661-3.007 3.246-5.347 6.993-7.016 11.239-1.672 4.249-2.506 8.713-2.506 13.389 0 4.774.834 9.26 2.506 13.459 1.669 4.202 4.009 7.925 7.016 11.169 3.007 3.246 6.609 5.799 10.811 7.66 4.199 1.861 8.828 2.792 13.89 2.792 3.913 0 7.804-.955 11.669-2.863 3.866-1.908 6.849-4.533 8.949-7.875v9.021h15.607V78.182h-15.607v9.02zm-1.431 32.503c-.955 2.578-2.291 4.821-4.009 6.73-1.719 1.91-3.795 3.437-6.229 4.582-2.435 1.146-5.133 1.718-8.091 1.718-2.96 0-5.633-.572-8.019-1.718-2.387-1.146-4.438-2.672-6.156-4.582-1.719-1.909-3.032-4.152-3.938-6.73-.909-2.577-1.36-5.298-1.36-8.161 0-2.864.451-5.585 1.36-8.162.905-2.577 2.219-4.819 3.938-6.729 1.718-1.908 3.77-3.437 6.156-4.582 2.386-1.146 5.059-1.718 8.019-1.718 2.958 0 5.656.572 8.091 1.718 2.434 1.146 4.51 2.674 6.229 4.582 1.718 1.91 3.054 4.152 4.009 6.729.953 2.577 1.432 5.298 1.432 8.162-.001 2.863-.479 5.584-1.432 8.161zM463.954 87.202c-2.101-3.341-5.083-5.965-8.949-7.875-3.865-1.909-7.756-2.864-11.669-2.864-5.062 0-9.69.931-13.89 2.792-4.201 1.861-7.804 4.417-10.811 7.661-3.007 3.246-5.347 6.993-7.016 11.239-1.672 4.249-2.506 8.713-2.506 13.389 0 4.774.834 9.26 2.506 13.459 1.669 4.202 4.009 7.925 7.016 11.169 3.007 3.246 6.609 5.799 10.811 7.66 4.199 1.861 8.828 2.792 13.89 2.792 3.913 0 7.804-.955 11.669-2.863 3.866-1.908 6.849-4.533 8.949-7.875v9.021h15.607V78.182h-15.607v9.02zm-1.432 32.503c-.955 2.578-2.291 4.821-4.009 6.73-1.719 1.91-3.795 3.437-6.229 4.582-2.435 1.146-5.133 1.718-8.091 1.718-2.96 0-5.633-.572-8.019-1.718-2.387-1.146-4.438-2.672-6.156-4.582-1.719-1.909-3.032-4.152-3.938-6.73-.909-2.577-1.36-5.298-1.36-8.161 0-2.864.451-5.585 1.36-8.162.905-2.577 2.219-4.819 3.938-6.729 1.718-1.908 3.77-3.437 6.156-4.582 2.386-1.146 5.059-1.718 8.019-1.718 2.958 0 5.656.572 8.091 1.718 2.434 1.146 4.51 2.674 6.229 4.582 1.718 1.91 3.054 4.152 4.009 6.729.953 2.577 1.432 5.298 1.432 8.162 0 2.863-.479 5.584-1.432 8.161zM650.772 44.676h-15.606v100.23h15.606V44.676zM365.013 144.906h15.607V93.538h26.776V78.182h-42.383v66.724zM542.133 78.182l-19.616 51.096-19.616-51.096h-15.808l25.617 66.724h19.614l25.617-66.724h-15.808zM591.98 76.466c-19.112 0-34.239 15.706-34.239 35.079 0 21.416 14.641 35.079 36.239 35.079 12.088 0 19.806-4.622 29.234-14.688l-10.544-8.158c-.006.008-7.958 10.449-19.832 10.449-13.802 0-19.612-11.127-19.612-16.884h51.777c2.72-22.043-11.772-40.877-33.023-40.877zm-18.713 29.28c.12-1.284 1.917-16.884 18.589-16.884 16.671 0 18.697 15.598 18.813 16.884h-37.402zM184.068 43.892c-.024-.088-.073-.165-.104-.25-.058-.157-.108-.316-.191-.46-.056-.097-.137-.176-.203-.265-.087-.117-.161-.242-.265-.345-.085-.086-.194-.148-.29-.223-.109-.085-.206-.182-.327-.252l-.002-.001-.002-.002-35.648-20.524a2.971 2.971 0 00-2.964 0l-35.647 20.522-.002.002-.002.001c-.121.07-.219.167-.327.252-.096.075-.205.138-.29.223-.103.103-.178.228-.265.345-.066.089-.147.169-.203.265-.083.144-.133.304-.191.46-.031.085-.08.162-.104.25-.067.249-.103.51-.103.776v38.979l-29.706 17.103V24.493a3 3 0 00-.103-.776c-.024-.088-.073-.165-.104-.25-.058-.157-.108-.316-.191-.46-.056-.097-.137-.176-.203-.265-.087-.117-.161-.242-.265-.345-.085-.086-.194-.148-.29-.223-.109-.085-.206-.182-.327-.252l-.002-.001-.002-.002L40.098 1.396a2.971 2.971 0 00-2.964 0L1.487 21.919l-.002.002-.002.001c-.121.07-.219.167-.327.252-.096.075-.205.138-.29.223-.103.103-.178.228-.265.345-.066.089-.147.169-.203.265-.083.144-.133.304-.191.46-.031.085-.08.162-.104.25-.067.249-.103.51-.103.776v122.09c0 1.063.568 2.044 1.489 2.575l71.293 41.045c.156.089.324.143.49.202.078.028.15.074.23.095a2.98 2.98 0 001.524 0c.069-.018.132-.059.2-.083.176-.061.354-.119.519-.214l71.293-41.045a2.971 2.971 0 001.489-2.575v-38.979l34.158-19.666a2.971 2.971 0 001.489-2.575V44.666a3.075 3.075 0 00-.106-.774zM74.255 143.167l-29.648-16.779 31.136-17.926.001-.001 34.164-19.669 29.674 17.084-21.772 12.428-43.555 24.863zm68.329-76.259v33.841l-12.475-7.182-17.231-9.92V49.806l12.475 7.182 17.231 9.92zm2.97-39.335l29.693 17.095-29.693 17.095-29.693-17.095 29.693-17.095zM54.06 114.089l-12.475 7.182V46.733l17.231-9.92 12.475-7.182v74.537l-17.231 9.921zM38.614 7.398l29.693 17.095-29.693 17.095L8.921 24.493 38.614 7.398zM5.938 29.632l12.475 7.182 17.231 9.92v79.676l.001.005-.001.006c0 .114.032.221.045.333.017.146.021.294.059.434l.002.007c.032.117.094.222.14.334.051.124.088.255.156.371a.036.036 0 00.004.009c.061.105.149.191.222.288.081.105.149.22.244.314l.008.01c.084.083.19.142.284.215.106.083.202.178.32.247l.013.005.011.008 34.139 19.321v34.175L5.939 144.867V29.632h-.001zm136.646 115.235l-65.352 37.625V148.31l48.399-27.628 16.953-9.677v33.862zm35.646-61.22l-29.706 17.102V66.908l17.231-9.92 12.475-7.182v33.841z"/> |  | ||||||
|                         </g> |  | ||||||
|                     </svg> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div class="mt-8 bg-white dark:bg-gray-800 overflow-hidden shadow sm:rounded-lg"> |  | ||||||
|                     <div class="grid grid-cols-1 md:grid-cols-2"> |  | ||||||
|                         <div class="p-6"> |  | ||||||
|                             <div class="flex items-center"> |  | ||||||
|                                 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-8 h-8 text-gray-500"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25" /></svg> |  | ||||||
|                                 <div class="ml-4 text-lg leading-7 font-semibold"><a href="https://laravel.com/docs" class="underline text-gray-900 dark:text-white">Documentation</a></div> |  | ||||||
|                             </div> |  | ||||||
| 
 |  | ||||||
|                             <div class="ml-12"> |  | ||||||
|                                 <div class="mt-2 text-gray-600 dark:text-gray-400 text-sm"> |  | ||||||
|                                     Laravel has wonderful, thorough documentation covering every aspect of the framework. Whether you are new to the framework or have previous experience with Laravel, we recommend reading all of the documentation from beginning to end. |  | ||||||
|                                 </div> |  | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|                         <div class="p-6 border-t border-gray-200 dark:border-gray-700 md:border-t-0 md:border-l"> |     <div class="table-responsive rounded"> | ||||||
|                             <div class="flex items-center"> |         <table class="table table-hover mb-0"> | ||||||
|                                 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-8 h-8 text-gray-500"><path stroke-linecap="round" d="M15.75 10.5l4.72-4.72a.75.75 0 011.28.53v11.38a.75.75 0 01-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25h-9A2.25 2.25 0 002.25 7.5v9a2.25 2.25 0 002.25 2.25z" /></svg> |             <thead> | ||||||
|                                 <div class="ml-4 text-lg leading-7 font-semibold"><a href="https://laracasts.com" class="underline text-gray-900 dark:text-white">Laracasts</a></div> |                 <tr> | ||||||
|  |                     <th scope="col">Type</th> | ||||||
|  |                     <th scope="col">Column heading</th> | ||||||
|  |                     <th scope="col">Column heading</th> | ||||||
|  |                     <th scope="col">Column heading</th> | ||||||
|  |                 </tr> | ||||||
|  |             </thead> | ||||||
|  |             <tbody> | ||||||
|  |                 <tr> | ||||||
|  |                     <th scope="row">Active</th> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                 </tr> | ||||||
|  |                 <tr> | ||||||
|  |                     <th scope="row">Active</th> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                 </tr> | ||||||
|  |                 <tr> | ||||||
|  |                     <th scope="row">Active</th> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                 </tr> | ||||||
|  |                 <tr> | ||||||
|  |                     <th scope="row">Active</th> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                 </tr> | ||||||
|  |                 <tr> | ||||||
|  |                     <th scope="row">Active</th> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                 </tr> | ||||||
|  |                 <tr> | ||||||
|  |                     <th scope="row">Active</th> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                     <td>Column content</td> | ||||||
|  |                 </tr> | ||||||
|  |             </tbody> | ||||||
|  |         </table> | ||||||
|     </div> |     </div> | ||||||
|  |     <!-- Optional JavaScript; choose one of the two! --> | ||||||
| 
 | 
 | ||||||
|                             <div class="ml-12"> |     <!-- Option 1: Bootstrap Bundle with Popper --> | ||||||
|                                 <div class="mt-2 text-gray-600 dark:text-gray-400 text-sm"> |     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" | ||||||
|                                     Laracasts offers thousands of video tutorials on Laravel, PHP, and JavaScript development. Check them out, see for yourself, and massively level up your development skills in the process. |         integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"> | ||||||
|                                 </div> |     </script> | ||||||
|                             </div> |  | ||||||
|                         </div> |  | ||||||
| 
 | 
 | ||||||
|                         <div class="p-6 border-t border-gray-200 dark:border-gray-700"> |     <!-- Option 2: Separate Popper and Bootstrap JS --> | ||||||
|                             <div class="flex items-center"> |     <!-- | ||||||
|                                 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-8 h-8 text-gray-500"><path stroke-linecap="round" stroke-linejoin="round" d="M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 01.865-.501 48.172 48.172 0 003.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z" /></svg> |     <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" | ||||||
|                                 <div class="ml-4 text-lg leading-7 font-semibold"><a href="https://laravel-news.com/" class="underline text-gray-900 dark:text-white">Laravel News</a></div> |         integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"> | ||||||
|                             </div> |     </script> | ||||||
|  |     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js" | ||||||
|  |         integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF" crossorigin="anonymous"> | ||||||
|  |     </script> | ||||||
|  |     --> | ||||||
|  | </body> | ||||||
| 
 | 
 | ||||||
|                             <div class="ml-12"> |  | ||||||
|                                 <div class="mt-2 text-gray-600 dark:text-gray-400 text-sm"> |  | ||||||
|                                     Laravel News is a community driven portal and newsletter aggregating all of the latest and most important news in the Laravel ecosystem, including new package releases and tutorials. |  | ||||||
|                                 </div> |  | ||||||
|                             </div> |  | ||||||
|                         </div> |  | ||||||
| 
 |  | ||||||
|                         <div class="p-6 border-t border-gray-200 dark:border-gray-700 md:border-l"> |  | ||||||
|                             <div class="flex items-center"> |  | ||||||
|                                 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-8 h-8 text-gray-500"><path stroke-linecap="round" stroke-linejoin="round" d="M6.115 5.19l.319 1.913A6 6 0 008.11 10.36L9.75 12l-.387.775c-.217.433-.132.956.21 1.298l1.348 1.348c.21.21.329.497.329.795v1.089c0 .426.24.815.622 1.006l.153.076c.433.217.956.132 1.298-.21l.723-.723a8.7 8.7 0 002.288-4.042 1.087 1.087 0 00-.358-1.099l-1.33-1.108c-.251-.21-.582-.299-.905-.245l-1.17.195a1.125 1.125 0 01-.98-.314l-.295-.295a1.125 1.125 0 010-1.591l.13-.132a1.125 1.125 0 011.3-.21l.603.302a.809.809 0 001.086-1.086L14.25 7.5l1.256-.837a4.5 4.5 0 001.528-1.732l.146-.292M6.115 5.19A9 9 0 1017.18 4.64M6.115 5.19A8.965 8.965 0 0112 3c1.929 0 3.716.607 5.18 1.64" /></svg> |  | ||||||
|                                 <div class="ml-4 text-lg leading-7 font-semibold text-gray-900 dark:text-white">Vibrant Ecosystem</div> |  | ||||||
|                             </div> |  | ||||||
| 
 |  | ||||||
|                             <div class="ml-12"> |  | ||||||
|                                 <div class="mt-2 text-gray-600 dark:text-gray-400 text-sm"> |  | ||||||
|                                     Laravel's robust library of first-party tools and libraries, such as <a href="https://forge.laravel.com" class="underline">Forge</a>, <a href="https://vapor.laravel.com" class="underline">Vapor</a>, <a href="https://nova.laravel.com" class="underline">Nova</a>, and <a href="https://envoyer.io" class="underline">Envoyer</a> help you take your projects to the next level. Pair them with powerful open source libraries like <a href="https://laravel.com/docs/billing" class="underline">Cashier</a>, <a href="https://laravel.com/docs/dusk" class="underline">Dusk</a>, <a href="https://laravel.com/docs/broadcasting" class="underline">Echo</a>, <a href="https://laravel.com/docs/horizon" class="underline">Horizon</a>, <a href="https://laravel.com/docs/sanctum" class="underline">Sanctum</a>, <a href="https://laravel.com/docs/telescope" class="underline">Telescope</a>, and more. |  | ||||||
|                                 </div> |  | ||||||
|                             </div> |  | ||||||
|                         </div> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div class="flex justify-center mt-4 sm:items-center sm:justify-between"> |  | ||||||
|                     <div class="text-center text-sm text-gray-500 sm:text-left"> |  | ||||||
|                         <div class="flex items-center"> |  | ||||||
|                             <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="-mt-px w-5 h-5 text-gray-400"> |  | ||||||
|                                 <path stroke-linecap="round" stroke-linejoin="round" d="M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 00-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 00-16.536-1.84M7.5 14.25L5.106 5.272M6 20.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm12.75 0a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" /> |  | ||||||
|                             </svg> |  | ||||||
| 
 |  | ||||||
|                             <a href="https://laravel.bigcartel.com" class="ml-1 underline"> |  | ||||||
|                                 Shop |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="ml-4 -mt-px w-5 h-5 text-gray-400"> |  | ||||||
|                                 <path stroke-linecap="round" stroke-linejoin="round" d="M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z" /> |  | ||||||
|                             </svg> |  | ||||||
| 
 |  | ||||||
|                             <a href="https://github.com/sponsors/taylorotwell" class="ml-1 underline"> |  | ||||||
|                                 Sponsor |  | ||||||
|                             </a> |  | ||||||
|                         </div> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <div class="ml-4 text-center text-sm text-gray-500 sm:text-right sm:ml-0"> |  | ||||||
|                         Laravel v{{ Illuminate\Foundation\Application::VERSION }} (PHP v{{ PHP_VERSION }}) |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
|         </div> |  | ||||||
|     </body> |  | ||||||
| </html> | </html> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue