added pengguna,kurir page, with socket.io,need to switch this to node.js first
This commit is contained in:
parent
5329fb8265
commit
0ba4e846dc
|
@ -0,0 +1,55 @@
|
|||
// check local storage
|
||||
if (!localStorage.getItem('user')) {
|
||||
// redirect to login page
|
||||
window.location.href = "/";
|
||||
}
|
||||
|
||||
const path = window.location.pathname;
|
||||
|
||||
const segments = path.split('/'); // ["", "kurir", "data"]
|
||||
const target = segments[1];
|
||||
// console.log(target);
|
||||
|
||||
if (target != 'kurir' && target != 'user') {
|
||||
localStorage.removeItem('user');
|
||||
localStorage.removeItem('role');
|
||||
// redirect to login page
|
||||
window.location.href = "/";
|
||||
}
|
||||
|
||||
|
||||
fetch(target == 'kurir' ? '/kurir/check' : '/user/check', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(JSON.parse(localStorage.getItem('user')))
|
||||
|
||||
})
|
||||
.then(res => {
|
||||
if (res.status >= 400) {
|
||||
// remove local storage
|
||||
localStorage.removeItem('user');
|
||||
localStorage.removeItem('role');
|
||||
// redirect to login page
|
||||
window.location.href = "/";
|
||||
}
|
||||
|
||||
// console.log(res);
|
||||
return res.json();
|
||||
})
|
||||
.then(data => {
|
||||
// console.log(data);
|
||||
// document.getElementById('h5-title').innerHTML = data.username;
|
||||
|
||||
|
||||
})
|
||||
.catch(err => {
|
||||
// console.log(err);
|
||||
// remove local storage
|
||||
localStorage.removeItem('user');
|
||||
localStorage.removeItem('role');
|
||||
// redirect to login page
|
||||
window.location.href = "/";
|
||||
|
||||
});
|
Binary file not shown.
After Width: | Height: | Size: 15 MiB |
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
|
@ -12,6 +12,9 @@ function logout() {
|
|||
confirmButtonColor: "#f60e0e"
|
||||
}, function (t) {
|
||||
if (t) {
|
||||
// remove local storage
|
||||
localStorage.removeItem('user');
|
||||
localStorage.removeItem('role');
|
||||
window.location.href = "/"
|
||||
}else{
|
||||
// close swal
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
(The MIT License)
|
||||
|
||||
Copyright (c) 2014-present Guillermo Rauch and Socket.IO contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,273 @@
|
|||
# socket.io
|
||||
[](https://replit.com/@socketio/socketio-minimal-example)
|
||||
[](#backers) [](#sponsors)
|
||||
[](https://github.com/socketio/socket.io/actions)
|
||||
[](https://www.npmjs.com/package/socket.io)
|
||||

|
||||
[](https://slackin-socketio.now.sh)
|
||||
|
||||
## Features
|
||||
|
||||
Socket.IO enables real-time bidirectional event-based communication. It consists of:
|
||||
|
||||
- a Node.js server (this repository)
|
||||
- a [Javascript client library](https://github.com/socketio/socket.io-client) for the browser (or a Node.js client)
|
||||
|
||||
Some implementations in other languages are also available:
|
||||
|
||||
- [Java](https://github.com/socketio/socket.io-client-java)
|
||||
- [C++](https://github.com/socketio/socket.io-client-cpp)
|
||||
- [Swift](https://github.com/socketio/socket.io-client-swift)
|
||||
- [Dart](https://github.com/rikulo/socket.io-client-dart)
|
||||
- [Python](https://github.com/miguelgrinberg/python-socketio)
|
||||
- [.NET](https://github.com/doghappy/socket.io-client-csharp)
|
||||
- [Rust](https://github.com/1c3t3a/rust-socketio)
|
||||
- [PHP](https://github.com/ElephantIO/elephant.io)
|
||||
|
||||
Its main features are:
|
||||
|
||||
#### Reliability
|
||||
|
||||
Connections are established even in the presence of:
|
||||
- proxies and load balancers.
|
||||
- personal firewall and antivirus software.
|
||||
|
||||
For this purpose, it relies on [Engine.IO](https://github.com/socketio/engine.io), which first establishes a long-polling connection, then tries to upgrade to better transports that are "tested" on the side, like WebSocket. Please see the [Goals](https://github.com/socketio/engine.io#goals) section for more information.
|
||||
|
||||
#### Auto-reconnection support
|
||||
|
||||
Unless instructed otherwise a disconnected client will try to reconnect forever, until the server is available again. Please see the available reconnection options [here](https://socket.io/docs/v3/client-api/#new-Manager-url-options).
|
||||
|
||||
#### Disconnection detection
|
||||
|
||||
A heartbeat mechanism is implemented at the Engine.IO level, allowing both the server and the client to know when the other one is not responding anymore.
|
||||
|
||||
That functionality is achieved with timers set on both the server and the client, with timeout values (the `pingInterval` and `pingTimeout` parameters) shared during the connection handshake. Those timers require any subsequent client calls to be directed to the same server, hence the `sticky-session` requirement when using multiples nodes.
|
||||
|
||||
#### Binary support
|
||||
|
||||
Any serializable data structures can be emitted, including:
|
||||
|
||||
- [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) and [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) in the browser
|
||||
- [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) and [Buffer](https://nodejs.org/api/buffer.html) in Node.js
|
||||
|
||||
#### Simple and convenient API
|
||||
|
||||
Sample code:
|
||||
|
||||
```js
|
||||
io.on('connection', socket => {
|
||||
socket.emit('request', /* … */); // emit an event to the socket
|
||||
io.emit('broadcast', /* … */); // emit an event to all connected sockets
|
||||
socket.on('reply', () => { /* … */ }); // listen to the event
|
||||
});
|
||||
```
|
||||
|
||||
#### Cross-browser
|
||||
|
||||
Browser support is tested in Sauce Labs:
|
||||
|
||||
[](https://saucelabs.com/u/socket)
|
||||
|
||||
#### Multiplexing support
|
||||
|
||||
In order to create separation of concerns within your application (for example per module, or based on permissions), Socket.IO allows you to create several `Namespaces`, which will act as separate communication channels but will share the same underlying connection.
|
||||
|
||||
#### Room support
|
||||
|
||||
Within each `Namespace`, you can define arbitrary channels, called `Rooms`, that sockets can join and leave. You can then broadcast to any given room, reaching every socket that has joined it.
|
||||
|
||||
This is a useful feature to send notifications to a group of users, or to a given user connected on several devices for example.
|
||||
|
||||
|
||||
**Note:** Socket.IO is not a WebSocket implementation. Although Socket.IO indeed uses WebSocket as a transport when possible, it adds some metadata to each packet: the packet type, the namespace and the ack id when a message acknowledgement is needed. That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a WebSocket server (like `ws://echo.websocket.org`) either. Please see the protocol specification [here](https://github.com/socketio/socket.io-protocol).
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
// with npm
|
||||
npm install socket.io
|
||||
|
||||
// with yarn
|
||||
yarn add socket.io
|
||||
```
|
||||
|
||||
## How to use
|
||||
|
||||
The following example attaches socket.io to a plain Node.JS
|
||||
HTTP server listening on port `3000`.
|
||||
|
||||
```js
|
||||
const server = require('http').createServer();
|
||||
const io = require('socket.io')(server);
|
||||
io.on('connection', client => {
|
||||
client.on('event', data => { /* … */ });
|
||||
client.on('disconnect', () => { /* … */ });
|
||||
});
|
||||
server.listen(3000);
|
||||
```
|
||||
|
||||
### Standalone
|
||||
|
||||
```js
|
||||
const io = require('socket.io')();
|
||||
io.on('connection', client => { ... });
|
||||
io.listen(3000);
|
||||
```
|
||||
|
||||
### Module syntax
|
||||
|
||||
```js
|
||||
import { Server } from "socket.io";
|
||||
const io = new Server(server);
|
||||
io.listen(3000);
|
||||
```
|
||||
|
||||
### In conjunction with Express
|
||||
|
||||
Starting with **3.0**, express applications have become request handler
|
||||
functions that you pass to `http` or `http` `Server` instances. You need
|
||||
to pass the `Server` to `socket.io`, not the express application
|
||||
function. Also make sure to call `.listen` on the `server`, not the `app`.
|
||||
|
||||
```js
|
||||
const app = require('express')();
|
||||
const server = require('http').createServer(app);
|
||||
const io = require('socket.io')(server);
|
||||
io.on('connection', () => { /* … */ });
|
||||
server.listen(3000);
|
||||
```
|
||||
|
||||
### In conjunction with Koa
|
||||
|
||||
Like Express.JS, Koa works by exposing an application as a request
|
||||
handler function, but only by calling the `callback` method.
|
||||
|
||||
```js
|
||||
const app = require('koa')();
|
||||
const server = require('http').createServer(app.callback());
|
||||
const io = require('socket.io')(server);
|
||||
io.on('connection', () => { /* … */ });
|
||||
server.listen(3000);
|
||||
```
|
||||
|
||||
### In conjunction with Fastify
|
||||
|
||||
To integrate Socket.io in your Fastify application you just need to
|
||||
register `fastify-socket.io` plugin. It will create a `decorator`
|
||||
called `io`.
|
||||
|
||||
```js
|
||||
const app = require('fastify')();
|
||||
app.register(require('fastify-socket.io'));
|
||||
app.ready().then(() => {
|
||||
app.io.on('connection', () => { /* … */ });
|
||||
})
|
||||
app.listen(3000);
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Please see the documentation [here](https://socket.io/docs/).
|
||||
|
||||
The source code of the website can be found [here](https://github.com/socketio/socket.io-website). Contributions are welcome!
|
||||
|
||||
## Debug / logging
|
||||
|
||||
Socket.IO is powered by [debug](https://github.com/visionmedia/debug).
|
||||
In order to see all the debug output, run your app with the environment variable
|
||||
`DEBUG` including the desired scope.
|
||||
|
||||
To see the output from all of Socket.IO's debugging scopes you can use:
|
||||
|
||||
```
|
||||
DEBUG=socket.io* node myapp
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
```
|
||||
npm test
|
||||
```
|
||||
This runs the `gulp` task `test`. By default the test will be run with the source code in `lib` directory.
|
||||
|
||||
Set the environmental variable `TEST_VERSION` to `compat` to test the transpiled es5-compat version of the code.
|
||||
|
||||
The `gulp` task `test` will always transpile the source code into es5 and export to `dist` first before running the test.
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/socketio#backer)]
|
||||
|
||||
<a href="https://opencollective.com/socketio/backer/0/website" target="_blank"><img src="https://opencollective.com/socketio/backer/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/1/website" target="_blank"><img src="https://opencollective.com/socketio/backer/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/2/website" target="_blank"><img src="https://opencollective.com/socketio/backer/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/3/website" target="_blank"><img src="https://opencollective.com/socketio/backer/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/4/website" target="_blank"><img src="https://opencollective.com/socketio/backer/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/5/website" target="_blank"><img src="https://opencollective.com/socketio/backer/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/6/website" target="_blank"><img src="https://opencollective.com/socketio/backer/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/7/website" target="_blank"><img src="https://opencollective.com/socketio/backer/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/8/website" target="_blank"><img src="https://opencollective.com/socketio/backer/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/9/website" target="_blank"><img src="https://opencollective.com/socketio/backer/9/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/10/website" target="_blank"><img src="https://opencollective.com/socketio/backer/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/11/website" target="_blank"><img src="https://opencollective.com/socketio/backer/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/12/website" target="_blank"><img src="https://opencollective.com/socketio/backer/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/13/website" target="_blank"><img src="https://opencollective.com/socketio/backer/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/14/website" target="_blank"><img src="https://opencollective.com/socketio/backer/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/15/website" target="_blank"><img src="https://opencollective.com/socketio/backer/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/16/website" target="_blank"><img src="https://opencollective.com/socketio/backer/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/17/website" target="_blank"><img src="https://opencollective.com/socketio/backer/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/18/website" target="_blank"><img src="https://opencollective.com/socketio/backer/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/19/website" target="_blank"><img src="https://opencollective.com/socketio/backer/19/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/20/website" target="_blank"><img src="https://opencollective.com/socketio/backer/20/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/21/website" target="_blank"><img src="https://opencollective.com/socketio/backer/21/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/22/website" target="_blank"><img src="https://opencollective.com/socketio/backer/22/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/23/website" target="_blank"><img src="https://opencollective.com/socketio/backer/23/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/24/website" target="_blank"><img src="https://opencollective.com/socketio/backer/24/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/25/website" target="_blank"><img src="https://opencollective.com/socketio/backer/25/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/26/website" target="_blank"><img src="https://opencollective.com/socketio/backer/26/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/27/website" target="_blank"><img src="https://opencollective.com/socketio/backer/27/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/28/website" target="_blank"><img src="https://opencollective.com/socketio/backer/28/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/29/website" target="_blank"><img src="https://opencollective.com/socketio/backer/29/avatar.svg"></a>
|
||||
|
||||
|
||||
## Sponsors
|
||||
|
||||
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/socketio#sponsor)]
|
||||
|
||||
<a href="https://opencollective.com/socketio/sponsor/0/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/1/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/2/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/3/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/4/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/5/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/6/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/7/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/8/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/9/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/9/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/10/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/11/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/12/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/13/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/14/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/15/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/16/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/17/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/18/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/19/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/19/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/20/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/20/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/21/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/21/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/22/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/22/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/23/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/23/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/24/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/24/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/25/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/25/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/26/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/26/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/27/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/27/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/28/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/28/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/29/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/29/avatar.svg"></a>
|
||||
|
||||
|
||||
## License
|
||||
|
||||
[MIT](LICENSE)
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,85 @@
|
|||
{
|
||||
"name": "socket.io",
|
||||
"version": "4.8.1",
|
||||
"description": "node.js realtime framework server",
|
||||
"keywords": [
|
||||
"realtime",
|
||||
"framework",
|
||||
"websocket",
|
||||
"tcp",
|
||||
"events",
|
||||
"socket",
|
||||
"io"
|
||||
],
|
||||
"files": [
|
||||
"dist/",
|
||||
"client-dist/",
|
||||
"wrapper.mjs",
|
||||
"!**/*.tsbuildinfo"
|
||||
],
|
||||
"directories": {
|
||||
"doc": "docs/",
|
||||
"example": "example/",
|
||||
"lib": "lib/",
|
||||
"test": "test/"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"main": "./dist/index.js",
|
||||
"exports": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"import": "./wrapper.mjs",
|
||||
"require": "./dist/index.js"
|
||||
},
|
||||
"types": "./dist/index.d.ts",
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/socketio/socket.io/tree/main/packages/socket.io#readme",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/socketio/socket.io.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/socketio/socket.io/issues"
|
||||
},
|
||||
"scripts": {
|
||||
"compile": "rimraf ./dist && tsc",
|
||||
"test": "npm run format:check && npm run compile && npm run test:types && npm run test:unit",
|
||||
"test:types": "tsd",
|
||||
"test:unit": "nyc mocha --require ts-node/register --reporter spec --slow 200 --bail --timeout 10000 test/index.ts",
|
||||
"format:check": "prettier --check \"lib/**/*.ts\" \"test/**/*.ts\"",
|
||||
"format:fix": "prettier --write \"lib/**/*.ts\" \"test/**/*.ts\"",
|
||||
"prepack": "npm run compile"
|
||||
},
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.4",
|
||||
"base64id": "~2.0.0",
|
||||
"cors": "~2.8.5",
|
||||
"debug": "~4.3.2",
|
||||
"engine.io": "~6.6.0",
|
||||
"socket.io-adapter": "~2.5.2",
|
||||
"socket.io-parser": "~4.2.4"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Guillermo Rauch",
|
||||
"email": "rauchg@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Arnout Kazemier",
|
||||
"email": "info@3rd-eden.com"
|
||||
},
|
||||
{
|
||||
"name": "Vladimir Dronnikov",
|
||||
"email": "dronnikov@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Einar Otto Stangvik",
|
||||
"email": "einaros@gmail.com"
|
||||
}
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10.2.0"
|
||||
},
|
||||
"tsd": {
|
||||
"directory": "test"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
import io from "./dist/index.js";
|
||||
|
||||
export const {Server, Namespace, Socket} = io;
|
|
@ -0,0 +1,22 @@
|
|||
(The MIT License)
|
||||
|
||||
Copyright (c) 2014-2018 Automattic <dev@cloudup.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,271 @@
|
|||
# socket.io
|
||||
[](https://replit.com/@socketio/socketio-minimal-example)
|
||||
[](#backers) [](#sponsors)
|
||||
[](https://github.com/socketio/socket.io/actions)
|
||||
[](https://david-dm.org/socketio/socket.io)
|
||||
[](https://david-dm.org/socketio/socket.io#info=devDependencies)
|
||||
[](https://www.npmjs.com/package/socket.io)
|
||||

|
||||
[](https://slackin-socketio.now.sh)
|
||||
|
||||
## Features
|
||||
|
||||
Socket.IO enables real-time bidirectional event-based communication. It consists of:
|
||||
|
||||
- a Node.js server (this repository)
|
||||
- a [Javascript client library](https://github.com/socketio/socket.io-client) for the browser (or a Node.js client)
|
||||
|
||||
Some implementations in other languages are also available:
|
||||
|
||||
- [Java](https://github.com/socketio/socket.io-client-java)
|
||||
- [C++](https://github.com/socketio/socket.io-client-cpp)
|
||||
- [Swift](https://github.com/socketio/socket.io-client-swift)
|
||||
- [Dart](https://github.com/rikulo/socket.io-client-dart)
|
||||
- [Python](https://github.com/miguelgrinberg/python-socketio)
|
||||
- [.NET](https://github.com/doghappy/socket.io-client-csharp)
|
||||
|
||||
Its main features are:
|
||||
|
||||
#### Reliability
|
||||
|
||||
Connections are established even in the presence of:
|
||||
- proxies and load balancers.
|
||||
- personal firewall and antivirus software.
|
||||
|
||||
For this purpose, it relies on [Engine.IO](https://github.com/socketio/engine.io), which first establishes a long-polling connection, then tries to upgrade to better transports that are "tested" on the side, like WebSocket. Please see the [Goals](https://github.com/socketio/engine.io#goals) section for more information.
|
||||
|
||||
#### Auto-reconnection support
|
||||
|
||||
Unless instructed otherwise a disconnected client will try to reconnect forever, until the server is available again. Please see the available reconnection options [here](https://socket.io/docs/v3/client-api/#new-Manager-url-options).
|
||||
|
||||
#### Disconnection detection
|
||||
|
||||
A heartbeat mechanism is implemented at the Engine.IO level, allowing both the server and the client to know when the other one is not responding anymore.
|
||||
|
||||
That functionality is achieved with timers set on both the server and the client, with timeout values (the `pingInterval` and `pingTimeout` parameters) shared during the connection handshake. Those timers require any subsequent client calls to be directed to the same server, hence the `sticky-session` requirement when using multiples nodes.
|
||||
|
||||
#### Binary support
|
||||
|
||||
Any serializable data structures can be emitted, including:
|
||||
|
||||
- [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) and [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob) in the browser
|
||||
- [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer) and [Buffer](https://nodejs.org/api/buffer.html) in Node.js
|
||||
|
||||
#### Simple and convenient API
|
||||
|
||||
Sample code:
|
||||
|
||||
```js
|
||||
io.on('connection', socket => {
|
||||
socket.emit('request', /* … */); // emit an event to the socket
|
||||
io.emit('broadcast', /* … */); // emit an event to all connected sockets
|
||||
socket.on('reply', () => { /* … */ }); // listen to the event
|
||||
});
|
||||
```
|
||||
|
||||
#### Cross-browser
|
||||
|
||||
Browser support is tested in Sauce Labs:
|
||||
|
||||
[](https://saucelabs.com/u/socket)
|
||||
|
||||
#### Multiplexing support
|
||||
|
||||
In order to create separation of concerns within your application (for example per module, or based on permissions), Socket.IO allows you to create several `Namespaces`, which will act as separate communication channels but will share the same underlying connection.
|
||||
|
||||
#### Room support
|
||||
|
||||
Within each `Namespace`, you can define arbitrary channels, called `Rooms`, that sockets can join and leave. You can then broadcast to any given room, reaching every socket that has joined it.
|
||||
|
||||
This is a useful feature to send notifications to a group of users, or to a given user connected on several devices for example.
|
||||
|
||||
|
||||
**Note:** Socket.IO is not a WebSocket implementation. Although Socket.IO indeed uses WebSocket as a transport when possible, it adds some metadata to each packet: the packet type, the namespace and the ack id when a message acknowledgement is needed. That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a WebSocket server (like `ws://echo.websocket.org`) either. Please see the protocol specification [here](https://github.com/socketio/socket.io-protocol).
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
// with npm
|
||||
npm install socket.io
|
||||
|
||||
// with yarn
|
||||
yarn add socket.io
|
||||
```
|
||||
|
||||
## How to use
|
||||
|
||||
The following example attaches socket.io to a plain Node.JS
|
||||
HTTP server listening on port `3000`.
|
||||
|
||||
```js
|
||||
const server = require('http').createServer();
|
||||
const io = require('socket.io')(server);
|
||||
io.on('connection', client => {
|
||||
client.on('event', data => { /* … */ });
|
||||
client.on('disconnect', () => { /* … */ });
|
||||
});
|
||||
server.listen(3000);
|
||||
```
|
||||
|
||||
### Standalone
|
||||
|
||||
```js
|
||||
const io = require('socket.io')();
|
||||
io.on('connection', client => { ... });
|
||||
io.listen(3000);
|
||||
```
|
||||
|
||||
### Module syntax
|
||||
|
||||
```js
|
||||
import { Server } from "socket.io";
|
||||
const io = new Server(server);
|
||||
io.listen(3000);
|
||||
```
|
||||
|
||||
### In conjunction with Express
|
||||
|
||||
Starting with **3.0**, express applications have become request handler
|
||||
functions that you pass to `http` or `http` `Server` instances. You need
|
||||
to pass the `Server` to `socket.io`, and not the express application
|
||||
function. Also make sure to call `.listen` on the `server`, not the `app`.
|
||||
|
||||
```js
|
||||
const app = require('express')();
|
||||
const server = require('http').createServer(app);
|
||||
const io = require('socket.io')(server);
|
||||
io.on('connection', () => { /* … */ });
|
||||
server.listen(3000);
|
||||
```
|
||||
|
||||
### In conjunction with Koa
|
||||
|
||||
Like Express.JS, Koa works by exposing an application as a request
|
||||
handler function, but only by calling the `callback` method.
|
||||
|
||||
```js
|
||||
const app = require('koa')();
|
||||
const server = require('http').createServer(app.callback());
|
||||
const io = require('socket.io')(server);
|
||||
io.on('connection', () => { /* … */ });
|
||||
server.listen(3000);
|
||||
```
|
||||
|
||||
### In conjunction with Fastify
|
||||
|
||||
To integrate Socket.io in your Fastify application you just need to
|
||||
register `fastify-socket.io` plugin. It will create a `decorator`
|
||||
called `io`.
|
||||
|
||||
```js
|
||||
const app = require('fastify')();
|
||||
app.register(require('fastify-socket.io'));
|
||||
app.io.on('connection', () => { /* … */ });
|
||||
app.listen(3000);
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Please see the documentation [here](https://socket.io/docs/).
|
||||
|
||||
The source code of the website can be found [here](https://github.com/socketio/socket.io-website). Contributions are welcome!
|
||||
|
||||
## Debug / logging
|
||||
|
||||
Socket.IO is powered by [debug](https://github.com/visionmedia/debug).
|
||||
In order to see all the debug output, run your app with the environment variable
|
||||
`DEBUG` including the desired scope.
|
||||
|
||||
To see the output from all of Socket.IO's debugging scopes you can use:
|
||||
|
||||
```
|
||||
DEBUG=socket.io* node myapp
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
```
|
||||
npm test
|
||||
```
|
||||
This runs the `gulp` task `test`. By default the test will be run with the source code in `lib` directory.
|
||||
|
||||
Set the environmental variable `TEST_VERSION` to `compat` to test the transpiled es5-compat version of the code.
|
||||
|
||||
The `gulp` task `test` will always transpile the source code into es5 and export to `dist` first before running the test.
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/socketio#backer)]
|
||||
|
||||
<a href="https://opencollective.com/socketio/backer/0/website" target="_blank"><img src="https://opencollective.com/socketio/backer/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/1/website" target="_blank"><img src="https://opencollective.com/socketio/backer/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/2/website" target="_blank"><img src="https://opencollective.com/socketio/backer/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/3/website" target="_blank"><img src="https://opencollective.com/socketio/backer/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/4/website" target="_blank"><img src="https://opencollective.com/socketio/backer/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/5/website" target="_blank"><img src="https://opencollective.com/socketio/backer/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/6/website" target="_blank"><img src="https://opencollective.com/socketio/backer/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/7/website" target="_blank"><img src="https://opencollective.com/socketio/backer/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/8/website" target="_blank"><img src="https://opencollective.com/socketio/backer/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/9/website" target="_blank"><img src="https://opencollective.com/socketio/backer/9/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/10/website" target="_blank"><img src="https://opencollective.com/socketio/backer/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/11/website" target="_blank"><img src="https://opencollective.com/socketio/backer/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/12/website" target="_blank"><img src="https://opencollective.com/socketio/backer/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/13/website" target="_blank"><img src="https://opencollective.com/socketio/backer/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/14/website" target="_blank"><img src="https://opencollective.com/socketio/backer/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/15/website" target="_blank"><img src="https://opencollective.com/socketio/backer/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/16/website" target="_blank"><img src="https://opencollective.com/socketio/backer/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/17/website" target="_blank"><img src="https://opencollective.com/socketio/backer/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/18/website" target="_blank"><img src="https://opencollective.com/socketio/backer/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/19/website" target="_blank"><img src="https://opencollective.com/socketio/backer/19/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/20/website" target="_blank"><img src="https://opencollective.com/socketio/backer/20/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/21/website" target="_blank"><img src="https://opencollective.com/socketio/backer/21/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/22/website" target="_blank"><img src="https://opencollective.com/socketio/backer/22/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/23/website" target="_blank"><img src="https://opencollective.com/socketio/backer/23/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/24/website" target="_blank"><img src="https://opencollective.com/socketio/backer/24/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/25/website" target="_blank"><img src="https://opencollective.com/socketio/backer/25/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/26/website" target="_blank"><img src="https://opencollective.com/socketio/backer/26/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/27/website" target="_blank"><img src="https://opencollective.com/socketio/backer/27/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/28/website" target="_blank"><img src="https://opencollective.com/socketio/backer/28/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/backer/29/website" target="_blank"><img src="https://opencollective.com/socketio/backer/29/avatar.svg"></a>
|
||||
|
||||
|
||||
## Sponsors
|
||||
|
||||
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/socketio#sponsor)]
|
||||
|
||||
<a href="https://opencollective.com/socketio/sponsor/0/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/0/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/1/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/1/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/2/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/2/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/3/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/3/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/4/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/4/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/5/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/5/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/6/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/6/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/7/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/7/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/8/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/8/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/9/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/9/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/10/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/10/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/11/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/11/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/12/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/12/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/13/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/13/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/14/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/14/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/15/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/15/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/16/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/16/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/17/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/17/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/18/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/18/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/19/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/19/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/20/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/20/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/21/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/21/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/22/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/22/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/23/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/23/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/24/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/24/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/25/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/25/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/26/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/26/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/27/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/27/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/28/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/28/avatar.svg"></a>
|
||||
<a href="https://opencollective.com/socketio/sponsor/29/website" target="_blank"><img src="https://opencollective.com/socketio/sponsor/29/avatar.svg"></a>
|
||||
|
||||
|
||||
## License
|
||||
|
||||
[MIT](LICENSE)
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,126 @@
|
|||
{
|
||||
"_from": "socket.io",
|
||||
"_id": "socket.io@4.4.1",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==",
|
||||
"_location": "/socket.io",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "tag",
|
||||
"registry": true,
|
||||
"raw": "socket.io",
|
||||
"name": "socket.io",
|
||||
"escapedName": "socket.io",
|
||||
"rawSpec": "",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "latest"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"#USER",
|
||||
"/"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz",
|
||||
"_shasum": "cd6de29e277a161d176832bb24f64ee045c56ab8",
|
||||
"_spec": "socket.io",
|
||||
"_where": "E:\\xampp\\htdocs\\flood_app\\backend",
|
||||
"bugs": {
|
||||
"url": "https://github.com/socketio/socket.io/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Guillermo Rauch",
|
||||
"email": "rauchg@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Arnout Kazemier",
|
||||
"email": "info@3rd-eden.com"
|
||||
},
|
||||
{
|
||||
"name": "Vladimir Dronnikov",
|
||||
"email": "dronnikov@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Einar Otto Stangvik",
|
||||
"email": "einaros@gmail.com"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.4",
|
||||
"base64id": "~2.0.0",
|
||||
"debug": "~4.3.2",
|
||||
"engine.io": "~6.1.0",
|
||||
"socket.io-adapter": "~2.3.3",
|
||||
"socket.io-parser": "~4.0.4"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "node.js realtime framework server",
|
||||
"devDependencies": {
|
||||
"@types/mocha": "^9.0.0",
|
||||
"expect.js": "0.3.1",
|
||||
"mocha": "^3.5.3",
|
||||
"nyc": "^15.1.0",
|
||||
"prettier": "^2.3.2",
|
||||
"rimraf": "^3.0.2",
|
||||
"socket.io-client": "4.4.1",
|
||||
"socket.io-client-v2": "npm:socket.io-client@^2.4.0",
|
||||
"superagent": "^6.1.0",
|
||||
"supertest": "^6.1.6",
|
||||
"ts-node": "^10.2.1",
|
||||
"tsd": "^0.17.0",
|
||||
"typescript": "^4.4.2",
|
||||
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.0.0"
|
||||
},
|
||||
"directories": {
|
||||
"doc": "docs/",
|
||||
"example": "example/",
|
||||
"lib": "lib/",
|
||||
"test": "test/"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"exports": {
|
||||
"import": "./wrapper.mjs",
|
||||
"require": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts"
|
||||
},
|
||||
"files": [
|
||||
"dist/",
|
||||
"client-dist/",
|
||||
"wrapper.mjs",
|
||||
"!**/*.tsbuildinfo"
|
||||
],
|
||||
"homepage": "https://github.com/socketio/socket.io#readme",
|
||||
"keywords": [
|
||||
"realtime",
|
||||
"framework",
|
||||
"websocket",
|
||||
"tcp",
|
||||
"events",
|
||||
"socket",
|
||||
"io"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "./dist/index.js",
|
||||
"name": "socket.io",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/socketio/socket.io.git"
|
||||
},
|
||||
"scripts": {
|
||||
"compile": "rimraf ./dist && tsc",
|
||||
"format:check": "prettier --check \"lib/**/*.ts\" \"test/**/*.ts\"",
|
||||
"format:fix": "prettier --write \"lib/**/*.ts\" \"test/**/*.ts\"",
|
||||
"prepack": "npm run compile",
|
||||
"test": "npm run format:check && npm run compile && npm run test:types && npm run test:unit",
|
||||
"test:types": "tsd",
|
||||
"test:unit": "nyc mocha --require ts-node/register --reporter spec --slow 200 --bail --timeout 10000 test/socket.io.ts"
|
||||
},
|
||||
"tsd": {
|
||||
"directory": "test"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"types": "./dist/index.d.ts",
|
||||
"version": "4.4.1"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
import io from "./dist/index.js";
|
||||
|
||||
export const {Server, Namespace, Socket} = io;
|
|
@ -0,0 +1,77 @@
|
|||
import { create, Whatsapp } from 'venom-bot';
|
||||
import express, { type Request, type Response } from 'express';
|
||||
|
||||
let client: Whatsapp;
|
||||
|
||||
async function initBot() {
|
||||
try {
|
||||
client = await create({
|
||||
session: 'kurir-bot',
|
||||
headless: 'new',
|
||||
browserArgs: ['--no-sandbox'],
|
||||
});
|
||||
|
||||
console.log('WhatsApp bot connected');
|
||||
|
||||
client.onMessage(async (message) => {
|
||||
if (message.body === 'hi' && !message.isGroupMsg) {
|
||||
await client.sendText(message.from, 'Hello! 👋');
|
||||
}
|
||||
});
|
||||
|
||||
// Start the HTTP server after bot is ready
|
||||
startServer();
|
||||
} catch (err) {
|
||||
console.error('Failed to initialize bot:', err);
|
||||
}
|
||||
}
|
||||
|
||||
function startServer() {
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
|
||||
app.post('/send-otp', async (req: Request, res: Response) => {
|
||||
let { number, otp } = req.body;
|
||||
|
||||
// remove the 0 in front of the number
|
||||
if (number.startsWith('0')) {
|
||||
number = number.slice(1);
|
||||
}
|
||||
// add +62 to the number
|
||||
number = `+62${number}`;
|
||||
// convert to int
|
||||
number = parseInt(number);
|
||||
console.log(`Sending OTP ${otp} to ${number}`);
|
||||
|
||||
const formattedNumber = `${number}@c.us`;
|
||||
|
||||
try {
|
||||
await client.sendText(formattedNumber, `Kode OTP Anda: ${otp}`);
|
||||
console.log(`OTP ${otp} sent to ${number}`);
|
||||
res.status(200).json({ success: true });
|
||||
} catch (error) {
|
||||
// console.error(error);
|
||||
if (
|
||||
typeof error === 'object' &&
|
||||
error !== null &&
|
||||
'status' in error &&
|
||||
'text' in error
|
||||
) {
|
||||
const err = error as { status: number; text: string };
|
||||
console.log(err.status);
|
||||
console.log(err.text);
|
||||
const text_response = err.status == 404 ? 'Nomor Telpon Tidak Terdaftar Pada Whatsapp<br />Silahkan Periksa Nomor Telpon Anda' : err.text
|
||||
res.status(err.status).json(text_response);
|
||||
return;
|
||||
}
|
||||
res.status(500).json({ error: 'Failed to send OTP.' });
|
||||
}
|
||||
});
|
||||
|
||||
const PORT = 3012;
|
||||
app.listen(PORT, () => {
|
||||
console.log(`WhatsApp bot API listening on http://localhost:${PORT}`);
|
||||
});
|
||||
}
|
||||
|
||||
initBot();
|
|
@ -9,28 +9,28 @@ export async function testDatabaseConnection() {
|
|||
await mongoose.connect(process.env.MONGODB_URI as string);
|
||||
console.log('MongoDB Connection Successful!');
|
||||
|
||||
// Define a simple schema for the "test" collection
|
||||
const testSchema = new Schema({
|
||||
name: String,
|
||||
value: Number,
|
||||
});
|
||||
// // Define a simple schema for the "test" collection
|
||||
// const testSchema = new Schema({
|
||||
// name: String,
|
||||
// value: Number,
|
||||
// });
|
||||
|
||||
// Create a model based on the schema
|
||||
const TestModel = mongoose.model('Test', testSchema);
|
||||
// // Create a model based on the schema
|
||||
// const TestModel = mongoose.model('Test', testSchema);
|
||||
|
||||
// Insert a single document with a random value
|
||||
const singleData = { name: 'Random Item', value: Math.floor(Math.random() * 100) }; // Random number between 0 and 99
|
||||
// // Insert a single document with a random value
|
||||
// const singleData = { name: 'Random Item', value: Math.floor(Math.random() * 100) }; // Random number between 0 and 99
|
||||
|
||||
const createdItem = await TestModel.create(singleData);
|
||||
console.log('Single document inserted into "test" collection.', createdItem);
|
||||
// const createdItem = await TestModel.create(singleData);
|
||||
// console.log('Single document inserted into "test" collection.', createdItem);
|
||||
|
||||
// Optionally, retrieve and log the inserted data
|
||||
const insertedData = await TestModel.find();
|
||||
console.log('Inserted data:', insertedData);
|
||||
// // Optionally, retrieve and log the inserted data
|
||||
// const insertedData = await TestModel.find();
|
||||
// console.log('Inserted data:', insertedData);
|
||||
|
||||
// Disconnect from the database
|
||||
// await mongoose.disconnect();
|
||||
// console.log('MongoDB Disconnected.');
|
||||
// // Disconnect from the database
|
||||
// // await mongoose.disconnect();
|
||||
// // console.log('MongoDB Disconnected.');
|
||||
|
||||
} catch (error) {
|
||||
console.error('MongoDB Connection or Test Failed:', error);
|
||||
|
|
Before Width: | Height: | Size: 317 KiB After Width: | Height: | Size: 317 KiB |
Binary file not shown.
Before Width: | Height: | Size: 76 KiB |
Binary file not shown.
After Width: | Height: | Size: 317 KiB |
67
index.ts
67
index.ts
|
@ -1,10 +1,19 @@
|
|||
// ini adalah file utama dari aplikasi ini
|
||||
import express, { type Request, type Response } from 'express';
|
||||
|
||||
import http from 'http';
|
||||
|
||||
import * as socket from './socket';
|
||||
const socket_client = socket.clientSocket;
|
||||
|
||||
|
||||
// import formData from 'express-form-data';
|
||||
import fileUpload from 'express-fileupload';
|
||||
import {testDatabaseConnection} from './connection';
|
||||
import path from 'path';
|
||||
import adminRouter from './routes/admin_router';
|
||||
import userRouter from './routes/user_router';
|
||||
import kurirRouter from './routes/kurir_router';
|
||||
|
||||
|
||||
// this is for dotenv
|
||||
|
@ -17,6 +26,8 @@ console.log("diatas untuk dotenv");
|
|||
|
||||
const app = express();
|
||||
const port = process.env.PORT || 3011;
|
||||
const server = http.createServer(app);
|
||||
const io = socket.init(server);
|
||||
|
||||
|
||||
|
||||
|
@ -29,21 +40,61 @@ app.use(express.static(path.join(__dirname, 'assets')));
|
|||
app.use(fileUpload({
|
||||
createParentPath: true, // Creates the parent directory if it doesn't exist
|
||||
}));
|
||||
app.use(express.json());
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
|
||||
|
||||
|
||||
|
||||
testDatabaseConnection();
|
||||
|
||||
// create an admin route
|
||||
app.use('/admin', adminRouter);
|
||||
app.use('/kurir', kurirRouter);
|
||||
app.use('/', userRouter);
|
||||
|
||||
app.post('/submit', (req: Request, res: Response) => {
|
||||
console.log('Received form data:', req.body);
|
||||
res.json({ message: 'Form data received!', data: req.body });
|
||||
io.on('connection', (socket) => {
|
||||
const userID = socket.id;
|
||||
// console.log('A user connected: ' + userID);
|
||||
|
||||
socket.on('scan_dia', (data: any) => {
|
||||
console.log('Received scan_dia event: ' + data);
|
||||
io.emit('scan_dia_lagi', "coba");
|
||||
// socket.broadcast.emit('scan_dia_lagi', "coba");
|
||||
// // cobadulu();
|
||||
// io.emit('scan_dia_lagi', 'ini coba');
|
||||
});
|
||||
|
||||
socket.on('scan_dia_lagi', (data: any) => {
|
||||
console.log('Received scan_dia_lagi event: ' + data);
|
||||
});
|
||||
|
||||
socket.on('disconnect', () => {
|
||||
// console.log('User disconnected: ' + userID);
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/', (req: Request, res: Response) => {
|
||||
res.send("Express and express-form-data test");
|
||||
|
||||
// function cobadulu(){
|
||||
// console.log("coba");
|
||||
// socket_client.emit('scan_dia_lagi', 'ini coba');
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// app.post('/submit', (req: Request, res: Response) => {
|
||||
// console.log('Received form data:', req.body);
|
||||
// res.json({ message: 'Form data received!', data: req.body });
|
||||
// });
|
||||
|
||||
|
||||
|
||||
|
||||
// app.listen(port, async () => {
|
||||
// console.log(`Server is running on port ${port}`);
|
||||
// });
|
||||
server.listen(port, () => {
|
||||
console.log(`Server running on port ${port}`);
|
||||
});
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Server is running on port ${port}`);
|
||||
});
|
||||
export default { app, server, io };
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
import express from 'express';
|
||||
import { createServer } from 'http';
|
||||
import { Server } from 'socket.io';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const app = express();
|
||||
const server = createServer(app);
|
||||
const io = new Server(server, {
|
||||
cors: {
|
||||
origin: "*", // allow all for dev
|
||||
methods: ["GET", "POST"]
|
||||
}
|
||||
});
|
||||
|
||||
// Serve static files
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = path.dirname(__filename);
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
io.on('connection', (socket) => {
|
||||
console.log('✅ A user connected:', socket.id);
|
||||
|
||||
socket.on('scan_dia', (data: any) => {
|
||||
console.log('📩 Received scan_dia:', data);
|
||||
|
||||
});
|
||||
|
||||
socket.on('scan_dia_lagi', (data: any) => {
|
||||
console.log('📩 Received scan_dia_lagi:', data);
|
||||
// io.emit('scan_dia_lagi', "coba");
|
||||
});
|
||||
|
||||
socket.on('disconnect', () => {
|
||||
console.log('❌ User disconnected:', socket.id);
|
||||
});
|
||||
});
|
||||
|
||||
const PORT = 3011;
|
||||
server.listen(PORT, () => {
|
||||
console.log(`🚀 Server running at http://localhost:${PORT}`);
|
||||
});
|
|
@ -2,11 +2,13 @@ import mongoose from "mongoose";
|
|||
|
||||
const kurirSchema = new mongoose.Schema({
|
||||
no_telpon: { type: String, required: true, unique: true },
|
||||
password: { type: String },
|
||||
nama: { type: String, required: true },
|
||||
jenis_kelamin: { type: String, required: true },
|
||||
dd_motor: { type: String, required: true, unique: true },
|
||||
gambar_kurir: { type: String, required: true },
|
||||
gambar_motor: { type: String, required: true }
|
||||
gambar_motor: { type: String, required: true },
|
||||
status: { type: String },
|
||||
}, {
|
||||
timestamps: true // This auto-adds createdAt and updatedAt
|
||||
});
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
import mongoose from "mongoose";
|
||||
|
||||
const PendaftaranBaruSchema = new mongoose.Schema({
|
||||
no_telpon: { type: String, required: true, unique: true },
|
||||
nama: { type: String, required: true },
|
||||
password: { type: String, required: true },
|
||||
otp: { type: String, required: true },
|
||||
}, {
|
||||
timestamps: true // This auto-adds createdAt and updatedAt
|
||||
});
|
||||
|
||||
const PendafaranBaruModel = mongoose.model('Pendaftaran_Baru_Collection', PendaftaranBaruSchema);
|
||||
|
||||
export default PendafaranBaruModel;
|
|
@ -0,0 +1,16 @@
|
|||
import mongoose from "mongoose";
|
||||
|
||||
const userSchema = new mongoose.Schema({
|
||||
no_telpon: { type: String, required: true, unique: true },
|
||||
nama: { type: String, required: true },
|
||||
password: { type: String, required: true },
|
||||
alamat: { type: String, required: false },
|
||||
gambar: { type: String, required: false },
|
||||
|
||||
}, {
|
||||
timestamps: true // This auto-adds createdAt and updatedAt
|
||||
});
|
||||
|
||||
const UserModel = mongoose.model('User_Collection', userSchema);
|
||||
|
||||
export default UserModel;
|
|
@ -15,10 +15,14 @@
|
|||
"@types/express": "^5.0.0",
|
||||
"@types/express-fileupload": "^1.5.1",
|
||||
"@types/express-form-data": "^2.0.5",
|
||||
"axios": "^1.9.0",
|
||||
"dotenv": "^16.4.7",
|
||||
"express": "^4.21.2",
|
||||
"express-fileupload": "^1.5.1",
|
||||
"express-form-data": "^2.0.23",
|
||||
"mongoose": "^8.12.1"
|
||||
"mongoose": "^8.12.1",
|
||||
"socket.io": "^4.8.1",
|
||||
"socket.io-client": "^4.8.1",
|
||||
"venom-bot": "^5.3.0"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<!-- public/index.html -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Receiver Page</title>
|
||||
</head>
|
||||
<body>
|
||||
<h2>This is index.html (Receiver)</h2>
|
||||
|
||||
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
|
||||
<script>
|
||||
const socket = io();
|
||||
|
||||
socket.on('connect', () => {
|
||||
console.log('Connected to server:', socket.id);
|
||||
});
|
||||
|
||||
socket.on('scan_dia_lagi', (data) => {
|
||||
console.log('📨 Received scan_dia_lagi:', data);
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<!-- public/index2.html -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Emitter Page</title>
|
||||
</head>
|
||||
<body>
|
||||
<h2>This is index2.html (Emitter)</h2>
|
||||
<button onclick="emitScan()">Emit scan_dia_lagi</button>
|
||||
|
||||
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
|
||||
<script>
|
||||
const socket = io();
|
||||
|
||||
socket.on('connect', () => {
|
||||
console.log('Connected to server:', socket.id);
|
||||
});
|
||||
|
||||
function emitScan() {
|
||||
socket.emit('scan_dia_lagi', 'Hello from index2.html!');
|
||||
console.log('📤 Emitted scan_dia_lagi');
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -105,10 +105,11 @@ router.post('/kurir', async (req: Request, res: Response) => {
|
|||
|
||||
// Save to MongoDB
|
||||
const newKurir = new KurirModel({
|
||||
dd_motor,
|
||||
nama,
|
||||
no_telpon,
|
||||
password : no_telpon,
|
||||
nama,
|
||||
jenis_kelamin,
|
||||
dd_motor,
|
||||
gambar_kurir: `${no_telpon}_kurir_${random_5_char}.jpg`,
|
||||
gambar_motor: `${no_telpon}_motor_${random_5_char}.jpg`,
|
||||
});
|
||||
|
|
|
@ -25,6 +25,9 @@
|
|||
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
|
||||
<!-- Toastr -->
|
||||
<link rel="stylesheet" href="/plugin/toastr/toastr.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
@ -214,8 +217,35 @@
|
|||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<!-- Toastr -->
|
||||
<script src="/plugin/toastr/toastr.min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script src="/socketnya/client-dist/socket.io.js"></script>
|
||||
<script>
|
||||
const socket = io(); // Connects to your server
|
||||
|
||||
// function sendScanDia() {
|
||||
// const data = "Hello from client!";
|
||||
// socket.emit('scan_dia', data);
|
||||
// console.log('scan_dia sent:', data);
|
||||
// }
|
||||
|
||||
// sendScanDia();
|
||||
|
||||
socket.on('connect', () => {
|
||||
console.log('Connected to server:', socket.id);
|
||||
});
|
||||
|
||||
socket.on('pengiriman_baru1', (data) => {
|
||||
console.log('Received scan_dia event:', "data");
|
||||
toastr.info("Ada Pengiriman Baru Terdaftar");
|
||||
// console.log('Received scan_dia event:', data);
|
||||
// Do something with the received data
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -116,9 +116,13 @@
|
|||
<button type="button" class="btn btn-sm btn-info btn-rounded waves-effect waves-light"
|
||||
onclick="addKurirOpenModal()">Pendaftaran Kurir Baru</button>
|
||||
</div>
|
||||
<table id="tb-kurir" class="table table-striped table-bordered display" style="width:100%">
|
||||
<div class="form-group" style="overflow-x: auto;">
|
||||
<table id="tb-kurir" class="table table-striped table-bordered display"
|
||||
style="width:100%">
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
@ -253,7 +257,8 @@
|
|||
// destroy table
|
||||
// $('#tb-kurir').DataTable().destroy();
|
||||
$('#tb-kurir').DataTable({
|
||||
responsive: true,
|
||||
// responsive: true,
|
||||
scrollX: true,
|
||||
// order: [
|
||||
// [0, 'asc']
|
||||
// ],
|
||||
|
@ -282,6 +287,13 @@
|
|||
return data
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": "status",
|
||||
"title": "Status",
|
||||
"render": function (data, type, row) {
|
||||
return data == null || data == "" || data == undefined ? "Tersedia" : data
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": null,
|
||||
"title": "Aksi",
|
||||
|
@ -443,7 +455,7 @@
|
|||
$("#btn-update-kurir").hide()
|
||||
$('#modal-kurir').modal('show')
|
||||
var img = document.createElement('img');
|
||||
img.src = 'kurir/gambar/' + data.no_telpon + '/'+ data.gambar_kurir;
|
||||
img.src = 'kurir/gambar/' + data.no_telpon + '/' + data.gambar_kurir;
|
||||
img.style.maxWidth = '100%'; // Make the image fit the width of the div
|
||||
img.style.maxHeight = '100%'; // Make the image fit the height of the div
|
||||
|
||||
|
@ -457,7 +469,7 @@
|
|||
previewDiv.appendChild(img);
|
||||
|
||||
var img = document.createElement('img');
|
||||
img.src = 'kurir/gambar/' + data.no_telpon + '/'+ data.gambar_motor;
|
||||
img.src = 'kurir/gambar/' + data.no_telpon + '/' + data.gambar_motor;
|
||||
img.style.maxWidth = '100%'; // Make the image fit the width of the div
|
||||
img.style.maxHeight = '100%'; // Make the image fit the height of the div
|
||||
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
import express from 'express';
|
||||
import type { Request, Response } from 'express';
|
||||
import PendafaranBaruModel from '../models/pendaftaran_baru_model';
|
||||
import KurirModel from '../models/kurir_model';
|
||||
import type { UploadedFile } from 'express-fileupload';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', (req: Request, res: Response) => {
|
||||
res.sendFile(__dirname + '/kurir_ui/index.html');
|
||||
});
|
||||
|
||||
router.get('/login', (req: Request, res: Response) => {
|
||||
res.sendFile(__dirname + '/kurir_ui/login.html');
|
||||
});
|
||||
|
||||
router.post('/login', async (req: Request, res: Response) => {
|
||||
const { no_telpon, password } = req.body;
|
||||
|
||||
try {
|
||||
const user = await KurirModel.findOne({ no_telpon, password });
|
||||
if (user) {
|
||||
res.status(200).json(user);
|
||||
return;
|
||||
}
|
||||
res.status(400).json('Nomor Telpon atau Password Salah');
|
||||
return;
|
||||
} catch (error) {
|
||||
console.log("error di kurir login",error);
|
||||
res.status(500).json('Terjadi Kesalahan Server');
|
||||
return;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
router.get('/:jenis/:gambar', (req: Request, res: Response) => {
|
||||
const { jenis, gambar } = req.params;
|
||||
const imagePath = path.join(__dirname, `../images/${jenis}/${gambar}`);
|
||||
|
||||
if (fs.existsSync(imagePath)) {
|
||||
res.sendFile(imagePath);
|
||||
} else {
|
||||
res.status(404).send('Image not found');
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
router.post('/check', async (req: Request, res: Response) => {
|
||||
if (!req.body) {
|
||||
res.status(400).json('Bad Request');
|
||||
return;
|
||||
}
|
||||
const { _id, no_telpon, password, createdAt } = req.body;
|
||||
console.log(_id , no_telpon , password , createdAt);
|
||||
|
||||
// console.log(_id , no_telpon , password , createdAt);
|
||||
try {
|
||||
// check the user by _id , no_telpon , password , createdAt
|
||||
const user = await KurirModel.findOne({ _id, no_telpon, password, createdAt });
|
||||
if (!user) {
|
||||
res.status(400).json('User not found');
|
||||
return;
|
||||
}
|
||||
|
||||
res.status(200).json('Success');
|
||||
return;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
res.status(500).json('Terjadi Kesalahan Server');
|
||||
return
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
export default router;
|
|
@ -0,0 +1,306 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Shenior Kurir | Halaman Utama</title>
|
||||
|
||||
<!-- Main Styles -->
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- mCustomScrollbar -->
|
||||
<link rel="stylesheet" href="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Sweet Alert -->
|
||||
<link rel="stylesheet" href="/plugin/sweet-alert/sweetalert.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/fontello/fontello.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
<script src="/auth.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main-menu">
|
||||
<header class="header">
|
||||
<a href="/admin" class="logo">Shenior Kurir</a>
|
||||
<button type="button" class="button-close fa fa-times js__menu_close"></button>
|
||||
<div class="user">
|
||||
<a href="#" class="avatar"><img src="/images/admin.png" id="img-avatar" alt=""><span
|
||||
class="status online"></span></a>
|
||||
<h5 class="name"><a href="#" id="h5-title">...</a></h5>
|
||||
<h5 class="position">Kurir</h5>
|
||||
|
||||
</div>
|
||||
<!-- /.user -->
|
||||
</header>
|
||||
<!-- /.header -->
|
||||
<div class="content">
|
||||
|
||||
<div class="navigation">
|
||||
<h5 class="title">Navigasi</h5>
|
||||
<!-- /.title -->
|
||||
<ul class="menu js__accordion">
|
||||
<li class="current active">
|
||||
<a class="waves-effect" href="/kurir"><i class="menu-icon fa fa-home"></i><span>Halaman
|
||||
Utama</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/kurir/penghantaran"><i
|
||||
class="menu-icon ico mdi mdi-motorbike"></i><span>Pengiriman Paket</span></a>
|
||||
</li>
|
||||
|
||||
<!-- <li>
|
||||
<a class="waves-effect" href="#" onclick="notAvailable()"><i
|
||||
class="menu-icon fa fa-users"></i><span>List User</span></a>
|
||||
</li> -->
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="#" onclick="notAvailable()"><i
|
||||
class="menu-icon ico icon-table"></i><span>Log Penghantaran</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/kurir/profil"><i
|
||||
class="menu-icon fa fa-unlock-alt"></i><span>Ganti Password</span></a>
|
||||
</li>
|
||||
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="#" onclick="logout()"><i
|
||||
class="menu-icon ico icon-logout"></i><span>Logout</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- /.navigation -->
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.main-menu -->
|
||||
|
||||
<div class="fixed-navbar">
|
||||
<div class="pull-left">
|
||||
<button type="button"
|
||||
class="menu-mobile-button glyphicon glyphicon-menu-hamburger js__menu_mobile"></button>
|
||||
<h1 class="page-title">Halaman Utama</h1>
|
||||
<!-- /.page-title -->
|
||||
</div>
|
||||
<!-- /.pull-left -->
|
||||
<div class="pull-right">
|
||||
|
||||
|
||||
<a href="#" class="ico-item ico icon-logout" onclick="logout()"></a>
|
||||
</div>
|
||||
<!-- /.pull-right -->
|
||||
</div>
|
||||
<!-- /.fixed-navbar -->
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="main-content">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-6 col-md-6 col-xs-6">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Pengguna</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kiriman.png" alt="" style="width: 100%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="murid-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-6 col-md-6 col-xs-6">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Kiriman Dilakukan</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kiriman2.png" alt="" style="width: 100%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="staf-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<!-- <div class="col-xs-12">
|
||||
<div class="box-content card">
|
||||
<img src="/images/habibie.jpg" alt="" style="width: 100%; border-radius: 30px;">
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="row small-spacing">
|
||||
<div class="col-lg-2 col-md-2 col-xs-12"></div>
|
||||
<div class="col-lg-8 col-md-8 col-xs-12">
|
||||
<div class="box-content card white">
|
||||
<h4 class="box-title">Profil Kurir</h4>
|
||||
<form class="card-content" id="form-kurir">
|
||||
<div class="form-group">
|
||||
<!-- show the upload -->
|
||||
<div id="show-upload-gambar-kurir">
|
||||
<center>
|
||||
<div id="preview-gambar-kurir" style="height: 200px; width: 150px"></div>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="form-group" id="form-gambar-kurir">
|
||||
<label for="modal-kurir-nama">Photo Kurir</label>
|
||||
<input type="file" class="form-control" id="gambar-kurir" accept="image/*"
|
||||
onchange="showUpload(this, 'gambar-kurir')">
|
||||
</div> -->
|
||||
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-nama">Nama</label>
|
||||
<input type="text" class="form-control" id="nama" placeholder="Masukkan Nama">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-nama">Status</label>
|
||||
<input type="text" class="form-control" id="status" placeholder="Masukkan Status">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-nama">No Telpon/HP</label>
|
||||
<input type="text" class="form-control" id="no_telpon" oninput="numberOnly(this)"
|
||||
maxlength="13" placeholder="Masukkan No Telpon/HP">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-nama">Jenis Kelamin</label>
|
||||
<select class="form-control" id="jenis-kelamin">
|
||||
<option value="" disabled selected>-Pilih Jenis Kelamin</option>
|
||||
<option value="Laki-laki">Laki-laki</option>
|
||||
<option value="Perempuan">Perempuan</option>
|
||||
</select>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="form-group">
|
||||
<div id="show-upload-gambar-motor">
|
||||
<center>
|
||||
<div id="preview-gambar-motor" style="height: 200px; width: 150px"></div>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="form-group" id="form-gambar-motor">
|
||||
<label for="modal-kurir-nama">Photo Motor</label>
|
||||
<input type="file" class="form-control" id="gambar-motor" accept="image/*"
|
||||
onchange="showUpload(this, 'gambar-motor')">
|
||||
</div> -->
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-dd-motor">DD Motor</label>
|
||||
<input type="text" class="form-control" id="dd-motor" placeholder="Masukkan DD Motor">
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-md-2 col-xs-12"></div>
|
||||
</div>
|
||||
<footer class="footer">
|
||||
<ul class="list-inline">
|
||||
<li>Arifuddin Naawi Amanah © 2025.</li>
|
||||
<!-- <li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Help</a></li> -->
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /.main-content -->
|
||||
</div><!--/#wrapper -->
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/sweet-alert/sweetalert.min.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script src="/socketnya/client-dist/socket.io.js"></script>
|
||||
<script>
|
||||
const global_data = JSON.parse(localStorage.getItem('user'));
|
||||
console.log(global_data);
|
||||
|
||||
const form = document.querySelector('#form-kurir');
|
||||
form.querySelectorAll('input, select, textarea, button').forEach(el => {
|
||||
el.disabled = true;
|
||||
});
|
||||
|
||||
let img = document.createElement('img');
|
||||
img.src = 'kurir/motor/' + global_data.gambar_motor;
|
||||
img.width = 200;
|
||||
img.height = 200;
|
||||
document.getElementById('preview-gambar-motor').appendChild(img);
|
||||
let img2 = document.createElement('img');
|
||||
img2.src = 'kurir/kurir/' + global_data.gambar_kurir;
|
||||
img2.width = 200;
|
||||
img2.height = 200;
|
||||
document.getElementById('preview-gambar-kurir').appendChild(img2);
|
||||
|
||||
document.getElementById('h5-title').innerHTML = global_data.nama;
|
||||
|
||||
$("#nama").val(global_data.nama);
|
||||
$("#no_telpon").val(global_data.no_telpon);
|
||||
$("#status").val(global_data.status == null ? "Tersedia" : global_data.status);
|
||||
$("#jenis-kelamin").val(global_data.jenis_kelamin);
|
||||
$("#dd-motor").val(global_data.dd_motor);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,104 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Halaman Login Kurir</title>
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Toastr -->
|
||||
<link rel="stylesheet" href="/plugin/toastr/toastr.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="single-wrapper">
|
||||
<form action="#" class="frm-single">
|
||||
<div class="inside">
|
||||
<div class="title"><strong>Shenior</strong> Kurir</div>
|
||||
<!-- /.title -->
|
||||
<div class="frm-title">Login Kurir</div>
|
||||
<!-- /.frm-title -->
|
||||
<div class="frm-input"><input type="text" id="username" placeholder="No Telpon" class="frm-inp"><i class="fa fa-user frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
<div class="frm-input"><input type="password" id="password" placeholder="Password" class="frm-inp"><i class="fa fa-lock frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
|
||||
<button type="button" class="frm-submit" onclick="login()">Login<i class="fa fa-arrow-circle-right"></i></button>
|
||||
|
||||
|
||||
<a href="/" class="a-link"><i class="fa fa-home"></i>Kembali Ke Halaman Utama.</a>
|
||||
|
||||
<div class="frm-footer">Arifuddin Naawi Amanah © 2025.</div>
|
||||
<!-- /.footer -->
|
||||
</div>
|
||||
<!-- .inside -->
|
||||
</form>
|
||||
<!-- /.frm-single -->
|
||||
</div><!--/#single-wrapper -->
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
|
||||
<!-- Toastr -->
|
||||
<script src="/plugin/toastr/toastr.min.js"></script>
|
||||
|
||||
<script src="/block/jquery.blockUI.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script>
|
||||
function login() {
|
||||
var username = $("#username").val();
|
||||
var password = $("#password").val();
|
||||
|
||||
$.ajax({
|
||||
url: "/kurir/login",
|
||||
type: "POST",
|
||||
data: {
|
||||
no_telpon: username,
|
||||
password: password
|
||||
},
|
||||
beforeSend: function () {
|
||||
blockUI('Login Sedang Diproses...');
|
||||
|
||||
},
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
$.unblockUI();
|
||||
toastr.success("Login Berhasil");
|
||||
// create local storage
|
||||
localStorage.setItem('user', JSON.stringify(data));
|
||||
localStorage.setItem('role', 'kurir');
|
||||
// 2 sec the to halaman login
|
||||
setTimeout(() => {
|
||||
window.location.href = "/kurir";
|
||||
}, 2500);
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
$.unblockUI();
|
||||
toastr.error(xhr.responseJSON !== undefined ? xhr.responseJSON : "Terjadi Kesalahan Server");
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,206 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Shenior Kurir | Halaman Utama</title>
|
||||
|
||||
<!-- Main Styles -->
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- mCustomScrollbar -->
|
||||
<link rel="stylesheet" href="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Sweet Alert -->
|
||||
<link rel="stylesheet" href="/plugin/sweet-alert/sweetalert.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/fontello/fontello.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
<script src="/auth.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main-menu">
|
||||
<header class="header">
|
||||
<a href="/admin" class="logo">Shenior Kurir</a>
|
||||
<button type="button" class="button-close fa fa-times js__menu_close"></button>
|
||||
<div class="user">
|
||||
<a href="#" class="avatar"><img src="/images/person.png" alt=""><span class="status online"></span></a>
|
||||
<h5 class="name"><a href="#" id="h5-title">...</a></h5>
|
||||
<h5 class="position">Pengguna</h5>
|
||||
|
||||
</div>
|
||||
<!-- /.user -->
|
||||
</header>
|
||||
<!-- /.header -->
|
||||
<div class="content">
|
||||
|
||||
<div class="navigation">
|
||||
<h5 class="title">Navigasi</h5>
|
||||
<!-- /.title -->
|
||||
<ul class="menu js__accordion">
|
||||
<li class="current active">
|
||||
<a class="waves-effect" href="/user"><i class="menu-icon fa fa-home"></i><span>Halaman
|
||||
Utama</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/user/kirim-paket"><i class="menu-icon ico mdi mdi-motorbike"></i><span>Pengiriman Paket</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="#" onclick="notAvailable()"><i
|
||||
class="menu-icon ico icon-table"></i><span>History Pengiriman</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/user/profil" ><i
|
||||
class="menu-icon ico icon-user"></i><span>Profil Pengunna</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" onclick="logout()" href="#"><i
|
||||
class="menu-icon ico icon-logout"></i><span>Logout</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- /.navigation -->
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.main-menu -->
|
||||
|
||||
<div class="fixed-navbar">
|
||||
<div class="pull-left">
|
||||
<button type="button" class="menu-mobile-button glyphicon glyphicon-menu-hamburger js__menu_mobile"></button>
|
||||
<h1 class="page-title">Halaman Utama</h1>
|
||||
<!-- /.page-title -->
|
||||
</div>
|
||||
<!-- /.pull-left -->
|
||||
<div class="pull-right">
|
||||
|
||||
|
||||
<a href="#" onclick="logout()" class="ico-item ico icon-logout" ></a>
|
||||
</div>
|
||||
<!-- /.pull-right -->
|
||||
</div>
|
||||
<!-- /.fixed-navbar -->
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="main-content">
|
||||
<div class="row">
|
||||
|
||||
|
||||
|
||||
<div class="col-lg-6 col-md-6 col-xs-6">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Kurir Tersedia</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kurir.png" alt="" style="width: 100%;">
|
||||
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="guru-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-6 col-md-6 col-xs-6">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Paket Terkirim</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kiriman2.png" alt="" style="width: 100%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="staf-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12">
|
||||
<div class="box-content card">
|
||||
<img src="/images/habibie.jpg" alt="" style="width: 100%; border-radius: 30px;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer">
|
||||
<ul class="list-inline">
|
||||
<li>Arifuddin Naawi Amanah © 2025.</li>
|
||||
<!-- <li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Help</a></li> -->
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /.main-content -->
|
||||
</div><!--/#wrapper -->
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/sweet-alert/sweetalert.min.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script>
|
||||
const global_data = JSON.parse(localStorage.getItem('user'));
|
||||
document.getElementById('h5-title').innerHTML = global_data.nama;
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,265 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Shenior Kurir | Pengiriman Paket</title>
|
||||
|
||||
<!-- Main Styles -->
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- mCustomScrollbar -->
|
||||
<link rel="stylesheet" href="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Sweet Alert -->
|
||||
<link rel="stylesheet" href="/plugin/sweet-alert/sweetalert.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/fontello/fontello.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
|
||||
<link rel="stylesheet" href="/plugin/datatables/media/css/dataTables.bootstrap.min.css">
|
||||
|
||||
<!-- Toastr -->
|
||||
<link rel="stylesheet" href="/plugin/toastr/toastr.css">
|
||||
<script src="/auth.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main-menu">
|
||||
<header class="header">
|
||||
<a href="/admin" class="logo">Shenior Kurir</a>
|
||||
<button type="button" class="button-close fa fa-times js__menu_close"></button>
|
||||
<div class="user">
|
||||
<a href="#" class="avatar"><img src="/images/person.png" alt=""><span class="status online"></span></a>
|
||||
<h5 class="name"><a href="#" id="h5-title">...</a></h5>
|
||||
<h5 class="position">Pengguna</h5>
|
||||
|
||||
</div>
|
||||
<!-- /.user -->
|
||||
</header>
|
||||
<!-- /.header -->
|
||||
<div class="content">
|
||||
|
||||
<div class="navigation">
|
||||
<h5 class="title">Navigasi</h5>
|
||||
<!-- /.title -->
|
||||
<ul class="menu js__accordion">
|
||||
<li>
|
||||
<a class="waves-effect" href="/user"><i class="menu-icon fa fa-home"></i><span>Halaman
|
||||
Utama</span></a>
|
||||
</li>
|
||||
|
||||
<li class="current active">
|
||||
<a class="waves-effect" href="/user/kirim-paket"><i
|
||||
class="menu-icon ico mdi mdi-motorbike"></i><span>Pengiriman Paket</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="#" onclick="notAvailable()"><i
|
||||
class="menu-icon ico icon-table"></i><span>History Pengiriman</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/user/profil"><i class="menu-icon ico icon-user"></i><span>Profil
|
||||
Pengunna</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" onclick="logout()" href="#"><i
|
||||
class="menu-icon ico icon-logout"></i><span>Logout</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- /.navigation -->
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.main-menu -->
|
||||
|
||||
<div class="fixed-navbar">
|
||||
<div class="pull-left">
|
||||
<button type="button"
|
||||
class="menu-mobile-button glyphicon glyphicon-menu-hamburger js__menu_mobile"></button>
|
||||
<h1 class="page-title">Pengiriman Paket</h1>
|
||||
<!-- /.page-title -->
|
||||
</div>
|
||||
<!-- /.pull-left -->
|
||||
<div class="pull-right">
|
||||
|
||||
|
||||
<a href="#" class="ico-item ico icon-logout" onclick="logout()"></a>
|
||||
</div>
|
||||
<!-- /.pull-right -->
|
||||
</div>
|
||||
<!-- /.fixed-navbar -->
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="main-content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-12">
|
||||
<div class="box-content card">
|
||||
<h4 class="box-title">Form Kurir</h4>
|
||||
<!-- /.box-title -->
|
||||
<div class="card-content">
|
||||
<div class="form-group">
|
||||
<button type="button" class="btn btn-sm btn-info btn-rounded waves-effect waves-light"
|
||||
onclick="addpaketOpenModal()">Pendaftaran Kurir Baru</button>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<footer class="footer">
|
||||
<ul class="list-inline">
|
||||
<li>Arifuddin Naawi Amanah © 2025.</li>
|
||||
<!-- <li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Help</a></li> -->
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /.main-content -->
|
||||
</div><!--/#wrapper -->
|
||||
|
||||
<div class="modal fade" id="modal-paket" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
|
||||
aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="modal-paket-title">Modal title</h4>
|
||||
</div>
|
||||
<form class="modal-body" id="form-modal">
|
||||
<div class="form-group">
|
||||
<!-- show the upload -->
|
||||
<div id="show-upload-gambar-kurir" style="display: none">
|
||||
<center>
|
||||
<div id="preview-gambar-kurir" style="height: 200px; width: 150px"></div>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" id="form-gambar-kurir">
|
||||
<!-- create upload -->
|
||||
<label for="modal-kurir-nama">Photo Kurir</label>
|
||||
<input type="file" class="form-control" id="gambar-kurir" accept="image/*"
|
||||
onchange="showUpload(this, 'gambar-kurir')">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-no-telpon">No Telpon/HP Yang Dihubungi</label>
|
||||
<input type="text" class="form-control" id="no_telpon" oninput="numberOnly(this)" maxlength="13"
|
||||
placeholder="Masukkan No Telpon/HP Yang Dihubungi">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-alamat">Alamat Pengiriman</label>
|
||||
<textarea name="alamat" class="form-control" id="alamat"
|
||||
placeholder="Masukkan Alamat"></textarea>
|
||||
</div>
|
||||
<hr>
|
||||
|
||||
</form>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default btn-sm waves-effect waves-light"
|
||||
data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-primary btn-sm waves-effect waves-light" id="btn-pengiriman"
|
||||
onclick="tambahpengiriman()">Lakukan Pengiriman</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/sweet-alert/sweetalert.min.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<script src="/plugin/datatables/media/js/jquery.dataTables.min.js"></script>
|
||||
<script src="/plugin/datatables/media/js/dataTables.bootstrap.min.js"></script>
|
||||
<script src="/plugin/datatables/extensions/Responsive/js/dataTables.responsive.min.js"></script>
|
||||
|
||||
<!-- Toastr -->
|
||||
<script src="/plugin/toastr/toastr.min.js"></script>
|
||||
|
||||
<script src="/block/jquery.blockUI.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script src="/socket-io/client-dist/socket.io.js"></script>
|
||||
<script>
|
||||
const socket = io(); // Connects to your server
|
||||
|
||||
|
||||
socket.on('connect', () => {
|
||||
console.log('Connected to server:', socket.id);
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
const global_data = JSON.parse(localStorage.getItem('user'));
|
||||
document.getElementById('h5-title').innerHTML = global_data.nama;
|
||||
</script>
|
||||
<script>
|
||||
function addpaketOpenModal() {
|
||||
$('#modal-paket-title').html('Form Pengiriman Paket Baru');
|
||||
$('#modal-paket').modal('show');
|
||||
}
|
||||
function tambahpengiriman() {
|
||||
$.ajax({
|
||||
url: '/user/kirim-paket/',
|
||||
type: 'POST',
|
||||
data: {},
|
||||
beforeSend: function () {
|
||||
|
||||
},
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
// This triggers the event
|
||||
socket.emit('scan_dia_lagi', 'hello from paket.html');
|
||||
$('#modal-paket').modal('hide');
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,158 @@
|
|||
import express from 'express';
|
||||
import type { Request, Response } from 'express';
|
||||
import PendafaranBaruModel from '../models/pendaftaran_baru_model';
|
||||
import UserModel from '../models/user_model';
|
||||
import type { UploadedFile } from 'express-fileupload';
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import axios from 'axios';
|
||||
|
||||
const router = express.Router();
|
||||
import * as socket from '../socket';
|
||||
const socket_client = socket.clientSocket;
|
||||
|
||||
router.get('/', (req: Request, res: Response) => {
|
||||
// socket_client.emit('scan_dia', 'test');
|
||||
res.sendFile(__dirname + '/user_ui/index.html');
|
||||
});
|
||||
|
||||
// router.get('/coba', async (req: Request, res: Response) => {
|
||||
// res.status(200).json('success');
|
||||
// })
|
||||
|
||||
router.get('/login', (req: Request, res: Response) => {
|
||||
res.sendFile(__dirname + '/user_ui/login.html');
|
||||
})
|
||||
|
||||
router.post('/login', async (req: Request, res: Response) => {
|
||||
const { no_telpon, password } = req.body;
|
||||
const user = await UserModel.findOne({ no_telpon, password });
|
||||
if (user) {
|
||||
console.log(user);
|
||||
res.status(200).json(user);
|
||||
return;
|
||||
}
|
||||
res.status(400).json('Nomor Telpon atau Password Salah');
|
||||
})
|
||||
|
||||
router.get('/daftar', (req: Request, res: Response) => {
|
||||
res.sendFile(__dirname + '/user_ui/daftar.html');
|
||||
})
|
||||
|
||||
router.post('/daftar', async (req: Request, res: Response) => {
|
||||
const { no_telpon, nama, password } = req.body;
|
||||
// check the user
|
||||
const user = await UserModel.findOne({ no_telpon });
|
||||
if (user) {
|
||||
res.status(400).json('Nomor Telpon sudah terdaftar');
|
||||
return;
|
||||
}
|
||||
|
||||
// check the pendaftaran baru
|
||||
const pencarian_data = await PendafaranBaruModel.findOne({ no_telpon });
|
||||
if (pencarian_data) {
|
||||
// delete the pendaftaran baru with no_telpon
|
||||
await PendafaranBaruModel.deleteOne({ no_telpon });
|
||||
}
|
||||
|
||||
const otp = Math.floor(Math.random() * 1000000);
|
||||
// create pendaftaran baru
|
||||
|
||||
|
||||
// create a 6 otp random otp code
|
||||
|
||||
try {
|
||||
const response = await axios.post('http://localhost:3012/send-otp', { number: no_telpon, otp });
|
||||
const pendaftaran_baru = new PendafaranBaruModel({ no_telpon, nama, password, otp });
|
||||
await pendaftaran_baru.save();
|
||||
res.status(200).json('success');
|
||||
return;
|
||||
} catch (error: any) {
|
||||
// console.log(error);
|
||||
res.status(error.response.status).json(error.response.data);
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
|
||||
// res.status(400).json('error dari backend');
|
||||
});
|
||||
|
||||
router.post('/verifikasi', async (req: Request, res: Response) => {
|
||||
const { no_telpon, kode_otp } = req.body;
|
||||
const pencarian_data = await PendafaranBaruModel.findOne({ no_telpon });
|
||||
if (!pencarian_data) {
|
||||
res.status(400).json('Nomor Telpon tidak ditemukan');
|
||||
return;
|
||||
}
|
||||
|
||||
if (pencarian_data.otp == kode_otp) {
|
||||
const user = new UserModel({ no_telpon, nama: pencarian_data.nama, password: pencarian_data.password });
|
||||
await user.save();
|
||||
await PendafaranBaruModel.deleteOne({ no_telpon });
|
||||
res.status(200).json('success');
|
||||
return;
|
||||
}
|
||||
res.status(400).json('Kode OTP Salah');
|
||||
return
|
||||
})
|
||||
|
||||
|
||||
router.get('/user', (req: Request, res: Response) => {
|
||||
res.sendFile(__dirname + '/user_after_login_ui/index.html');
|
||||
})
|
||||
|
||||
|
||||
router.get('/user/kirim-paket', async (req: Request, res: Response) => {
|
||||
res.sendFile(__dirname + '/user_after_login_ui/paket.html');
|
||||
})
|
||||
|
||||
router.post('/user/kirim-paket', async (req: Request, res: Response) => {
|
||||
console.log("kirim paket");
|
||||
socket_client.emit('scan_dia', 'ini dari kirim-paket');
|
||||
res.status(200).json("ini")
|
||||
})
|
||||
|
||||
router.get('/user/kirim-paket1', async (req: Request, res: Response) => {
|
||||
console.log("kirim paket");
|
||||
socket_client.emit('scan_dia', 'ini dari kirim-paket');
|
||||
res.status(200).json("ini")
|
||||
})
|
||||
|
||||
|
||||
router.post('/user/check', async (req: Request, res: Response) => {
|
||||
if (!req.body) {
|
||||
res.status(400).json('Bad Request');
|
||||
return;
|
||||
}
|
||||
const { _id, no_telpon, password, createdAt } = req.body;
|
||||
|
||||
// console.log(_id , no_telpon , password , createdAt);
|
||||
try {
|
||||
// check the user by _id , no_telpon , password , createdAt
|
||||
const user = await UserModel.findOne({ _id, no_telpon, password, createdAt });
|
||||
if (!user) {
|
||||
res.status(400).json('User not found');
|
||||
return;
|
||||
}
|
||||
|
||||
res.status(200).json('Success');
|
||||
return;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
res.status(500).json('Terjadi Kesalahan Server');
|
||||
return
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
// This should be the last route
|
||||
router.use((req: Request, res: Response) => {
|
||||
res.status(404).sendFile(__dirname + '/user_ui/404.html');
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
export default router;
|
|
@ -0,0 +1,56 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>404 Halaman Tidak Ditemukan</title>
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="page-404">
|
||||
<div class="content">
|
||||
<div class="title-on-desktop">
|
||||
<svg style="width: 600px; height: 200px" alignment-baseline="middle">
|
||||
<defs>
|
||||
<clipPath id="clip2">
|
||||
<path d="M 0 0 L 600 0 L 600 80 L 0 80 L 0 0 L 0 125 L 600 125 L 600 200 L 0 200 Z" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<text x="300" y="190" style="width: 600px; height: 200px" text-anchor="middle" font-family="Lato" font-weight="700" font-size="250" fill="#505458" clip-path="url(#clip2)">4<tspan fill="#35b8e0">0</tspan>4</text>
|
||||
</svg>
|
||||
<div class="title">Halaman Tidak Ditemukan</div>
|
||||
</div>
|
||||
<h1 class="title-on-mobile">Error 404: Halaman Tidak Ditemukan</h1>
|
||||
<p>Kamu sepertinya salah ambil belokan. Jangan khawatir... itu terjadi pada yang terbaik. Kamu mungkin ingin memeriksa koneksi internetmu. Berikut tips kecil yang mungkin membantumu kembali ke jalur yang benar.</p>
|
||||
<a href="#" onclick="history.back(); return false;" class="btn btn-info">Kembali</a>
|
||||
|
||||
</div>
|
||||
</div><!--/#single-wrapper -->
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,210 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Pendaftaran Penguna</title>
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
<!-- Toastr -->
|
||||
<link rel="stylesheet" href="/plugin/toastr/toastr.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="single-wrapper">
|
||||
<form action="#" class="frm-single">
|
||||
<div class="inside">
|
||||
<div class="title"><strong>Shenior</strong> Kurir</div>
|
||||
<!-- /.title -->
|
||||
<div class="frm-title">Pendaftaran Pengguna</div>
|
||||
<!-- /.frm-title -->
|
||||
<div class="frm-input"><input id="no_telpon" type="text" placeholder="No Telpon" class="frm-inp"
|
||||
oninput="numberOnly(this)" maxlength="13" minlength="11"><i class="fa fa-phone frm-ico"></i>
|
||||
</div>
|
||||
<!-- /.frm-input -->
|
||||
<div class="frm-input"><input id="nama" type="text" placeholder="Nama" class="frm-inp"><i
|
||||
class="fa fa-user frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
<div class="frm-input"><input id="password" type="password" placeholder="Password" class="frm-inp"><i
|
||||
class="fa fa-lock frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
<div class="frm-input"><input id="konfirmasi_password" type="password" placeholder="Konfirmasi Password"
|
||||
class="frm-inp"><i class="fa fa-lock frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
|
||||
<button type="button" class="frm-submit" onclick="daftar()">Mendaftar<i
|
||||
class="fa fa-arrow-circle-right"></i></button>
|
||||
<a href="/" class="a-link"><i class="fa fa-home"></i>Kembali Ke Halaman Utama.</a>
|
||||
|
||||
|
||||
|
||||
<div class="frm-footer">Arifuddin Naawi Amanah © 2025.</div>
|
||||
<!-- /.footer -->
|
||||
</div>
|
||||
<!-- .inside -->
|
||||
</form>
|
||||
<!-- /.frm-single -->
|
||||
</div><!--/#single-wrapper -->
|
||||
|
||||
<div class="modal fade" id="modal-otp" tabindex="-1" role="dialog" aria-labelledby="myModalLabel-2">
|
||||
<div class="modal-dialog modal-sm" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
|
||||
aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="myModalLabel-2">Kode OTP</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="modal-kurir-nama">Kode OTP</label>
|
||||
<input type="text" class="form-control" id="kode_otp" oninput="numberOnly(this)" maxlength="6"
|
||||
placeholder="Masukkan Kode OTP ">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default btn-sm waves-effect waves-light"
|
||||
data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-primary btn-sm waves-effect waves-light" onclick="verifikasi()">Verifikasi</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
|
||||
<!-- Toastr -->
|
||||
<script src="/plugin/toastr/toastr.min.js"></script>
|
||||
|
||||
<script src="/block/jquery.blockUI.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script>
|
||||
function daftar() {
|
||||
const no_telpon = $("#no_telpon").val();
|
||||
const nama = $("#nama").val();
|
||||
const password = $("#password").val();
|
||||
const konfirmasi_password = $("#konfirmasi_password").val();
|
||||
|
||||
if (no_telpon === "" || nama === "" || password === "" || konfirmasi_password === "") {
|
||||
toastr.error("Form Harus Diisi Semua");
|
||||
return;
|
||||
}
|
||||
|
||||
// if (password.length < 8) {
|
||||
// toastr.error("Password Minimal 8 Karakter");
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (no_telpon.length < 11) {
|
||||
toastr.error("No Telpon Minimal 11 Karakter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (password !== konfirmasi_password) {
|
||||
toastr.error("Password Tidak Sama");
|
||||
return;
|
||||
}
|
||||
|
||||
const data = {
|
||||
no_telpon,
|
||||
nama,
|
||||
password
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/daftar",
|
||||
type: "POST",
|
||||
data: JSON.stringify(data),
|
||||
contentType: "application/json",
|
||||
beforeSend: function () {
|
||||
// blockUI('Pendaftaran Sedang Diproses...');
|
||||
},
|
||||
success: function (response) {
|
||||
// buka modal
|
||||
$.unblockUI();
|
||||
toastr.info("Silahkan Lakukan Verifikasi OTP<br>Kode OTP Telah Terkirim Ke Whatsapp Nomor Telpon Anda");
|
||||
$('#modal-otp').modal('show');
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
console.log(xhr.responseJSON);
|
||||
toastr.error(xhr.responseJSON !== undefined ? xhr.responseJSON : "Terjadi Kesalahan Server");
|
||||
$.unblockUI();
|
||||
// $('#modal-otp').modal('show');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
function verifikasi() {
|
||||
const no_telpon = $("#no_telpon").val();
|
||||
const kode_otp = $("#kode_otp").val();
|
||||
|
||||
if(kode_otp === "") {
|
||||
toastr.error("Kode OTP Harus Diisi");
|
||||
// point to input
|
||||
$("#kode_otp").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
const data = {
|
||||
no_telpon,
|
||||
kode_otp
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/verifikasi",
|
||||
type: "POST",
|
||||
data: JSON.stringify(data),
|
||||
contentType: "application/json",
|
||||
beforeSend: function () {
|
||||
// close modal
|
||||
$('#modal-otp').modal('hide');
|
||||
blockUI('Verifikasi Sedang Diproses...');
|
||||
|
||||
},
|
||||
success: function (response) {
|
||||
$.unblockUI();
|
||||
toastr.success("Verifikasi Berhasil<br>Silahkan Login");
|
||||
// 2 sec the to halaman login
|
||||
setTimeout(() => {
|
||||
window.location.href = "/login";
|
||||
}, 2500);
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
toastr.error(xhr.responseJSON !== undefined ? xhr.responseJSON : "Terjadi Kesalahan Server");
|
||||
$.unblockUI();
|
||||
// 1 sec then show modal
|
||||
setTimeout(() => {
|
||||
$('#modal-otp').modal('show');
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,235 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Shenior Kurir | Halaman Utama</title>
|
||||
|
||||
<!-- Main Styles -->
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- mCustomScrollbar -->
|
||||
<link rel="stylesheet" href="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Sweet Alert -->
|
||||
<link rel="stylesheet" href="/plugin/sweet-alert/sweetalert.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/fontello/fontello.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main-menu">
|
||||
<header class="header">
|
||||
<a href="/admin" class="logo">Shenior Kurir</a>
|
||||
<button type="button" class="button-close fa fa-times js__menu_close"></button>
|
||||
<div class="user">
|
||||
<a href="#" class="avatar"><img src="/images/person.png" alt=""><span class="status online"></span></a>
|
||||
<h5 class="name"><a href="#">Visitor</a></h5>
|
||||
<h5 class="position">Belum Login</h5>
|
||||
|
||||
</div>
|
||||
<!-- /.user -->
|
||||
</header>
|
||||
<!-- /.header -->
|
||||
<div class="content">
|
||||
|
||||
<div class="navigation">
|
||||
<h5 class="title">Navigasi</h5>
|
||||
<!-- /.title -->
|
||||
<ul class="menu js__accordion">
|
||||
<li class="current active">
|
||||
<a class="waves-effect" href="/"><i class="menu-icon fa fa-home"></i><span>Halaman
|
||||
Utama</span></a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/login"><i
|
||||
class="menu-icon ico icon-login"></i><span>Login</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- /.navigation -->
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.main-menu -->
|
||||
|
||||
<div class="fixed-navbar">
|
||||
<div class="pull-left">
|
||||
<button type="button"
|
||||
class="menu-mobile-button glyphicon glyphicon-menu-hamburger js__menu_mobile"></button>
|
||||
<h1 class="page-title">Halaman Utama</h1>
|
||||
<!-- /.page-title -->
|
||||
</div>
|
||||
<!-- /.pull-left -->
|
||||
<div class="pull-right">
|
||||
|
||||
|
||||
<a href="/login" class="ico-item ico icon-login"></a>
|
||||
</div>
|
||||
<!-- /.pull-right -->
|
||||
</div>
|
||||
<!-- /.fixed-navbar -->
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="main-content">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-xs-12">
|
||||
<div class="box-content card">
|
||||
<img src="/images/habibie.jpg" alt="" style="width: 100%; border-radius: 30px;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Kurir</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kurir.png" alt="" style="width: 100%;">
|
||||
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="guru-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah User</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kiriman.png" alt="" style="width: 100%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="murid-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Kiriman</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/kiriman2.png" alt="" style="width: 100%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="staf-counter"></h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">Orang</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
</div>
|
||||
<footer class="footer">
|
||||
<ul class="list-inline">
|
||||
<li>Arifuddin Naawi Amanah © 2025.</li>
|
||||
<!-- <li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Help</a></li> -->
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /.main-content -->
|
||||
</div><!--/#wrapper -->
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/sweet-alert/sweetalert.min.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script src="/socket-io/client-dist/socket.io.js"></script>
|
||||
<script>
|
||||
console.log('hello');
|
||||
const socket = io(); // Connects to your server
|
||||
|
||||
socket.emit('scan_dia', 'Hello from client!');
|
||||
|
||||
socket.on('connect', () => {
|
||||
console.log('Connected to server:', socket.id);
|
||||
});
|
||||
|
||||
socket.on('scan_dia_lagi', (data) => {
|
||||
alert(data);
|
||||
console.log('Received scan_dia_lagi event:', data); // ✅ Make sure you're logging the variable
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,105 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Halaman Login Pengguna</title>
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Toastr -->
|
||||
<link rel="stylesheet" href="/plugin/toastr/toastr.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="single-wrapper">
|
||||
<form action="#" class="frm-single">
|
||||
<div class="inside">
|
||||
<div class="title"><strong>Shenior</strong> Kurir</div>
|
||||
<!-- /.title -->
|
||||
<div class="frm-title">Login Pengguna</div>
|
||||
<!-- /.frm-title -->
|
||||
<div class="frm-input"><input type="text" id="username" placeholder="No Telpon" class="frm-inp"><i class="fa fa-user frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
<div class="frm-input"><input type="password" id="password" placeholder="Password" class="frm-inp"><i class="fa fa-lock frm-ico"></i></div>
|
||||
<!-- /.frm-input -->
|
||||
|
||||
<button type="button" class="frm-submit" onclick="login()">Login<i class="fa fa-arrow-circle-right"></i></button>
|
||||
|
||||
<a href="/daftar" class="a-link"><i class="fa fa-user-plus"></i>Belum Menjadi Pengguna? Mendaftar.</a>
|
||||
<br><br>
|
||||
<a href="/kurir/login" class="a-link"><i class="fa fa-motorcycle"></i>Login Kurir.</a>
|
||||
|
||||
<div class="frm-footer">Arifuddin Naawi Amanah © 2025.</div>
|
||||
<!-- /.footer -->
|
||||
</div>
|
||||
<!-- .inside -->
|
||||
</form>
|
||||
<!-- /.frm-single -->
|
||||
</div><!--/#single-wrapper -->
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
|
||||
<!-- Toastr -->
|
||||
<script src="/plugin/toastr/toastr.min.js"></script>
|
||||
|
||||
<script src="/block/jquery.blockUI.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
<script>
|
||||
function login() {
|
||||
var username = $("#username").val();
|
||||
var password = $("#password").val();
|
||||
|
||||
$.ajax({
|
||||
url: "/login",
|
||||
type: "POST",
|
||||
data: {
|
||||
no_telpon: username,
|
||||
password: password
|
||||
},
|
||||
beforeSend: function () {
|
||||
blockUI('Login Sedang Diproses...');
|
||||
|
||||
},
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
$.unblockUI();
|
||||
toastr.success("Login Berhasil");
|
||||
// create local storage
|
||||
localStorage.setItem('user', JSON.stringify(data));
|
||||
localStorage.setItem('role', 'user');
|
||||
// 2 sec the to halaman login
|
||||
setTimeout(() => {
|
||||
window.location.href = "/user";
|
||||
}, 2500);
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
$.unblockUI();
|
||||
toastr.error(xhr.responseJSON !== undefined ? xhr.responseJSON : "Terjadi Kesalahan Server");
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,33 @@
|
|||
import { Server as HttpServer } from 'http';
|
||||
import { Server as SocketIOServer, Socket } from 'socket.io';
|
||||
import { io as socketClient, Socket as ClientSocket } from 'socket.io-client';
|
||||
import dotenv from 'dotenv';
|
||||
|
||||
dotenv.config();
|
||||
|
||||
const clientSocket: ClientSocket = socketClient(`http://localhost:3011`);
|
||||
|
||||
let io: SocketIOServer | null = null;
|
||||
|
||||
function init(server: HttpServer): SocketIOServer {
|
||||
io = new SocketIOServer(server, {
|
||||
cors: {
|
||||
origin: "*", // ← Make sure this is set
|
||||
methods: ["GET", "POST"]
|
||||
}
|
||||
});
|
||||
return io;
|
||||
}
|
||||
|
||||
function getIO(): SocketIOServer {
|
||||
if (!io) {
|
||||
throw new Error('Socket.io not initialized');
|
||||
}
|
||||
return io;
|
||||
}
|
||||
|
||||
export {
|
||||
init,
|
||||
getIO,
|
||||
clientSocket
|
||||
};
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue