NiseLine
NiseLine is inspired by LocalStack. Goal of this tool is to create a mock service for LINE.
Getting Started
Launch NiseLine server by Docker image.
docker run -d -p 3000:3000 dyoshikawa/niseline:latest
And install NiseLiff SDK.
npm i @niseline/niseliff
Use NiseLiff SDK in your client app!
import { buildNiseliff } from '@niseline/niseliff'
import React from 'react'
import ReactDOM from 'react-dom'
const liff = buildNiseliff({
liffId: 'DUMMY_LIFF_ID',
})
liff
.init({
liffId: 'DUMMY_LIFF_ID',
})
.then(() => {
ReactDOM.render(
<React.StrictMode>Your client app</React.StrictMode>,
document.getElementById('root')
)
})
NiseLiff SDK
Setup
Install @niseline/niseliff.
npm i @niseline/niseliff
Usage
With npm package of LIFF SDK
You can use with npm package of LIFF SDK. Switch between the real LIFF SDK and the NiseLiff SDK for each environment. In this example, the NiseLiff SDK is used only in the local environment.
// /path/to/config.ts
export const env: 'local' | 'development' | 'staging' | 'production' = 'local'
// /path/to/liff.ts
import * as config from '/path/to/config'
import realLiff, { Liff } from '@line/liff'
import { buildNiseliff } from '@niseline/niseliff'
const liff =
config.env === 'local' ? buildNiseliff({ liffId: 'DUMMY_LIFF_ID' }) : realLiff
export default liff
// /path/to/index.tsx
import liff from '/path/to/liff'
import React from 'react'
import ReactDOM from 'react-dom'
liff.init({ liffId: 'DUMMY_LIFF_ID' }).then(() => {
ReactDOM.render(
<React.StrictMode>Your client app</React.StrictMode>,
document.getElementById('root')
)
})
With CDN of LIFF SDK
You can also use with CDN of LIFF SDK. If you use typescript, it is recommended that you install the @line/liff package. The actual runtime is a CDN, but the type definitions are available from the npm package.
// /path/to/config.ts
export const env: 'local' | 'development' | 'staging' | 'production' = 'local'
// /path/to/index.tsx
import * as config from '/path/to/config'
import { Liff } from '@line/liff'
import { buildNiseliff } from '@niseline/niseliff'
import React from 'react'
import ReactDOM from 'react-dom'
declare global {
var liff: Liff
}
if (config.env === 'local') {
window.liff = buildNiseliff({
liffId: 'DUMMY_LIFF_ID',
})
}
window.liff
.init({
liffId: 'DUMMY_LIFF_ID',
})
.then(() => {
ReactDOM.render(
<React.StrictMode>Your client app</React.StrictMode>,
document.getElementById('root')
)
})
Features
- [x] Ready
- [x] Id
- [x] Initialize liff app
- [x] Get os
- [x] Get language
- [x] Get version
- [x] Get line version
- [x] Is in client
- [x] Is logged in
- [x] Is api available
- [x] Login
- [x] Logout
- [x] Get access token
- [x] Get ID token
- [x] Get decoded ID token
- [x] Get context
- [x] Get profile
- [x] Get friendship
- [x] Permission query
- [x] Permission request all
- [x] Permanent link create url by
- [x] Permanent link create url
- [x] Permanent link set extra query param
- [x] Send messages
- [x] Open window
- [x] Share target picker
- [x] Scan code v2
- [x] Scan code
- [x] Close window
- [x] Init plugins
- [ ] Bluetooth get availability
- [ ] Bluetooth request device
- [ ] Bluetooth referring device
NiseLine Server
Setup
Pull and run dyoshikawa/niseline.
Docker
docker run -d -p 3000:3000 dyoshikawa/niseline:latest
curl http://localhost:3000/niseline/api/ping
# => {"ping":"pong"}
Docker Compose
# docker-compose.yml
version: '3'
services:
niseline:
image: dyoshikawa/niseline:latest
ports:
- 3000:3000
docker compose up -d
curl http://localhost:3000/niseline/api/ping
# => {"ping":"pong"}
Usage
curl --request POST \
--url http://localhost:3000/niseline/api/users \
--header 'content-type: application/json' \
--data '{"id": "FOO_ID","name": "Foo","picture": "http://example.com/foo.jpg","email": "foo@example.com"}'
# => null
curl -v -X POST 'http://localhost:3000/oauth2/v2.1/verify' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'id_token=FOO_ID' \
--data-urlencode 'client_id=1234567890'
# => {"iss":"https://example.com","sub":"FOO_ID","aud":"1234567890","exp":1504169092,"iat":1504263657,"nonce":"0987654asdf","amr":["pwd"],"name":"Foo","picture":"http://example.com/foo.jpg","email":"foo@example.com"}
Features
Login API
- [ ] Issue access token
- [x] Verify access token
- [ ] Refresh access token
- [ ] Revoke access token
- [x] Verify ID token
- [x] Get user profile
- [x] Get friendship status
Messaging API
- [x] Send reply message
- [x] Send push message
- [ ] Send multicast message
- [ ] Send narrowcast message
- [ ] Get narrowcast progress status
- [ ] Send broadcast message
- [ ] Get content
- [ ] Get quota
- [ ] Get consumption
- [ ] Get number of reply messages
- [ ] Get number of push messages
- [ ] Get number of multicast messages
- [ ] Get number of broadcast messages
- [ ] Retry api request