connect-memcached 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +28 -1
- package/docker-compose.yml +104 -0
- package/flake.lock +61 -0
- package/flake.nix +39 -0
- package/lib/connect-memcached.js +4 -4
- package/package.json +3 -4
- package/test/services/memcached_basic.js +1 -1
- package/test/services/memcached_crypt.js +2 -2
- package/test/services/memcached_preexisting_crypt_connection.js +2 -2
- package/test-all.sh +39 -0
- package/.tool-versions +0 -1
- package/test/.tool-versions +0 -1
package/Readme.md
CHANGED
|
@@ -33,7 +33,7 @@ app.use(
|
|
|
33
33
|
saveUninitialized: false,
|
|
34
34
|
store: new MemcachedStore({
|
|
35
35
|
hosts: ["127.0.0.1:11211"],
|
|
36
|
-
secret: "
|
|
36
|
+
secret: "Xj8$kLp2@Qa9#Zt5!" // Optionally use transparent encryption for memcached session data (must meet complexity requirements)
|
|
37
37
|
})
|
|
38
38
|
})
|
|
39
39
|
);
|
|
@@ -62,6 +62,33 @@ app.listen(9341, function() {
|
|
|
62
62
|
- `hashing` (Optional) Hash algorithm from `crypto.getHashes()`. Default is `sha512`.
|
|
63
63
|
- ... Rest of given options will be passed directly to the [node-memcached](http://github.com/3rd-Eden/node-memcached) and [kruptein](https://github.com/jas-/kruptein) constructors, see their appropriate docs for extra configurability.
|
|
64
64
|
|
|
65
|
+
## Upgrading to v3.x.x
|
|
66
|
+
|
|
67
|
+
v3.0.0 introduces two breaking changes:
|
|
68
|
+
|
|
69
|
+
### 1. Node.js version requirement
|
|
70
|
+
|
|
71
|
+
**Breaking change:** v3.0.0 requires Node.js >= 14.0.0. Support for Node.js versions 4-12 has been dropped.
|
|
72
|
+
|
|
73
|
+
If you're running an older Node.js version, please upgrade to Node.js 14 or later before upgrading to v3.x.x.
|
|
74
|
+
|
|
75
|
+
### 2. Stronger secret requirements for encryption
|
|
76
|
+
|
|
77
|
+
**Breaking change:** The `kruptein` dependency has been updated to enforce stricter password complexity requirements for the `secret` option. If you use encryption (set the `secret` option), your secret must now meet these requirements:
|
|
78
|
+
|
|
79
|
+
- Minimum length: 8 characters
|
|
80
|
+
- Minimum 2 uppercase letters
|
|
81
|
+
- Minimum 2 lowercase letters
|
|
82
|
+
- Minimum 2 numbers
|
|
83
|
+
- Minimum 2 special characters (`!@#$%^&*()_+-=[]{};':"\\|,.<>/?`)
|
|
84
|
+
|
|
85
|
+
**IMPORTANT:** Check if your current secret meets these requirements:
|
|
86
|
+
|
|
87
|
+
- **If your secret already meets the requirements:** You can upgrade safely with no additional action needed.
|
|
88
|
+
- **If your secret does NOT meet the requirements:** You MUST flush all encrypted session data from memcached before upgrading AND update your secret to meet the new requirements. All existing encrypted session data will become inaccessible with the new secret.
|
|
89
|
+
|
|
90
|
+
Sessions without encryption (no `secret` option) are not affected.
|
|
91
|
+
|
|
65
92
|
## Upgrading to v2.x.x
|
|
66
93
|
|
|
67
94
|
When upgrading from pre v2 and using data encryption please flush all the session entries from memcached before rolling the update.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
services:
|
|
2
|
+
memcached:
|
|
3
|
+
image: memcached:1.6-alpine
|
|
4
|
+
ports:
|
|
5
|
+
- "11211:11211"
|
|
6
|
+
command: memcached -m 64
|
|
7
|
+
|
|
8
|
+
test-node-14:
|
|
9
|
+
image: node:14-alpine
|
|
10
|
+
depends_on:
|
|
11
|
+
- memcached
|
|
12
|
+
working_dir: /app
|
|
13
|
+
volumes:
|
|
14
|
+
- .:/app
|
|
15
|
+
environment:
|
|
16
|
+
- NODE_ENV=test
|
|
17
|
+
- MEMCACHED_HOST=memcached:11211
|
|
18
|
+
- NPM_CONFIG_FUND=false
|
|
19
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
20
|
+
command: sh -c "npm install && npm test"
|
|
21
|
+
|
|
22
|
+
test-node-16:
|
|
23
|
+
image: node:16-alpine
|
|
24
|
+
depends_on:
|
|
25
|
+
- memcached
|
|
26
|
+
working_dir: /app
|
|
27
|
+
volumes:
|
|
28
|
+
- .:/app
|
|
29
|
+
environment:
|
|
30
|
+
- NODE_ENV=test
|
|
31
|
+
- MEMCACHED_HOST=memcached:11211
|
|
32
|
+
- NPM_CONFIG_FUND=false
|
|
33
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
34
|
+
command: sh -c "npm install && npm test"
|
|
35
|
+
|
|
36
|
+
test-node-18:
|
|
37
|
+
image: node:18-alpine
|
|
38
|
+
depends_on:
|
|
39
|
+
- memcached
|
|
40
|
+
working_dir: /app
|
|
41
|
+
volumes:
|
|
42
|
+
- .:/app
|
|
43
|
+
environment:
|
|
44
|
+
- NODE_ENV=test
|
|
45
|
+
- MEMCACHED_HOST=memcached:11211
|
|
46
|
+
- NPM_CONFIG_FUND=false
|
|
47
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
48
|
+
command: sh -c "npm install && npm test"
|
|
49
|
+
|
|
50
|
+
test-node-20:
|
|
51
|
+
image: node:20-alpine
|
|
52
|
+
depends_on:
|
|
53
|
+
- memcached
|
|
54
|
+
working_dir: /app
|
|
55
|
+
volumes:
|
|
56
|
+
- .:/app
|
|
57
|
+
environment:
|
|
58
|
+
- NODE_ENV=test
|
|
59
|
+
- MEMCACHED_HOST=memcached:11211
|
|
60
|
+
- NPM_CONFIG_FUND=false
|
|
61
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
62
|
+
command: sh -c "npm install && npm test"
|
|
63
|
+
|
|
64
|
+
test-node-22:
|
|
65
|
+
image: node:22-alpine
|
|
66
|
+
depends_on:
|
|
67
|
+
- memcached
|
|
68
|
+
working_dir: /app
|
|
69
|
+
volumes:
|
|
70
|
+
- .:/app
|
|
71
|
+
environment:
|
|
72
|
+
- NODE_ENV=test
|
|
73
|
+
- MEMCACHED_HOST=memcached:11211
|
|
74
|
+
- NPM_CONFIG_FUND=false
|
|
75
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
76
|
+
command: sh -c "npm install && npm test"
|
|
77
|
+
|
|
78
|
+
test-node-24:
|
|
79
|
+
image: node:24-alpine
|
|
80
|
+
depends_on:
|
|
81
|
+
- memcached
|
|
82
|
+
working_dir: /app
|
|
83
|
+
volumes:
|
|
84
|
+
- .:/app
|
|
85
|
+
environment:
|
|
86
|
+
- NODE_ENV=test
|
|
87
|
+
- MEMCACHED_HOST=memcached:11211
|
|
88
|
+
- NPM_CONFIG_FUND=false
|
|
89
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
90
|
+
command: sh -c "npm install && npm test"
|
|
91
|
+
|
|
92
|
+
test-node-25:
|
|
93
|
+
image: node:25-alpine
|
|
94
|
+
depends_on:
|
|
95
|
+
- memcached
|
|
96
|
+
working_dir: /app
|
|
97
|
+
volumes:
|
|
98
|
+
- .:/app
|
|
99
|
+
environment:
|
|
100
|
+
- NODE_ENV=test
|
|
101
|
+
- MEMCACHED_HOST=memcached:11211
|
|
102
|
+
- NPM_CONFIG_FUND=false
|
|
103
|
+
- NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
104
|
+
command: sh -c "npm install && npm test"
|
package/flake.lock
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"nodes": {
|
|
3
|
+
"flake-utils": {
|
|
4
|
+
"inputs": {
|
|
5
|
+
"systems": "systems"
|
|
6
|
+
},
|
|
7
|
+
"locked": {
|
|
8
|
+
"lastModified": 1731533236,
|
|
9
|
+
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
|
10
|
+
"owner": "numtide",
|
|
11
|
+
"repo": "flake-utils",
|
|
12
|
+
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
|
13
|
+
"type": "github"
|
|
14
|
+
},
|
|
15
|
+
"original": {
|
|
16
|
+
"owner": "numtide",
|
|
17
|
+
"repo": "flake-utils",
|
|
18
|
+
"type": "github"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"nixpkgs": {
|
|
22
|
+
"locked": {
|
|
23
|
+
"lastModified": 1765779637,
|
|
24
|
+
"narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=",
|
|
25
|
+
"owner": "NixOS",
|
|
26
|
+
"repo": "nixpkgs",
|
|
27
|
+
"rev": "1306659b587dc277866c7b69eb97e5f07864d8c4",
|
|
28
|
+
"type": "github"
|
|
29
|
+
},
|
|
30
|
+
"original": {
|
|
31
|
+
"owner": "NixOS",
|
|
32
|
+
"ref": "nixos-unstable",
|
|
33
|
+
"repo": "nixpkgs",
|
|
34
|
+
"type": "github"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"root": {
|
|
38
|
+
"inputs": {
|
|
39
|
+
"flake-utils": "flake-utils",
|
|
40
|
+
"nixpkgs": "nixpkgs"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"systems": {
|
|
44
|
+
"locked": {
|
|
45
|
+
"lastModified": 1681028828,
|
|
46
|
+
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
47
|
+
"owner": "nix-systems",
|
|
48
|
+
"repo": "default",
|
|
49
|
+
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
50
|
+
"type": "github"
|
|
51
|
+
},
|
|
52
|
+
"original": {
|
|
53
|
+
"owner": "nix-systems",
|
|
54
|
+
"repo": "default",
|
|
55
|
+
"type": "github"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"root": "root",
|
|
60
|
+
"version": 7
|
|
61
|
+
}
|
package/flake.nix
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
description = "Memcached session store for Connect";
|
|
3
|
+
|
|
4
|
+
inputs = {
|
|
5
|
+
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
6
|
+
flake-utils.url = "github:numtide/flake-utils";
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
outputs = { self, nixpkgs, flake-utils }:
|
|
10
|
+
flake-utils.lib.eachDefaultSystem (system:
|
|
11
|
+
let
|
|
12
|
+
pkgs = nixpkgs.legacyPackages.${system};
|
|
13
|
+
in
|
|
14
|
+
{
|
|
15
|
+
devShells.default = pkgs.mkShell {
|
|
16
|
+
packages = with pkgs; [
|
|
17
|
+
nodejs
|
|
18
|
+
nodePackages.npm
|
|
19
|
+
memcached
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
shellHook = ''
|
|
23
|
+
echo "connect-memcached development environment"
|
|
24
|
+
echo "Node: $(node --version)"
|
|
25
|
+
echo "npm: $(npm --version)"
|
|
26
|
+
echo ""
|
|
27
|
+
|
|
28
|
+
# Install dependencies if node_modules doesn't exist
|
|
29
|
+
if [ ! -d "node_modules" ]; then
|
|
30
|
+
echo "Installing npm dependencies..."
|
|
31
|
+
npm install
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
echo "Ready! Run 'npm test' to run tests"
|
|
35
|
+
'';
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
package/lib/connect-memcached.js
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
* connect-memcached
|
|
3
3
|
* MIT Licensed
|
|
4
4
|
*/
|
|
5
|
-
const bufferFrom = require('buffer-from');
|
|
6
|
-
|
|
7
5
|
var Memcached = require("memcached");
|
|
8
6
|
var oneDay = 86400;
|
|
9
7
|
|
|
@@ -87,8 +85,9 @@ module.exports = function(session) {
|
|
|
87
85
|
|
|
88
86
|
if (self.secret) {
|
|
89
87
|
self.kruptein.get(self.secret, data, function(err, ct) {
|
|
90
|
-
if (err)
|
|
88
|
+
if (err) {
|
|
91
89
|
return fn(err, {});
|
|
90
|
+
}
|
|
92
91
|
|
|
93
92
|
parseable_string = JSON.parse(ct);
|
|
94
93
|
});
|
|
@@ -121,8 +120,9 @@ module.exports = function(session) {
|
|
|
121
120
|
|
|
122
121
|
if (this.secret) {
|
|
123
122
|
this.kruptein.set(this.secret, sess, function(err, ct) {
|
|
124
|
-
if (err)
|
|
123
|
+
if (err) {
|
|
125
124
|
return fn(err);
|
|
125
|
+
}
|
|
126
126
|
|
|
127
127
|
sess = ct;
|
|
128
128
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "connect-memcached",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Memcached session store for Connect",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"memcached",
|
|
@@ -15,8 +15,7 @@
|
|
|
15
15
|
"url": "https://github.com/balor/connect-memcached"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"
|
|
19
|
-
"kruptein": "3.0.x",
|
|
18
|
+
"kruptein": "3.1.x",
|
|
20
19
|
"memcached": "2.2.x"
|
|
21
20
|
},
|
|
22
21
|
"devDependencies": {
|
|
@@ -35,7 +34,7 @@
|
|
|
35
34
|
]
|
|
36
35
|
},
|
|
37
36
|
"engines": {
|
|
38
|
-
"node": ">= 0.
|
|
37
|
+
"node": ">= 14.0.0"
|
|
39
38
|
},
|
|
40
39
|
"license": "MIT",
|
|
41
40
|
"directories": {
|
|
@@ -4,7 +4,7 @@ const express = require("express"),
|
|
|
4
4
|
MemcachedStore = require("../../lib/connect-memcached")(session);
|
|
5
5
|
|
|
6
6
|
const memcachedStore = new MemcachedStore({
|
|
7
|
-
hosts: ["127.0.0.1:11211"],
|
|
7
|
+
hosts: [process.env.MEMCACHED_HOST || "127.0.0.1:11211"],
|
|
8
8
|
prefix: "testapp_",
|
|
9
9
|
});
|
|
10
10
|
|
|
@@ -4,8 +4,8 @@ const express = require("express"),
|
|
|
4
4
|
MemcachedStore = require("../../lib/connect-memcached")(session);
|
|
5
5
|
|
|
6
6
|
const memcachedStore = new MemcachedStore({
|
|
7
|
-
hosts: ["127.0.0.1:11211"],
|
|
8
|
-
secret: "Hello
|
|
7
|
+
hosts: [process.env.MEMCACHED_HOST || "127.0.0.1:11211"],
|
|
8
|
+
secret: "Hello There Stranger2025!?",
|
|
9
9
|
prefix: "testapp_encrypt_",
|
|
10
10
|
});
|
|
11
11
|
|
|
@@ -4,12 +4,12 @@ const express = require("express"),
|
|
|
4
4
|
Memcached = require("memcached"),
|
|
5
5
|
MemcachedStore = require("../../lib/connect-memcached")(session);
|
|
6
6
|
|
|
7
|
-
const memcachedClient = new Memcached("127.0.0.1:11211");
|
|
7
|
+
const memcachedClient = new Memcached(process.env.MEMCACHED_HOST || "127.0.0.1:11211");
|
|
8
8
|
|
|
9
9
|
const memcachedStore = new MemcachedStore({
|
|
10
10
|
client: memcachedClient,
|
|
11
11
|
prefix: "testapp_encrypt_",
|
|
12
|
-
secret: "Hello
|
|
12
|
+
secret: "Hello There Stranger2025!?",
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
app.use(
|
package/test-all.sh
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
echo "Starting memcached..."
|
|
6
|
+
docker-compose up -d memcached
|
|
7
|
+
sleep 2
|
|
8
|
+
|
|
9
|
+
NODE_VERSIONS=(14 16 18 20 22 24 25)
|
|
10
|
+
FAILED=()
|
|
11
|
+
|
|
12
|
+
for version in "${NODE_VERSIONS[@]}"; do
|
|
13
|
+
echo ""
|
|
14
|
+
echo "========================================="
|
|
15
|
+
echo "Testing with Node $version"
|
|
16
|
+
echo "========================================="
|
|
17
|
+
|
|
18
|
+
if docker-compose run --rm test-node-$version; then
|
|
19
|
+
echo "✓ Node $version: PASSED"
|
|
20
|
+
else
|
|
21
|
+
echo "✗ Node $version: FAILED"
|
|
22
|
+
FAILED+=($version)
|
|
23
|
+
fi
|
|
24
|
+
done
|
|
25
|
+
|
|
26
|
+
echo ""
|
|
27
|
+
echo "========================================="
|
|
28
|
+
echo "Test Summary"
|
|
29
|
+
echo "========================================="
|
|
30
|
+
|
|
31
|
+
if [ ${#FAILED[@]} -eq 0 ]; then
|
|
32
|
+
echo "✓ All Node versions passed!"
|
|
33
|
+
docker-compose down
|
|
34
|
+
exit 0
|
|
35
|
+
else
|
|
36
|
+
echo "✗ Failed Node versions: ${FAILED[*]}"
|
|
37
|
+
docker-compose down
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
package/.tool-versions
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
nodejs 18.2.0
|
package/test/.tool-versions
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
nodejs 17.9.0
|