Skip to content
This repository was archived by the owner on Jul 31, 2025. It is now read-only.

Commit d53c183

Browse files
author
v1rtl
committed
replace cookie w/ builtin methods
1 parent 22c7ccb commit d53c183

File tree

12 files changed

+110
-86
lines changed

12 files changed

+110
-86
lines changed

examples/mongodb/index.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { App } from '../../app.ts'
2+
// import { MongoClient, Bson } from 'https://deno.land/x/mongo@v0.21.0/mod.ts'
3+
// import * as dotenv from 'https://deno.land/x/dotenv/mod.ts'
4+
5+
// dotenv.config()
6+
7+
const app = new App()
8+
const port = parseInt(Deno.env.get('PORT') || '') || 3000
9+
10+
// connect to mongodb
11+
/* const client = new MongoClient()
12+
13+
await client.connect(Deno.env.get('DB_URI') || '')
14+
15+
const db = client.database('notes')
16+
const coll = db.collection('notes') */
17+
18+
app.get(async (req, res) => {
19+
const buf: Uint8Array = await Deno.readAll(req.body)
20+
21+
console.log(buf.toString())
22+
23+
res.send('bruh')
24+
})
25+
26+
/* // get all notes
27+
app.get('/notes', async (_, res, next) => {
28+
try {
29+
const r = await coll.find({}).toArray()
30+
res.send(r)
31+
next()
32+
} catch (err) {
33+
next(err)
34+
}
35+
})
36+
37+
// add new note
38+
app.post('/notes', async (req, res, next) => {
39+
try {
40+
41+
42+
if (result?.value) {
43+
const { title, desc } = result.value
44+
const r = await coll.insertOne({ title, desc })
45+
assertStrictEquals(1, r.insertedCount)
46+
res.send(`Note with title of "${title}" has been added`)
47+
} else {
48+
next('No body provided')
49+
}
50+
} catch (err) {
51+
next(err)
52+
}
53+
})
54+
*/
55+
/* // delete note
56+
app.delete('/notes', async (req, res, next) => {
57+
try {
58+
const { id } = req.body
59+
const r = await coll.deleteOne({ _id: new Bson.ObjectId(id) })
60+
assertStrictEquals(1, r)
61+
res.send(`Note with id of ${id} has been deleted`)
62+
} catch (err) {
63+
next(err)
64+
}
65+
})
66+
67+
// update existing note
68+
app.put('/notes', async (req, res, next) => {
69+
try {
70+
const { title, desc, id } = req.body
71+
await coll.findOneAndUpdate(
72+
{ _id: new mongodb.ObjectId(id) },
73+
{ $set: { title, desc } },
74+
{ returnOriginal: false, upsert: true }
75+
)
76+
res.send(`Note with title of ${title} has been updated`)
77+
} catch (err) {
78+
next(err)
79+
}
80+
})
81+
*/
82+
app.listen(port, () => console.log(`Started on http://localhost:${port}`))

extend.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ import {
3333
setVaryHeader,
3434
attachment,
3535
download,
36-
clearCookie,
37-
setCookie
36+
setCookie,
37+
clearCookie
3838
} from './extensions/res/mod.ts'
3939
import { getQueryParams } from './utils/parseUrl.ts'
4040
import { Response, renderTemplate } from './response.ts'
@@ -106,7 +106,7 @@ export const extendMiddleware = <
106106
res.attachment = attachment<Res>(res)
107107

108108
res.cookie = setCookie<Req, Res>(req, res)
109-
res.clearCookie = clearCookie<Req, Res>(req, res)
109+
res.clearCookie = clearCookie<Res>(res)
110110

111111
next?.()
112112
}

extensions/req/accepts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Accepts } from 'https://deno.land/x/accepts/mod.ts'
1+
import { Accepts } from 'https://deno.land/x/accepts@2.1.0/mod.ts'
22
import { Request } from '../../request.ts'
33

44
export const getAccepts = (req: Request) => (...types: string[]) => new Accepts(req.headers).types(types)

extensions/req/headers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Request } from '../../request.ts'
22
import { Response } from '../../response.ts'
33
import parseRange, { Options } from 'https://esm.sh/range-parser'
4-
import fresh from 'https://deno.land/x/fresh/mod.ts'
5-
import { is } from 'https://deno.land/x/type_is/mod.ts'
4+
import fresh from 'https://deno.land/x/fresh@v1.0.0/mod.ts'
5+
import { is } from 'https://deno.land/x/type_is@1.0.2/mod.ts'
66

77
export const getRequestHeader = (req: Request) => (header: string): string | string[] | null => {
88
const lc = header.toLowerCase()

extensions/req/security.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isIP } from 'https://deno.land/x/isIP/mod.ts'
1+
import { isIP } from 'https://deno.land/x/isIP@1.0.0/mod.ts'
22
import { Request } from '../../request.ts'
33
import { compile, proxyaddr, all } from '../../utils/proxyAddr.ts'
44
import { Protocol } from '../../request.ts'

extensions/res/cookie.ts

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,23 @@
11
import { Request as Req } from '../../request.ts'
22
import { Response as Res } from '../../response.ts'
3-
import { append } from './append.ts'
4-
import * as cookie from 'https://esm.sh/@tinyhttp/cookie'
5-
import { sign } from '../../utils/cookieSignature.ts'
3+
import * as cookie from 'https://deno.land/std@0.88.0/http/cookie.ts'
64

7-
export const setCookie = <Request extends Req = Req, Response extends Res = Res>(
8-
req: Request & {
9-
secret?: string | string[]
10-
},
11-
res: Response
12-
) => (
5+
export const setCookie = <Request extends Req = Req, Response extends Res = Res>(req: Request, res: Response) => (
136
name: string,
14-
value: string | Record<string, unknown>,
15-
options: cookie.SerializeOptions &
16-
Partial<{
17-
signed: boolean
18-
}> = {}
7+
value: string,
8+
options?: Omit<cookie.Cookie, 'value' | 'name'>
199
): Response => {
20-
const secret = req.secret as string
21-
22-
const signed = options.signed || false
23-
24-
if (signed && !secret) throw new Error('cookieParser("secret") required for signed cookies')
25-
26-
let val = typeof value === 'object' ? 'j:' + JSON.stringify(value) : String(value)
27-
28-
if (signed) val = 's:' + sign(val, secret)
29-
30-
if (options.maxAge) {
31-
options.expires = new Date(Date.now() + options.maxAge)
32-
options.maxAge /= 1000
33-
}
34-
35-
if (options.path == null) options.path = '/'
36-
37-
append(res)('Set-Cookie', `${cookie.serialize(name, String(val), options)}`)
10+
cookie.setCookie(req, {
11+
value,
12+
name,
13+
...options
14+
})
3815

3916
return res
4017
}
4118

42-
export const clearCookie = <Request extends Req = Req, Response extends Res = Res>(req: Request, res: Response) => (
43-
name: string,
44-
options?: cookie.SerializeOptions
45-
): Response => {
46-
return setCookie<Request, Response>(req, res)(
47-
name,
48-
'',
49-
Object.assign({}, { expires: new Date(1), path: '/' }, options)
50-
)
19+
export const clearCookie = <Response extends Res = Res>(res: Response) => (name: string): Response => {
20+
cookie.deleteCookie(res, name)
21+
22+
return res
5123
}

extensions/res/download.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { contentDisposition } from 'https://esm.sh/@tinyhttp/content-disposition'
22
import { SendFileOptions, sendFile } from './sendFile.ts'
3-
import { resolve, extname } from 'https://deno.land/std/path/mod.ts'
3+
import { resolve, extname } from 'https://deno.land/std@0.88.0/path/mod.ts'
44
import { setContentType, setHeader } from './headers.ts'
55
import { Request as Req } from '../../request.ts'
66
import { Response as Res } from '../../response.ts'

extensions/res/redirect.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { formatResponse } from './format.ts'
33
import { setLocationHeader } from './headers.ts'
44
import { Request as Req } from '../../request.ts'
55
import { Response as Res } from '../../response.ts'
6-
import { status as getStatus } from 'https://deno.land/x/status/status.ts'
6+
import { status as getStatus } from 'https://deno.land/x/status@0.1.0/status.ts'
77
import { escapeHTML } from 'https://esm.sh/es-escape-html'
88

99
export const redirect = <

request.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// deno-lint-ignore-file
2-
import { ServerRequest } from 'https://deno.land/std@0.87.0/http/server.ts'
2+
import { ServerRequest } from 'https://deno.land/std/http/server.ts'
33
import { Ranges } from 'https://esm.sh/range-parser'
44
import { App } from './app.ts'
55
import { Handler, Middleware } from 'https://esm.sh/@tinyhttp/router'

response.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// deno-lint-ignore-file
22

3-
import { Response as ServerResponse } from 'https://deno.land/std@0.87.0/http/server.ts'
3+
import { Response as ServerResponse } from 'https://deno.land/std/http/server.ts'
44
import type { SendFileOptions } from './extensions/res/sendFile.ts'
55
import type { TemplateEngineOptions, App } from './app.ts'
6-
import type { FormatProps } from './extensions/format.ts'
7-
import type { DownloadOptions } from './extensions/download.ts'
6+
import type { FormatProps } from './extensions/res/format.ts'
7+
import type { DownloadOptions } from './extensions/res/download.ts'
88
import { SerializeOptions } from 'https://esm.sh/@tinyhttp/cookie'
99

1010
export const renderTemplate = <O = any, Res extends Response = Response>(res: Res, app: App) => (
@@ -57,6 +57,6 @@ export interface Response<O = any> extends ServerResponse {
5757
value: string | Record<string, unknown>,
5858
options?: SerializeOptions & Partial<{ signed: boolean }>
5959
): Response
60-
clearCookie(name: string, options?: SerializeOptions): Response
60+
clearCookie(name: string): Response
6161
jsonp(obj: any): Response
6262
}

0 commit comments

Comments
 (0)