@devvit/shared-types 0.13.7 → 0.13.8-next-2026-07-07-16-52-11-2d38e4efd.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devvit/shared-types",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.8-next-2026-07-07-16-52-11-2d38e4efd.0",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -32,13 +32,14 @@
|
|
|
32
32
|
},
|
|
33
33
|
"types": "./dist/index.d.ts",
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@devvit/protos": "0.13.
|
|
35
|
+
"@devvit/protos": "0.13.8-next-2026-07-07-16-52-11-2d38e4efd.0",
|
|
36
36
|
"jsonschema": "1.4.1",
|
|
37
|
+
"jwt-decode": "4.0.0",
|
|
37
38
|
"uuid": "14.0.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
|
-
"@devvit/repo-tools": "0.13.
|
|
41
|
-
"@devvit/tsconfig": "0.13.
|
|
41
|
+
"@devvit/repo-tools": "0.13.8-next-2026-07-07-16-52-11-2d38e4efd.0",
|
|
42
|
+
"@devvit/tsconfig": "0.13.8-next-2026-07-07-16-52-11-2d38e4efd.0",
|
|
42
43
|
"@types/node": "20.14.12",
|
|
43
44
|
"@types/redis-mock": "0.17.1",
|
|
44
45
|
"@types/uuid": "9.0.0",
|
|
@@ -51,5 +52,5 @@
|
|
|
51
52
|
"vitest": "4.1.0"
|
|
52
53
|
},
|
|
53
54
|
"source": "./src/index.ts",
|
|
54
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "4eb74d95ef13ee856127c7c8f3b169c05e40f053"
|
|
55
56
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Metadata } from '@devvit/protos/lib/Types.js';
|
|
2
|
+
import type { BaseContext } from '../shared/baseContext.js';
|
|
3
|
+
export declare function BaseContextFromMetadata(meta: Metadata, postId: string | undefined, commentId: string | undefined): BaseContext;
|
|
4
|
+
//# sourceMappingURL=base-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-context.d.ts","sourceRoot":"","sources":["../../src/server/base-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAS5D,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,CA2Cb"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jwtDecode } from 'jwt-decode';
|
|
2
|
+
import { Header } from '../Header.js';
|
|
3
|
+
import { assertNonNull } from '../NonNull.js';
|
|
4
|
+
import { T1, T2, T3, T5 } from '../tid.js';
|
|
5
|
+
export function BaseContextFromMetadata(meta, postId, commentId) {
|
|
6
|
+
const subredditId = meta[Header.Subreddit]?.values[0];
|
|
7
|
+
assertNonNull(subredditId, 'subreddit is missing from Context');
|
|
8
|
+
// 'devvit-post-data' is a JSON string. If set in the header, parse it as
|
|
9
|
+
// DevvitPostData.
|
|
10
|
+
let postData;
|
|
11
|
+
const postDataJson = meta[Header.PostData]?.values[0];
|
|
12
|
+
if (postDataJson) {
|
|
13
|
+
// Hack: assume DevvitPostData is JSON compatible for outdated iOS releases
|
|
14
|
+
// around 2025.39.1.616587.
|
|
15
|
+
postData = JSON.parse(postDataJson).developerData;
|
|
16
|
+
}
|
|
17
|
+
const appSlug = meta[Header.App]?.values[0];
|
|
18
|
+
let signedRequestContext;
|
|
19
|
+
try {
|
|
20
|
+
// TODO - Use the RequestContext to extract other metadata like postData,
|
|
21
|
+
// userId, username, etc.
|
|
22
|
+
signedRequestContext = decodeSignedRequestContext(meta[Header.Context]?.values[0]);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
//
|
|
26
|
+
}
|
|
27
|
+
const loid = signedRequestContext?.user?.devvitLoid ??
|
|
28
|
+
// to-do: stop sending snake_case for some data inconsistently.
|
|
29
|
+
signedRequestContext?.user?.devvit_loid;
|
|
30
|
+
const userId = meta[Header.User]?.values[0];
|
|
31
|
+
return {
|
|
32
|
+
appName: appSlug,
|
|
33
|
+
appSlug,
|
|
34
|
+
appVersion: meta[Header.Version]?.values[0],
|
|
35
|
+
commentId: commentId ? T1(commentId) : undefined,
|
|
36
|
+
loid,
|
|
37
|
+
postData,
|
|
38
|
+
postId: postId ? T3(postId) : undefined,
|
|
39
|
+
snoovatar: meta[Header.UserSnoovatarUrl]?.values[0],
|
|
40
|
+
subredditId: T5(subredditId),
|
|
41
|
+
subredditName: meta[Header.SubredditName]?.values[0],
|
|
42
|
+
userId: userId ? T2(userId) : undefined,
|
|
43
|
+
username: meta[Header.Username]?.values[0],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Decodes the signed request-context JWT. */
|
|
47
|
+
function decodeSignedRequestContext(token) {
|
|
48
|
+
if (!token)
|
|
49
|
+
return;
|
|
50
|
+
try {
|
|
51
|
+
return jwtDecode(token)?.devvit;
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw Error('token decode failure', { cause: err });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-context.test.d.ts","sourceRoot":"","sources":["../../src/server/base-context.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RequestContext, UserContext } from '@devvit/protos/json/devvit/platform/v1/request_context.js';
|
|
2
|
+
export type PartialRequestContext = Partial<Omit<RequestContext, 'user'>> & {
|
|
3
|
+
user?: Partial<UserContext> & {
|
|
4
|
+
devvit_loid?: string;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
export declare function fakeContextJwt(reqCtx: Readonly<PartialRequestContext>): string;
|
|
8
|
+
//# sourceMappingURL=fake-jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-jwt.d.ts","sourceRoot":"","sources":["../../src/test/fake-jwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACZ,MAAM,2DAA2D,CAAC;AAEnE,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GAAG;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD,CAAC;AAEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,MAAM,CAI9E"}
|