@fluidframework/tinylicious-driver 2.82.0 → 2.90.0-378676
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/CHANGELOG.md +4 -0
- package/dist/insecureTinyliciousUrlResolver.d.ts +2 -1
- package/dist/insecureTinyliciousUrlResolver.d.ts.map +1 -1
- package/dist/insecureTinyliciousUrlResolver.js +28 -1
- package/dist/insecureTinyliciousUrlResolver.js.map +1 -1
- package/lib/insecureTinyliciousUrlResolver.d.ts +2 -1
- package/lib/insecureTinyliciousUrlResolver.d.ts.map +1 -1
- package/lib/insecureTinyliciousUrlResolver.js +28 -1
- package/lib/insecureTinyliciousUrlResolver.js.map +1 -1
- package/package.json +8 -8
- package/src/insecureTinyliciousUrlResolver.ts +29 -1
- package/api-extractor-lint.json +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -28,7 +28,8 @@ export declare class InsecureTinyliciousUrlResolver implements IUrlResolver {
|
|
|
28
28
|
getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string>;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
* Creates an insecure Tinylicious URL resolver for testing purposes
|
|
31
|
+
* Creates an insecure Tinylicious URL resolver for testing purposes.
|
|
32
|
+
* Automatically detects GitHub Codespaces and uses the appropriate endpoint.
|
|
32
33
|
*/
|
|
33
34
|
export declare function createInsecureTinyliciousTestUrlResolver(): IUrlResolver;
|
|
34
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insecureTinyliciousUrlResolver.d.ts","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,MAAM,6CAA6C,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,8BAA+B,YAAW,YAAY;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAC1B,IAAI,SAAyB,EAAE,QAAQ,SAA6B;IAI1E,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCjD,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;CAYlB;
|
|
1
|
+
{"version":3,"file":"insecureTinyliciousUrlResolver.d.ts","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,MAAM,6CAA6C,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,8BAA+B,YAAW,YAAY;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAC1B,IAAI,SAAyB,EAAE,QAAQ,SAA6B;IAI1E,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCjD,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;CAYlB;AA4BD;;;GAGG;AACH,wBAAgB,wCAAwC,IAAI,YAAY,CAGvE;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,gBAAiB,MAAM,KAAG,QAKtE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,qCAAqC,gBAVa,MAAM,KAAG,QAUc,CAAC"}
|
|
@@ -78,9 +78,36 @@ class InsecureTinyliciousUrlResolver {
|
|
|
78
78
|
exports.InsecureTinyliciousUrlResolver = InsecureTinyliciousUrlResolver;
|
|
79
79
|
/**
|
|
80
80
|
* Creates an insecure Tinylicious URL resolver for testing purposes with localhost port 7070.
|
|
81
|
+
* Detects the appropriate Tinylicious endpoint based on the environment.
|
|
82
|
+
* @returns In GitHub Codespaces, returns the forwarded port URL. Otherwise returns localhost.
|
|
83
|
+
* @remarks If using codespaces, set tinylicious (port 7070) visibility to "public" for this to work.
|
|
84
|
+
*/
|
|
85
|
+
function getTinyliciousEndpoint() {
|
|
86
|
+
if (typeof window !== "undefined") {
|
|
87
|
+
// Detect GitHub Codespaces and use the forwarded port URL
|
|
88
|
+
// <codespace-name>-<fowarded-port>.<domain>
|
|
89
|
+
// e.g. my-codespace-7070.githubpreview.dev
|
|
90
|
+
// Capture Group 1: <codespace-name>
|
|
91
|
+
// Capture Group 2: <domain>
|
|
92
|
+
// reconstruct a hostname that fowards tinlicious's port via HTTPS.
|
|
93
|
+
const match = /^(.+)-\d+\.(.+)$/.exec(window.location.hostname);
|
|
94
|
+
if (match) {
|
|
95
|
+
// In Codespaces, the port is embedded in the hostname, use HTTPS port 443
|
|
96
|
+
return {
|
|
97
|
+
endpoint: `https://${match[1]}-${exports.defaultTinyliciousPort}.${match[2]}`,
|
|
98
|
+
port: 443,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { endpoint: exports.defaultTinyliciousEndpoint, port: exports.defaultTinyliciousPort };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Creates an insecure Tinylicious URL resolver for testing purposes.
|
|
106
|
+
* Automatically detects GitHub Codespaces and uses the appropriate endpoint.
|
|
81
107
|
*/
|
|
82
108
|
function createInsecureTinyliciousTestUrlResolver() {
|
|
83
|
-
|
|
109
|
+
const { endpoint, port } = getTinyliciousEndpoint();
|
|
110
|
+
return new InsecureTinyliciousUrlResolver(port, endpoint);
|
|
84
111
|
}
|
|
85
112
|
exports.createInsecureTinyliciousTestUrlResolver = createInsecureTinyliciousTestUrlResolver;
|
|
86
113
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insecureTinyliciousUrlResolver.js","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,0EAIqD;AAErD;;;GAGG;AACU,QAAA,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;GAGG;AACU,QAAA,0BAA0B,GAAG,kBAAkB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAa,8BAA8B;IAE1C,YAAmB,IAAI,GAAG,8BAAsB,EAAE,QAAQ,GAAG,kCAA0B;QACtF,IAAI,CAAC,mBAAmB,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,qBAAqB,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,eAAuB,CAAC;QAC5B,IAAI,WAAmB,CAAC;QACxB,IAAI,eAAe,GAAW,qBAAqB,CAAC;QAEpD,+DAA+D;QAC/D,sGAAsG;QACtG,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,uBAAY,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YACzE,wEAAwE;YACxE,kFAAkF;YAClF,qGAAqG;YACrG,sBAAsB;YACtB,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;gBAC5B,eAAe,GAAG,KAAK,CAAC;YACzB,CAAC;YACD,eAAe,GAAG,GAAG,IAAI,CAAC,mBAAmB,uBAAuB,eAAe,EAAE,CAAC;YACtF,WAAW,GAAG,GAAG,IAAI,CAAC,mBAAmB,gBAAgB,eAAe,EAAE,CAAC;QAC5E,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,oBAAoB,GAAG,WAAW,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC7E,WAAW,GAAG,GAAG,IAAI,CAAC,mBAAmB,gBAAgB,YAAY,GAAG,oBAAoB,EAAE,CAAC;YAC/F,eAAe,GAAG,GAAG,IAAI,CAAC,mBAAmB,uBAAuB,YAAY,EAAE,CAAC;QACpF,CAAC;QAED,OAAO;YACN,SAAS,EAAE;gBACV,eAAe;gBACf,UAAU,EAAE,IAAI,CAAC,mBAAmB;gBACpC,UAAU,EAAE,GAAG,IAAI,CAAC,mBAAmB,oBAAoB;aAC3D;YACD,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,WAAW;SAChB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,cAAc,CAC1B,WAAyB,EACzB,WAAmB;QAEnB,MAAM,UAAU,GAAG,kBAAkB,CACpC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,eAAe,EAAE,EAAE,CAAC,CACvE,CAAC;QACF;;;;;WAKG;QACH,OAAO,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;IACvC,CAAC;CACD;AA7DD,wEA6DC;AAED
|
|
1
|
+
{"version":3,"file":"insecureTinyliciousUrlResolver.js","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tDriverHeader,\n\ttype IResolvedUrl,\n\ttype IUrlResolver,\n} from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * Default endpoint port. Will be used by the service if the consumer does not specify a port.\n * @internal\n */\nexport const defaultTinyliciousPort = 7070;\n\n/**\n * Default endpoint URL base. Will be used by the service if the consumer does not specify an endpoint.\n * @internal\n */\nexport const defaultTinyliciousEndpoint = \"http://localhost\";\n\n/**\n * InsecureTinyliciousUrlResolver knows how to get the URLs to the service (in this case Tinylicious) to use\n * for a given request. This particular implementation has a goal to avoid imposing requirements on the app's\n * URL shape, so it expects the request url to have this format (as opposed to a more traditional URL):\n * documentId/containerRelativePathing\n * @internal\n */\nexport class InsecureTinyliciousUrlResolver implements IUrlResolver {\n\tprivate readonly tinyliciousEndpoint: string;\n\tpublic constructor(port = defaultTinyliciousPort, endpoint = defaultTinyliciousEndpoint) {\n\t\tthis.tinyliciousEndpoint = `${endpoint}:${port}`;\n\t}\n\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl> {\n\t\tconst relativeUrl = request.url.replace(`${this.tinyliciousEndpoint}/`, \"\");\n\t\tconst documentIdFromRequest = relativeUrl.split(\"/\")[0];\n\n\t\tlet deltaStorageUrl: string;\n\t\tlet documentUrl: string;\n\t\tlet finalDocumentId: string = documentIdFromRequest;\n\n\t\t// Special handling if the request is to create a new container\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- using ?. could change behavior\n\t\tif (request.headers && request.headers[DriverHeader.createNew] === true) {\n\t\t\t// Use the document ID passed by the application via the create request;\n\t\t\t// if none was passed, use the reserved keyword to let the driver generate the ID.\n\t\t\t// TODO: deprecate this capability for tinylicious as the r11s driver will stop using the document ID\n\t\t\t// in create requests.\n\t\t\tif (finalDocumentId === \"\") {\n\t\t\t\tfinalDocumentId = \"new\";\n\t\t\t}\n\t\t\tdeltaStorageUrl = `${this.tinyliciousEndpoint}/deltas/tinylicious/${finalDocumentId}`;\n\t\t\tdocumentUrl = `${this.tinyliciousEndpoint}/tinylicious/${finalDocumentId}`;\n\t\t} else {\n\t\t\tconst encodedDocId = encodeURIComponent(finalDocumentId);\n\t\t\tconst documentRelativePath = relativeUrl.slice(documentIdFromRequest.length);\n\t\t\tdocumentUrl = `${this.tinyliciousEndpoint}/tinylicious/${encodedDocId}${documentRelativePath}`;\n\t\t\tdeltaStorageUrl = `${this.tinyliciousEndpoint}/deltas/tinylicious/${encodedDocId}`;\n\t\t}\n\n\t\treturn {\n\t\t\tendpoints: {\n\t\t\t\tdeltaStorageUrl,\n\t\t\t\tordererUrl: this.tinyliciousEndpoint,\n\t\t\t\tstorageUrl: `${this.tinyliciousEndpoint}/repos/tinylicious`,\n\t\t\t},\n\t\t\tid: finalDocumentId,\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\turl: documentUrl,\n\t\t};\n\t}\n\n\tpublic async getAbsoluteUrl(\n\t\tresolvedUrl: IResolvedUrl,\n\t\trelativeUrl: string,\n\t): Promise<string> {\n\t\tconst documentId = decodeURIComponent(\n\t\t\tresolvedUrl.url.replace(`${this.tinyliciousEndpoint}/tinylicious/`, \"\"),\n\t\t);\n\t\t/*\n\t\t * The detached container flow will ultimately call getAbsoluteUrl() with the resolved.url produced by\n\t\t * resolve(). The container expects getAbsoluteUrl's return value to be a URL that can then be roundtripped\n\t\t * back through resolve() again, and get the same result again. So we'll return a \"URL\" with the same format\n\t\t * described above.\n\t\t */\n\t\treturn `${documentId}/${relativeUrl}`;\n\t}\n}\n\n/**\n * Creates an insecure Tinylicious URL resolver for testing purposes with localhost port 7070.\n * Detects the appropriate Tinylicious endpoint based on the environment.\n * @returns In GitHub Codespaces, returns the forwarded port URL. Otherwise returns localhost.\n * @remarks If using codespaces, set tinylicious (port 7070) visibility to \"public\" for this to work.\n */\nfunction getTinyliciousEndpoint(): { endpoint: string; port: number } {\n\tif (typeof window !== \"undefined\") {\n\t\t// Detect GitHub Codespaces and use the forwarded port URL\n\t\t// <codespace-name>-<fowarded-port>.<domain>\n\t\t// e.g. my-codespace-7070.githubpreview.dev\n\t\t// Capture Group 1: <codespace-name>\n\t\t// Capture Group 2: <domain>\n\t\t// reconstruct a hostname that fowards tinlicious's port via HTTPS.\n\t\tconst match = /^(.+)-\\d+\\.(.+)$/.exec(window.location.hostname);\n\t\tif (match) {\n\t\t\t// In Codespaces, the port is embedded in the hostname, use HTTPS port 443\n\t\t\treturn {\n\t\t\t\tendpoint: `https://${match[1]}-${defaultTinyliciousPort}.${match[2]}`,\n\t\t\t\tport: 443,\n\t\t\t};\n\t\t}\n\t}\n\treturn { endpoint: defaultTinyliciousEndpoint, port: defaultTinyliciousPort };\n}\n\n/**\n * Creates an insecure Tinylicious URL resolver for testing purposes.\n * Automatically detects GitHub Codespaces and uses the appropriate endpoint.\n */\nexport function createInsecureTinyliciousTestUrlResolver(): IUrlResolver {\n\tconst { endpoint, port } = getTinyliciousEndpoint();\n\treturn new InsecureTinyliciousUrlResolver(port, endpoint);\n}\n\n/**\n * Creates a Tinylicious {@link @fluidframework/core-interfaces#IRequest}.\n * @internal\n */\nexport const createTinyliciousCreateNewRequest = (documentId?: string): IRequest => ({\n\turl: documentId ?? \"\",\n\theaders: {\n\t\t[DriverHeader.createNew]: true,\n\t},\n});\n\n/**\n * Creates a Tinylicious {@link @fluidframework/core-interfaces#IRequest} for testing purposes.\n */\nexport const createTinyliciousTestCreateNewRequest = createTinyliciousCreateNewRequest;\n"]}
|
|
@@ -28,7 +28,8 @@ export declare class InsecureTinyliciousUrlResolver implements IUrlResolver {
|
|
|
28
28
|
getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string>;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
* Creates an insecure Tinylicious URL resolver for testing purposes
|
|
31
|
+
* Creates an insecure Tinylicious URL resolver for testing purposes.
|
|
32
|
+
* Automatically detects GitHub Codespaces and uses the appropriate endpoint.
|
|
32
33
|
*/
|
|
33
34
|
export declare function createInsecureTinyliciousTestUrlResolver(): IUrlResolver;
|
|
34
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insecureTinyliciousUrlResolver.d.ts","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,MAAM,6CAA6C,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,8BAA+B,YAAW,YAAY;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAC1B,IAAI,SAAyB,EAAE,QAAQ,SAA6B;IAI1E,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCjD,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;CAYlB;
|
|
1
|
+
{"version":3,"file":"insecureTinyliciousUrlResolver.d.ts","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAEN,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,MAAM,6CAA6C,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D;;;;;;GAMG;AACH,qBAAa,8BAA+B,YAAW,YAAY;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAC1B,IAAI,SAAyB,EAAE,QAAQ,SAA6B;IAI1E,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCjD,cAAc,CAC1B,WAAW,EAAE,YAAY,EACzB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;CAYlB;AA4BD;;;GAGG;AACH,wBAAgB,wCAAwC,IAAI,YAAY,CAGvE;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,gBAAiB,MAAM,KAAG,QAKtE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,qCAAqC,gBAVa,MAAM,KAAG,QAUc,CAAC"}
|
|
@@ -74,9 +74,36 @@ export class InsecureTinyliciousUrlResolver {
|
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Creates an insecure Tinylicious URL resolver for testing purposes with localhost port 7070.
|
|
77
|
+
* Detects the appropriate Tinylicious endpoint based on the environment.
|
|
78
|
+
* @returns In GitHub Codespaces, returns the forwarded port URL. Otherwise returns localhost.
|
|
79
|
+
* @remarks If using codespaces, set tinylicious (port 7070) visibility to "public" for this to work.
|
|
80
|
+
*/
|
|
81
|
+
function getTinyliciousEndpoint() {
|
|
82
|
+
if (typeof window !== "undefined") {
|
|
83
|
+
// Detect GitHub Codespaces and use the forwarded port URL
|
|
84
|
+
// <codespace-name>-<fowarded-port>.<domain>
|
|
85
|
+
// e.g. my-codespace-7070.githubpreview.dev
|
|
86
|
+
// Capture Group 1: <codespace-name>
|
|
87
|
+
// Capture Group 2: <domain>
|
|
88
|
+
// reconstruct a hostname that fowards tinlicious's port via HTTPS.
|
|
89
|
+
const match = /^(.+)-\d+\.(.+)$/.exec(window.location.hostname);
|
|
90
|
+
if (match) {
|
|
91
|
+
// In Codespaces, the port is embedded in the hostname, use HTTPS port 443
|
|
92
|
+
return {
|
|
93
|
+
endpoint: `https://${match[1]}-${defaultTinyliciousPort}.${match[2]}`,
|
|
94
|
+
port: 443,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { endpoint: defaultTinyliciousEndpoint, port: defaultTinyliciousPort };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates an insecure Tinylicious URL resolver for testing purposes.
|
|
102
|
+
* Automatically detects GitHub Codespaces and uses the appropriate endpoint.
|
|
77
103
|
*/
|
|
78
104
|
export function createInsecureTinyliciousTestUrlResolver() {
|
|
79
|
-
|
|
105
|
+
const { endpoint, port } = getTinyliciousEndpoint();
|
|
106
|
+
return new InsecureTinyliciousUrlResolver(port, endpoint);
|
|
80
107
|
}
|
|
81
108
|
/**
|
|
82
109
|
* Creates a Tinylicious {@link @fluidframework/core-interfaces#IRequest}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insecureTinyliciousUrlResolver.js","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,YAAY,GAGZ,MAAM,6CAA6C,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,OAAO,8BAA8B;IAE1C,YAAmB,IAAI,GAAG,sBAAsB,EAAE,QAAQ,GAAG,0BAA0B;QACtF,IAAI,CAAC,mBAAmB,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAiB;QACrC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,qBAAqB,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,eAAuB,CAAC;QAC5B,IAAI,WAAmB,CAAC;QACxB,IAAI,eAAe,GAAW,qBAAqB,CAAC;QAEpD,+DAA+D;QAC/D,sGAAsG;QACtG,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YACzE,wEAAwE;YACxE,kFAAkF;YAClF,qGAAqG;YACrG,sBAAsB;YACtB,IAAI,eAAe,KAAK,EAAE,EAAE,CAAC;gBAC5B,eAAe,GAAG,KAAK,CAAC;YACzB,CAAC;YACD,eAAe,GAAG,GAAG,IAAI,CAAC,mBAAmB,uBAAuB,eAAe,EAAE,CAAC;YACtF,WAAW,GAAG,GAAG,IAAI,CAAC,mBAAmB,gBAAgB,eAAe,EAAE,CAAC;QAC5E,CAAC;aAAM,CAAC;YACP,MAAM,YAAY,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,oBAAoB,GAAG,WAAW,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC7E,WAAW,GAAG,GAAG,IAAI,CAAC,mBAAmB,gBAAgB,YAAY,GAAG,oBAAoB,EAAE,CAAC;YAC/F,eAAe,GAAG,GAAG,IAAI,CAAC,mBAAmB,uBAAuB,YAAY,EAAE,CAAC;QACpF,CAAC;QAED,OAAO;YACN,SAAS,EAAE;gBACV,eAAe;gBACf,UAAU,EAAE,IAAI,CAAC,mBAAmB;gBACpC,UAAU,EAAE,GAAG,IAAI,CAAC,mBAAmB,oBAAoB;aAC3D;YACD,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,WAAW;SAChB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,cAAc,CAC1B,WAAyB,EACzB,WAAmB;QAEnB,MAAM,UAAU,GAAG,kBAAkB,CACpC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,eAAe,EAAE,EAAE,CAAC,CACvE,CAAC;QACF;;;;;WAKG;QACH,OAAO,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;IACvC,CAAC;CACD;AAED
|
|
1
|
+
{"version":3,"file":"insecureTinyliciousUrlResolver.js","sourceRoot":"","sources":["../src/insecureTinyliciousUrlResolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tDriverHeader,\n\ttype IResolvedUrl,\n\ttype IUrlResolver,\n} from \"@fluidframework/driver-definitions/internal\";\n\n/**\n * Default endpoint port. Will be used by the service if the consumer does not specify a port.\n * @internal\n */\nexport const defaultTinyliciousPort = 7070;\n\n/**\n * Default endpoint URL base. Will be used by the service if the consumer does not specify an endpoint.\n * @internal\n */\nexport const defaultTinyliciousEndpoint = \"http://localhost\";\n\n/**\n * InsecureTinyliciousUrlResolver knows how to get the URLs to the service (in this case Tinylicious) to use\n * for a given request. This particular implementation has a goal to avoid imposing requirements on the app's\n * URL shape, so it expects the request url to have this format (as opposed to a more traditional URL):\n * documentId/containerRelativePathing\n * @internal\n */\nexport class InsecureTinyliciousUrlResolver implements IUrlResolver {\n\tprivate readonly tinyliciousEndpoint: string;\n\tpublic constructor(port = defaultTinyliciousPort, endpoint = defaultTinyliciousEndpoint) {\n\t\tthis.tinyliciousEndpoint = `${endpoint}:${port}`;\n\t}\n\n\tpublic async resolve(request: IRequest): Promise<IResolvedUrl> {\n\t\tconst relativeUrl = request.url.replace(`${this.tinyliciousEndpoint}/`, \"\");\n\t\tconst documentIdFromRequest = relativeUrl.split(\"/\")[0];\n\n\t\tlet deltaStorageUrl: string;\n\t\tlet documentUrl: string;\n\t\tlet finalDocumentId: string = documentIdFromRequest;\n\n\t\t// Special handling if the request is to create a new container\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- using ?. could change behavior\n\t\tif (request.headers && request.headers[DriverHeader.createNew] === true) {\n\t\t\t// Use the document ID passed by the application via the create request;\n\t\t\t// if none was passed, use the reserved keyword to let the driver generate the ID.\n\t\t\t// TODO: deprecate this capability for tinylicious as the r11s driver will stop using the document ID\n\t\t\t// in create requests.\n\t\t\tif (finalDocumentId === \"\") {\n\t\t\t\tfinalDocumentId = \"new\";\n\t\t\t}\n\t\t\tdeltaStorageUrl = `${this.tinyliciousEndpoint}/deltas/tinylicious/${finalDocumentId}`;\n\t\t\tdocumentUrl = `${this.tinyliciousEndpoint}/tinylicious/${finalDocumentId}`;\n\t\t} else {\n\t\t\tconst encodedDocId = encodeURIComponent(finalDocumentId);\n\t\t\tconst documentRelativePath = relativeUrl.slice(documentIdFromRequest.length);\n\t\t\tdocumentUrl = `${this.tinyliciousEndpoint}/tinylicious/${encodedDocId}${documentRelativePath}`;\n\t\t\tdeltaStorageUrl = `${this.tinyliciousEndpoint}/deltas/tinylicious/${encodedDocId}`;\n\t\t}\n\n\t\treturn {\n\t\t\tendpoints: {\n\t\t\t\tdeltaStorageUrl,\n\t\t\t\tordererUrl: this.tinyliciousEndpoint,\n\t\t\t\tstorageUrl: `${this.tinyliciousEndpoint}/repos/tinylicious`,\n\t\t\t},\n\t\t\tid: finalDocumentId,\n\t\t\ttokens: {},\n\t\t\ttype: \"fluid\",\n\t\t\turl: documentUrl,\n\t\t};\n\t}\n\n\tpublic async getAbsoluteUrl(\n\t\tresolvedUrl: IResolvedUrl,\n\t\trelativeUrl: string,\n\t): Promise<string> {\n\t\tconst documentId = decodeURIComponent(\n\t\t\tresolvedUrl.url.replace(`${this.tinyliciousEndpoint}/tinylicious/`, \"\"),\n\t\t);\n\t\t/*\n\t\t * The detached container flow will ultimately call getAbsoluteUrl() with the resolved.url produced by\n\t\t * resolve(). The container expects getAbsoluteUrl's return value to be a URL that can then be roundtripped\n\t\t * back through resolve() again, and get the same result again. So we'll return a \"URL\" with the same format\n\t\t * described above.\n\t\t */\n\t\treturn `${documentId}/${relativeUrl}`;\n\t}\n}\n\n/**\n * Creates an insecure Tinylicious URL resolver for testing purposes with localhost port 7070.\n * Detects the appropriate Tinylicious endpoint based on the environment.\n * @returns In GitHub Codespaces, returns the forwarded port URL. Otherwise returns localhost.\n * @remarks If using codespaces, set tinylicious (port 7070) visibility to \"public\" for this to work.\n */\nfunction getTinyliciousEndpoint(): { endpoint: string; port: number } {\n\tif (typeof window !== \"undefined\") {\n\t\t// Detect GitHub Codespaces and use the forwarded port URL\n\t\t// <codespace-name>-<fowarded-port>.<domain>\n\t\t// e.g. my-codespace-7070.githubpreview.dev\n\t\t// Capture Group 1: <codespace-name>\n\t\t// Capture Group 2: <domain>\n\t\t// reconstruct a hostname that fowards tinlicious's port via HTTPS.\n\t\tconst match = /^(.+)-\\d+\\.(.+)$/.exec(window.location.hostname);\n\t\tif (match) {\n\t\t\t// In Codespaces, the port is embedded in the hostname, use HTTPS port 443\n\t\t\treturn {\n\t\t\t\tendpoint: `https://${match[1]}-${defaultTinyliciousPort}.${match[2]}`,\n\t\t\t\tport: 443,\n\t\t\t};\n\t\t}\n\t}\n\treturn { endpoint: defaultTinyliciousEndpoint, port: defaultTinyliciousPort };\n}\n\n/**\n * Creates an insecure Tinylicious URL resolver for testing purposes.\n * Automatically detects GitHub Codespaces and uses the appropriate endpoint.\n */\nexport function createInsecureTinyliciousTestUrlResolver(): IUrlResolver {\n\tconst { endpoint, port } = getTinyliciousEndpoint();\n\treturn new InsecureTinyliciousUrlResolver(port, endpoint);\n}\n\n/**\n * Creates a Tinylicious {@link @fluidframework/core-interfaces#IRequest}.\n * @internal\n */\nexport const createTinyliciousCreateNewRequest = (documentId?: string): IRequest => ({\n\turl: documentId ?? \"\",\n\theaders: {\n\t\t[DriverHeader.createNew]: true,\n\t},\n});\n\n/**\n * Creates a Tinylicious {@link @fluidframework/core-interfaces#IRequest} for testing purposes.\n */\nexport const createTinyliciousTestCreateNewRequest = createTinyliciousCreateNewRequest;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/tinylicious-driver",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.90.0-378676",
|
|
4
4
|
"description": "Driver for tinylicious",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -46,22 +46,22 @@
|
|
|
46
46
|
"main": "lib/index.js",
|
|
47
47
|
"types": "lib/public.d.ts",
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@fluidframework/core-interfaces": "
|
|
50
|
-
"@fluidframework/driver-definitions": "
|
|
51
|
-
"@fluidframework/driver-utils": "
|
|
52
|
-
"@fluidframework/routerlicious-driver": "
|
|
49
|
+
"@fluidframework/core-interfaces": "2.90.0-378676",
|
|
50
|
+
"@fluidframework/driver-definitions": "2.90.0-378676",
|
|
51
|
+
"@fluidframework/driver-utils": "2.90.0-378676",
|
|
52
|
+
"@fluidframework/routerlicious-driver": "2.90.0-378676",
|
|
53
53
|
"jsrsasign": "^11.0.0",
|
|
54
54
|
"uuid": "^11.1.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@arethetypeswrong/cli": "^0.18.2",
|
|
58
58
|
"@biomejs/biome": "~1.9.3",
|
|
59
|
-
"@fluid-internal/mocha-test-setup": "
|
|
59
|
+
"@fluid-internal/mocha-test-setup": "2.90.0-378676",
|
|
60
60
|
"@fluid-tools/build-cli": "^0.63.0",
|
|
61
61
|
"@fluidframework/build-common": "^2.0.3",
|
|
62
62
|
"@fluidframework/build-tools": "^0.63.0",
|
|
63
|
-
"@fluidframework/eslint-config-fluid": "
|
|
64
|
-
"@fluidframework/tinylicious-driver-previous": "npm:@fluidframework/tinylicious-driver@2.
|
|
63
|
+
"@fluidframework/eslint-config-fluid": "2.90.0-378676",
|
|
64
|
+
"@fluidframework/tinylicious-driver-previous": "npm:@fluidframework/tinylicious-driver@2.82.0",
|
|
65
65
|
"@microsoft/api-extractor": "7.52.11",
|
|
66
66
|
"@types/jsrsasign": "^10.5.12",
|
|
67
67
|
"@types/mocha": "^10.0.10",
|
|
@@ -94,9 +94,37 @@ export class InsecureTinyliciousUrlResolver implements IUrlResolver {
|
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
96
|
* Creates an insecure Tinylicious URL resolver for testing purposes with localhost port 7070.
|
|
97
|
+
* Detects the appropriate Tinylicious endpoint based on the environment.
|
|
98
|
+
* @returns In GitHub Codespaces, returns the forwarded port URL. Otherwise returns localhost.
|
|
99
|
+
* @remarks If using codespaces, set tinylicious (port 7070) visibility to "public" for this to work.
|
|
100
|
+
*/
|
|
101
|
+
function getTinyliciousEndpoint(): { endpoint: string; port: number } {
|
|
102
|
+
if (typeof window !== "undefined") {
|
|
103
|
+
// Detect GitHub Codespaces and use the forwarded port URL
|
|
104
|
+
// <codespace-name>-<fowarded-port>.<domain>
|
|
105
|
+
// e.g. my-codespace-7070.githubpreview.dev
|
|
106
|
+
// Capture Group 1: <codespace-name>
|
|
107
|
+
// Capture Group 2: <domain>
|
|
108
|
+
// reconstruct a hostname that fowards tinlicious's port via HTTPS.
|
|
109
|
+
const match = /^(.+)-\d+\.(.+)$/.exec(window.location.hostname);
|
|
110
|
+
if (match) {
|
|
111
|
+
// In Codespaces, the port is embedded in the hostname, use HTTPS port 443
|
|
112
|
+
return {
|
|
113
|
+
endpoint: `https://${match[1]}-${defaultTinyliciousPort}.${match[2]}`,
|
|
114
|
+
port: 443,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { endpoint: defaultTinyliciousEndpoint, port: defaultTinyliciousPort };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Creates an insecure Tinylicious URL resolver for testing purposes.
|
|
123
|
+
* Automatically detects GitHub Codespaces and uses the appropriate endpoint.
|
|
97
124
|
*/
|
|
98
125
|
export function createInsecureTinyliciousTestUrlResolver(): IUrlResolver {
|
|
99
|
-
|
|
126
|
+
const { endpoint, port } = getTinyliciousEndpoint();
|
|
127
|
+
return new InsecureTinyliciousUrlResolver(port, endpoint);
|
|
100
128
|
}
|
|
101
129
|
|
|
102
130
|
/**
|
package/api-extractor-lint.json
DELETED